diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libjin/audio/sdl/audio.cpp | 4 | ||||
-rw-r--r-- | src/libjin/audio/sdl/audio.h | 2 | ||||
-rw-r--r-- | src/libjin/audio/sdl/source.cpp | 20 |
3 files changed, 16 insertions, 10 deletions
diff --git a/src/libjin/audio/sdl/audio.cpp b/src/libjin/audio/sdl/audio.cpp index d753587..5277a3d 100644 --- a/src/libjin/audio/sdl/audio.cpp +++ b/src/libjin/audio/sdl/audio.cpp @@ -6,11 +6,13 @@ namespace jin namespace audio { - static void defaultCallback(void *userdata, Uint8 *stream, int size) + void SDLAudio::defaultCallback(void *userdata, Uint8 *stream, int size) { SDLAudio* audio = (SDLAudio*)userdata; + SDL_LockAudioDevice(audio->audioDevice); audio->processCommands(); audio->processSources(stream, size); + SDL_UnlockAudioDevice(audio->audioDevice); } onlyonce bool SDLAudio::_init(const SettingBase* s) diff --git a/src/libjin/audio/sdl/audio.h b/src/libjin/audio/sdl/audio.h index 53d0d76..28b73f0 100644 --- a/src/libjin/audio/sdl/audio.h +++ b/src/libjin/audio/sdl/audio.h @@ -46,6 +46,8 @@ namespace audio void processCommands(); void processSources(Uint8* buffer, int len); + static void defaultCallback(void *userdata, Uint8 *stream, int size); + private: SDLAudio() {} diff --git a/src/libjin/audio/sdl/source.cpp b/src/libjin/audio/sdl/source.cpp index 7d71ce7..fc0a2fe 100644 --- a/src/libjin/audio/sdl/source.cpp +++ b/src/libjin/audio/sdl/source.cpp @@ -259,27 +259,29 @@ Manager::get()->pushCommand(cmd); \ int16_t* src16 = (int16_t*)((char*)source->raw.data + source->pos); int remainsample = (source->raw.length - source->pos) >> 1; int bound = min(samples, remainsample); - for (int i = 0; i < bound; ++i) + for (int i = 0; i < samples; ++i) { buf16[i] += src16[i]; // mix sources } - source->pos += (bound << 1); - if (source->pos == 0) + source->pos += (samples << 1); + if (remainsample < samples) { if (source->loop) { - int j = 0; - for (int i = bound; i < samples; ++i, ++j) + /* int j = 0; + for (int i = bound; i < samples; ++i) { int val = data16[j]; buf16[i] += val; - } - source->pos = (j << 1); - continue; + ++j; + }*/ + //sources.erase(it); + //source->pos = (j << 1); + source->pos = 0; + break; } else { - sources.erase(it); } } |