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)