From a605243709c667accc24002417bc2fc2d898f9f1 Mon Sep 17 00:00:00 2001 From: Raidho Date: Sun, 23 Oct 2016 21:09:13 +0300 Subject: [PATCH] made decode() always return new SoundData --HG-- branch : minor-manual-decoders --- src/modules/sound/Sound.cpp | 4 ++++ src/modules/sound/Sound.h | 12 ++++++++++++ src/modules/sound/wrap_Decoder.cpp | 30 +++++++----------------------- 3 files changed, 23 insertions(+), 23 deletions(-) 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 56ac44a63..97bb31f61 100644 --- a/src/modules/sound/wrap_Decoder.cpp +++ b/src/modules/sound/wrap_Decoder.cpp @@ -65,35 +65,19 @@ int w_Decoder_getDuration(lua_State *L) int w_Decoder_decode(lua_State *L) { Decoder *t = luax_checkdecoder(L, 1); - SoundData *s = nullptr; - if (luax_istype(L, 2, SOUND_SOUND_DATA_ID)) - { - s = luax_totype(L, 2, SOUND_SOUND_DATA_ID); - if (s->getSampleRate() != t->getSampleRate() || - s->getBitDepth() != t->getBitDepth() || - s->getChannels() != t->getChannels() ) - return luaL_error(L, "SoundData sound format doesn't match Decoder sound format."); - s->retain(); - } - else if (lua_gettop(L) > 1) - luax_typerror(L, 2, "SoundData" ); - else - luax_catchexcept(L, [&](){ - s = instance()->newSoundData(t->getSize() / (t->getBitDepth() / 8 * t->getChannels()), t->getSampleRate(), t->getBitDepth(), t->getChannels()); - }); int decoded = t->decode(); if (decoded > 0) - { - luax_catchexcept(L, [&](){ - s->load(decoded / (t->getBitDepth() / 8 * t->getChannels()), t->getSampleRate(), t->getBitDepth(), t->getChannels(), t->getBuffer()); - }); + 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); - - s->release(); return 1; }