diff --git a/src/modules/audio/Source.h b/src/modules/audio/Source.h index ea88eae93..b180aafb6 100644 --- a/src/modules/audio/Source.h +++ b/src/modules/audio/Source.h @@ -80,6 +80,9 @@ public: virtual void setDirection(float *v) = 0; virtual void getDirection(float *v) const = 0; + virtual void setRelativePosition(bool relative) = 0; + virtual bool hasRelativePosition() const = 0; + virtual void setLooping(bool looping) = 0; virtual bool isLooping() const = 0; virtual bool isStatic() const = 0; diff --git a/src/modules/audio/null/Source.cpp b/src/modules/audio/null/Source.cpp index 1fc1519aa..38d72ae71 100644 --- a/src/modules/audio/null/Source.cpp +++ b/src/modules/audio/null/Source.cpp @@ -135,6 +135,16 @@ void Source::getDirection(float *) const { } +void Source::setRelativePosition(bool relative) +{ + relativePosition = relative; +} + +bool Source::hasRelativePosition() const +{ + return relativePosition; +} + void Source::setLooping(bool looping) { this->looping = looping; diff --git a/src/modules/audio/null/Source.h b/src/modules/audio/null/Source.h index e79a37d74..263ee48a9 100644 --- a/src/modules/audio/null/Source.h +++ b/src/modules/audio/null/Source.h @@ -60,6 +60,8 @@ public: virtual void getVelocity(float *v) const; virtual void setDirection(float *v); virtual void getDirection(float *v) const; + virtual void setRelativePosition(bool relative); + virtual bool hasRelativePosition() const; void setLooping(bool looping); bool isLooping() const; bool isStatic() const; @@ -78,6 +80,7 @@ private: float pitch; float volume; + bool relativePosition; bool looping; float minVolume; float maxVolume; diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 061b2ffd2..0b0588288 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -39,6 +39,7 @@ Source::Source(Pool *pool, love::sound::SoundData *soundData) , valid(false) , pitch(1.0f) , volume(1.0f) + , relativePosition(false) , looping(false) , paused(false) , minVolume(0.0f) @@ -68,6 +69,7 @@ Source::Source(Pool *pool, love::sound::Decoder *decoder) , valid(false) , pitch(1.0f) , volume(1.0f) + , relativePosition(false) , looping(false) , paused(false) , minVolume(0.0f) @@ -402,6 +404,19 @@ void Source::getDirection(float *v) const setFloatv(v, direction); } +void Source::setRelativePosition(bool relative) +{ + if (valid) + alSourcei(source, AL_SOURCE_RELATIVE, relative ? AL_TRUE : AL_FALSE); + + relativePosition = relative; +} + +bool Source::hasRelativePosition() const +{ + return relativePosition; +} + void Source::setLooping(bool looping) { if (valid && type == TYPE_STATIC) @@ -535,6 +550,7 @@ void Source::reset() alSourcef(source, AL_ROLLOFF_FACTOR, rolloffFactor); alSourcef(source, AL_MAX_DISTANCE, maxDistance); alSourcei(source, AL_LOOPING, isStatic() && isLooping() ? AL_TRUE : AL_FALSE); + alSourcei(source, AL_SOURCE_RELATIVE, relativePosition ? AL_TRUE : AL_FALSE); } void Source::setFloatv(float *dst, const float *src) const diff --git a/src/modules/audio/openal/Source.h b/src/modules/audio/openal/Source.h index 5e502ac3b..cf06ad5cb 100644 --- a/src/modules/audio/openal/Source.h +++ b/src/modules/audio/openal/Source.h @@ -78,6 +78,8 @@ public: virtual void getVelocity(float *v) const; virtual void setDirection(float *v); virtual void getDirection(float *v) const; + virtual void setRelativePosition(bool relative); + virtual bool hasRelativePosition() const; void setLooping(bool looping); bool isLooping() const; bool isStatic() const; @@ -126,6 +128,7 @@ private: float position[3]; float velocity[3]; float direction[3]; + bool relativePosition; bool looping; bool paused; float minVolume; diff --git a/src/modules/audio/wrap_Source.cpp b/src/modules/audio/wrap_Source.cpp index f28c840a5..fce38105d 100644 --- a/src/modules/audio/wrap_Source.cpp +++ b/src/modules/audio/wrap_Source.cpp @@ -190,6 +190,20 @@ int w_Source_getDirection(lua_State *L) return 3; } +int w_Source_setRelativePosition(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + t->setRelativePosition(luax_toboolean(L, 2)); + return 0; +} + +int w_Source_hasRelativePosition(lua_State *L) +{ + Source *t = luax_checksource(L, 1); + luax_pushboolean(L, t->hasRelativePosition()); + return 1; +} + int w_Source_setLooping(lua_State *L) { Source *t = luax_checksource(L, 1); @@ -323,6 +337,9 @@ static const luaL_Reg functions[] = { "setDirection", w_Source_setDirection }, { "getDirection", w_Source_getDirection }, + { "setRelativePosition", w_Source_setRelativePosition }, + { "hasRelativePosition", w_Source_hasRelativePosition }, + { "setLooping", w_Source_setLooping }, { "isLooping", w_Source_isLooping }, { "isStopped", w_Source_isStopped }, diff --git a/src/modules/audio/wrap_Source.h b/src/modules/audio/wrap_Source.h index f0f27f140..5e715e0ac 100644 --- a/src/modules/audio/wrap_Source.h +++ b/src/modules/audio/wrap_Source.h @@ -47,6 +47,8 @@ int w_Source_setVelocity(lua_State *L); int w_Source_getVelocity(lua_State *L); int w_Source_setDirection(lua_State *L); int w_Source_getDirection(lua_State *L); +int w_Source_setRelativePosition(lua_State *L); +int w_Source_hasRelativePosition(lua_State *L); int w_Source_setLooping(lua_State *L); int w_Source_isLooping(lua_State *L); int w_Source_isStopped(lua_State *L);