Browse Source

Merged in rcoaxil/love-patches/minor-manual-decoders (pull request #67)

decoder manual decoding and seeking implemented

--HG--
branch : minor
Alex Szpakowski 8 years ago
parent
commit
8e1482dbd9
3 changed files with 54 additions and 0 deletions
  1. 4 0
      src/modules/sound/Sound.cpp
  2. 12 0
      src/modules/sound/Sound.h
  3. 38 0
      src/modules/sound/wrap_Decoder.cpp

+ 4 - 0
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);
 	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
 } // sound
 } // love
 } // love

+ 12 - 0
src/modules/sound/Sound.h

@@ -66,6 +66,18 @@ public:
 	 **/
 	 **/
 	SoundData *newSoundData(int samples, int sampleRate, int bitDepth, int channels);
 	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
 	 * Attempts to find a decoder for the encoded sound data in the
 	 * specified file.
 	 * specified file.

+ 38 - 0
src/modules/sound/wrap_Decoder.cpp

@@ -19,6 +19,10 @@
  **/
  **/
 
 
 #include "wrap_Decoder.h"
 #include "wrap_Decoder.h"
+#include "SoundData.h"
+#include "Sound.h"
+
+#define instance() (Module::getInstance<Sound>(Module::M_SOUND))
 
 
 namespace love
 namespace love
 {
 {
@@ -58,12 +62,46 @@ int w_Decoder_getDuration(lua_State *L)
 	return 1;
 	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[] =
 static const luaL_Reg w_Decoder_functions[] =
 {
 {
 	{ "getChannels", w_Decoder_getChannels },
 	{ "getChannels", w_Decoder_getChannels },
 	{ "getBitDepth", w_Decoder_getBitDepth },
 	{ "getBitDepth", w_Decoder_getBitDepth },
 	{ "getSampleRate", w_Decoder_getSampleRate },
 	{ "getSampleRate", w_Decoder_getSampleRate },
 	{ "getDuration", w_Decoder_getDuration },
 	{ "getDuration", w_Decoder_getDuration },
+	{ "decode", w_Decoder_decode },
+	{ "seek", w_Decoder_seek },
 	{ 0, 0 }
 	{ 0, 0 }
 };
 };