From 8de949997968ff0035dab67f97c0f35630ed5e71 Mon Sep 17 00:00:00 2001 From: Bill Meltsner Date: Sat, 19 Mar 2011 20:21:40 -0500 Subject: [PATCH] added Source:seek/tell --HG-- branch : minor --- src/modules/audio/Source.cpp | 18 +++++++++++++++ src/modules/audio/Source.h | 14 ++++++++++++ src/modules/audio/null/Source.cpp | 9 ++++++++ src/modules/audio/null/Source.h | 2 ++ src/modules/audio/openal/Source.cpp | 35 +++++++++++++++++++++++++++++ src/modules/audio/openal/Source.h | 2 ++ src/modules/audio/wrap_Source.cpp | 23 +++++++++++++++++++ src/modules/audio/wrap_Source.h | 2 ++ 8 files changed, 105 insertions(+) diff --git a/src/modules/audio/Source.cpp b/src/modules/audio/Source.cpp index 363e4b998..34bac0785 100644 --- a/src/modules/audio/Source.cpp +++ b/src/modules/audio/Source.cpp @@ -42,6 +42,16 @@ namespace audio { return types.find(in, out); } + + bool Source::getConstant(const char * in, Unit & out) + { + return units.find(in, out); + } + + bool Source::getConstant(Unit in, const char *& out) + { + return units.find(in, out); + } StringMap::Entry Source::typeEntries[] = { @@ -50,6 +60,14 @@ namespace audio }; StringMap Source::types(Source::typeEntries, sizeof(Source::typeEntries)); + + StringMap::Entry Source::unitEntries[] = + { + {"seconds", Source::UNIT_SECONDS}, + {"samples", Source::UNIT_SAMPLES}, + }; + + StringMap Source::units(Source::unitEntries, sizeof(Source::unitEntries)); } // audio } // love diff --git a/src/modules/audio/Source.h b/src/modules/audio/Source.h index 9d022337e..d9c803992 100644 --- a/src/modules/audio/Source.h +++ b/src/modules/audio/Source.h @@ -39,6 +39,13 @@ namespace audio TYPE_STREAM, TYPE_MAX_ENUM }; // Type + + enum Unit + { + UNIT_SECONDS = 1, + UNIT_SAMPLES, + UNIT_MAX_ENUM + }; protected: Type type; @@ -64,6 +71,9 @@ namespace audio virtual void setVolume(float volume) = 0; virtual float getVolume() const = 0; + + virtual void seek(float offset, Unit unit) = 0; + virtual float tell(Unit unit) const = 0; // all float * v must be of size 3 virtual void setPosition(float * v) = 0; @@ -79,11 +89,15 @@ namespace audio static bool getConstant(const char * in, Type & out); static bool getConstant(Type in, const char *& out); + static bool getConstant(const char * in, Unit & out); + static bool getConstant(Unit in, const char *& out); private: static StringMap::Entry typeEntries[]; static StringMap types; + static StringMap::Entry unitEntries[]; + static StringMap units; }; // Source diff --git a/src/modules/audio/null/Source.cpp b/src/modules/audio/null/Source.cpp index c38281d84..96c14ac2c 100644 --- a/src/modules/audio/null/Source.cpp +++ b/src/modules/audio/null/Source.cpp @@ -100,6 +100,15 @@ namespace null { return volume; } + + void Source::seek(float, Source::Unit) + { + } + + float Source::tell(Source::Unit) const + { + return 0.0f; + } void Source::setPosition(float *) { diff --git a/src/modules/audio/null/Source.h b/src/modules/audio/null/Source.h index a1be54a7e..0459301c1 100644 --- a/src/modules/audio/null/Source.h +++ b/src/modules/audio/null/Source.h @@ -57,6 +57,8 @@ namespace null virtual float getPitch() const; virtual void setVolume(float volume); virtual float getVolume() const; + virtual void seek(float offset, Unit unit); + virtual float tell(Unit unit) const; virtual void setPosition(float * v); virtual void getPosition(float * v) const; virtual void setVelocity(float * v); diff --git a/src/modules/audio/openal/Source.cpp b/src/modules/audio/openal/Source.cpp index 9392fbaac..c3b327119 100644 --- a/src/modules/audio/openal/Source.cpp +++ b/src/modules/audio/openal/Source.cpp @@ -200,6 +200,41 @@ namespace openal // In case the Source isn't playing. return volume; } + + void Source::seek(float offset, Source::Unit unit) + { + if (valid) + { + switch (unit) { + case Source::UNIT_SAMPLES: + alSourcef(source, AL_SAMPLE_OFFSET, offset); + break; + case Source::UNIT_SECONDS: + default: + alSourcef(source, AL_SEC_OFFSET, offset); + break; + } + } + } + + float Source::tell(Source::Unit unit) const + { + if (valid) + { + ALfloat offset; + switch (unit) { + case Source::UNIT_SAMPLES: + alGetSourcef(source, AL_SAMPLE_OFFSET, &offset); + break; + case Source::UNIT_SECONDS: + default: + alGetSourcef(source, AL_SEC_OFFSET, &offset); + break; + } + return offset; + } + return 0.0f; + } void Source::setPosition(float * v) { diff --git a/src/modules/audio/openal/Source.h b/src/modules/audio/openal/Source.h index ba7c14d41..ea9191147 100644 --- a/src/modules/audio/openal/Source.h +++ b/src/modules/audio/openal/Source.h @@ -84,6 +84,8 @@ namespace openal virtual float getPitch() const; virtual void setVolume(float volume); virtual float getVolume() const; + virtual void seek(float offset, Unit unit); + virtual float tell(Unit unit) const; virtual void setPosition(float * v); virtual void getPosition(float * v) const; virtual void setVelocity(float * v); diff --git a/src/modules/audio/wrap_Source.cpp b/src/modules/audio/wrap_Source.cpp index bc55ad7ed..e305ccead 100644 --- a/src/modules/audio/wrap_Source.cpp +++ b/src/modules/audio/wrap_Source.cpp @@ -93,6 +93,27 @@ namespace audio lua_pushnumber(L, t->getVolume()); return 1; } + + int w_Source_seek(lua_State * L) + { + Source * t = luax_checksource(L, 1); + float offset = (float)luaL_checknumber(L, 2); + const char * unit = luaL_optstring(L, 3, "seconds"); + Source::Unit u; + t->getConstant(unit, u); + t->seek(offset, u); + return 0; + } + + int w_Source_tell(lua_State * L) + { + Source * t = luax_checksource(L, 1); + const char * unit = luaL_optstring(L, 2, "seconds"); + Source::Unit u; + t->getConstant(unit, u); + lua_pushnumber(L, t->tell(u)); + return 1; + } int w_Source_setPosition(lua_State * L) { @@ -206,6 +227,8 @@ namespace audio { "getPitch", w_Source_getPitch }, { "setVolume", w_Source_setVolume }, { "getVolume", w_Source_getVolume }, + { "seek", w_Source_seek }, + { "tell", w_Source_tell }, { "setPosition", w_Source_setPosition }, { "getPosition", w_Source_getPosition }, { "setVelocity", w_Source_setVelocity }, diff --git a/src/modules/audio/wrap_Source.h b/src/modules/audio/wrap_Source.h index 8167e4850..fad0026f7 100644 --- a/src/modules/audio/wrap_Source.h +++ b/src/modules/audio/wrap_Source.h @@ -38,6 +38,8 @@ namespace audio int w_Source_getPitch(lua_State * L); int w_Source_setVolume(lua_State * L); int w_Source_getVolume(lua_State * L); + int w_Source_seek(lua_State * L); + int w_Source_tell(lua_State * L); int w_Source_setPosition(lua_State * L); int w_Source_getPosition(lua_State * L); int w_Source_setVelocity(lua_State * L);