|
@@ -19,6 +19,10 @@
|
|
|
**/
|
|
|
|
|
|
#include "wrap_Decoder.h"
|
|
|
+#include "SoundData.h"
|
|
|
+#include "Sound.h"
|
|
|
+
|
|
|
+#define instance() (Module::getInstance<Sound>(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 }
|
|
|
};
|
|
|
|