Mercurial > hg > dmlib
changeset 845:1d3d220fb5cc
Fix audio playback.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 21 Oct 2014 10:31:03 +0300 |
parents | 5ea0bf4379b1 |
children | 05a3ee1ca964 |
files | src/dmengine.c src/dmsimple.c |
diffstat | 2 files changed, 29 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/src/dmengine.c Tue Oct 21 09:34:20 2014 +0300 +++ b/src/dmengine.c Tue Oct 21 10:31:03 2014 +0300 @@ -398,34 +398,37 @@ void engineAudioCallback(void *userdata, Uint8 *stream, int len) { - (void) userdata; + DMEngineData *engine = (DMEngineData *) userdata; + + if (engine == NULL) + return; - dmMutexLock(engine.audioStreamMutex); - engine.audioStreamBuf = stream; - engine.audioStreamLen = len / engine.audioSampleSize; - engine.audioTimePos += (1000 * engine.audioStreamLen) / engine.optAfmt.freq; + dmMutexLock(engine->audioStreamMutex); + engine->audioStreamBuf = stream; + engine->audioStreamLen = len / engine->audioSampleSize; + engine->audioTimePos += (1000 * engine->audioStreamLen) / engine->optAfmt.freq; - if (engine.paused) + if (engine->paused) { memset(stream, 0, len); } else - switch (engine.optAudioSetup) + switch (engine->optAudioSetup) { #ifdef DM_USE_JSS case DM_ASETUP_JSS: - if (engine.jssDev != NULL) - jvmRenderAudio(engine.jssDev, stream, len / engine.audioSampleSize); + if (engine->jssDev != NULL) + jvmRenderAudio(engine->jssDev, stream, len / engine->audioSampleSize); break; #endif #ifdef DM_USE_TREMOR case DM_ASETUP_TREMOR: - if (engine.audioPos + len >= engine.audioRes->resSize) - engine.exitFlag = TRUE; + if (engine->audioPos + len >= engine->audioRes->resSize) + engine->exitFlag = TRUE; else { - memcpy(stream, engine.audioRes->resData + engine.audioPos, len); - engine.audioPos += len; + memcpy(stream, engine->audioRes->resData + engine->audioPos, len); + engine->audioPos += len; } break; #endif @@ -434,7 +437,7 @@ break; } - dmMutexUnlock(engine.audioStreamMutex); + dmMutexUnlock(engine->audioStreamMutex); }
--- a/src/dmsimple.c Tue Oct 21 09:34:20 2014 +0300 +++ b/src/dmsimple.c Tue Oct 21 10:31:03 2014 +0300 @@ -63,15 +63,21 @@ static int engineAudioThreadFunc(void *userdata) { + DMEngineData *engine = (DMEngineData *) userdata; + if (engine == NULL) + return 0; + do { - if (engine.audioStatus == SDL_AUDIO_PLAYING) + dmMutexLock(engine->audioStreamMutex); + if (engine->audioStatus == SDL_AUDIO_PLAYING) { - engineAudioCallback(userdata, engine.audioSimBuf, engine.audioSimBufSize); + engineAudioCallback(userdata, engine->audioSimBuf, engine->audioSimBufSize); } + dmMutexUnlock(engine->audioStreamMutex); - SDL_Delay(engine.audioSimDelay); - } while (!engine.audioSimDone); + SDL_Delay(engine->audioSimDelay); + } while (!engine->audioSimDone); return 0; } @@ -681,9 +687,10 @@ engine.optAfmt.format, engine.optAfmt.channels, engine.optAfmt.freq, engine.optAfmt.samples); + engine.audioStreamMutex = dmCreateMutex(); engine.audioStatus = SDL_AUDIO_STOPPED; engine.optAfmt.callback = engineAudioCallback; - engine.audioStreamMutex = dmCreateMutex(); + engine.optAfmt.userdata = (void *) &engine; engine.audioSampleSize = engine.optAfmt.channels; switch (engine.optAfmt.format)