diff --git a/src/modules/sound/Sound.cpp b/src/modules/sound/Sound.cpp index 81c95994c..38417aeb4 100644 --- a/src/modules/sound/Sound.cpp +++ b/src/modules/sound/Sound.cpp @@ -39,6 +39,10 @@ SoundData *Sound::newSoundData(int samples, int sampleRate, int bitDepth, int ch return new SoundData(samples, sampleRate, bitDepth, channels); } +SoundData *Sound::newSoundData(void *data, int samples, int sampleRate, int bitDepth, int channels) +{ + return new SoundData(data, samples, sampleRate, bitDepth, channels); +} } // sound } // love diff --git a/src/modules/sound/Sound.h b/src/modules/sound/Sound.h index 094fb8f1e..cd53ccfe5 100644 --- a/src/modules/sound/Sound.h +++ b/src/modules/sound/Sound.h @@ -66,6 +66,18 @@ public: **/ SoundData *newSoundData(int samples, int sampleRate, int bitDepth, int channels); + /** + * Creates a new SoundData with the specified number of samples and format + * and loads data from specified buffer. + * @param data Buffer to load data from. + * @param samples The number of samples. + * @param sampleRate Number of samples per second. + * @param bitDepth Bits per sample (8 or 16). + * @param channels Either 1 for mono, or 2 for stereo. + * @return A new SoundData object, or zero in case of errors. + **/ + SoundData *newSoundData(void *data, int samples, int sampleRate, int bitDepth, int channels); + /** * Attempts to find a decoder for the encoded sound data in the * specified file. diff --git a/src/modules/sound/wrap_Decoder.cpp b/src/modules/sound/wrap_Decoder.cpp index 1787890d4..97bb31f61 100644 --- a/src/modules/sound/wrap_Decoder.cpp +++ b/src/modules/sound/wrap_Decoder.cpp @@ -19,6 +19,10 @@ **/ #include "wrap_Decoder.h" +#include "SoundData.h" +#include "Sound.h" + +#define instance() (Module::getInstance(Module::M_SOUND)) namespace love { @@ -58,12 +62,46 @@ int w_Decoder_getDuration(lua_State *L) return 1; } +int w_Decoder_decode(lua_State *L) +{ + Decoder *t = luax_checkdecoder(L, 1); + + int decoded = t->decode(); + if (decoded > 0) + luax_catchexcept(L, [&](){ + SoundData *s = instance()->newSoundData(t->getBuffer(), + decoded / (t->getBitDepth() / 8 * t->getChannels()), + t->getSampleRate(), t->getBitDepth(), t->getChannels()); + + luax_pushtype(L, SOUND_SOUND_DATA_ID, s); + s->release(); + }); + else + lua_pushnil(L); + return 1; +} + +int w_Decoder_seek(lua_State *L) +{ + Decoder *t = luax_checkdecoder(L, 1); + float offset = luaL_checknumber(L, 2); + if (offset < 0) + return luaL_argerror(L, 2, "can't seek to a negative position"); + else if (offset == 0) + t->rewind(); + else + t->seek(offset); + return 0; +} + static const luaL_Reg w_Decoder_functions[] = { { "getChannels", w_Decoder_getChannels }, { "getBitDepth", w_Decoder_getBitDepth }, { "getSampleRate", w_Decoder_getSampleRate }, { "getDuration", w_Decoder_getDuration }, + { "decode", w_Decoder_decode }, + { "seek", w_Decoder_seek }, { 0, 0 } };