changeset 783:865f45701390

Fix audio support.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 30 Jul 2013 17:43:02 +0300
parents 2f32e178854a
children 35b881454ea2
files dmengine.h dmsimple.c
diffstat 2 files changed, 23 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/dmengine.h	Tue Jul 30 15:31:12 2013 +0300
+++ b/dmengine.h	Tue Jul 30 17:43:02 2013 +0300
@@ -250,9 +250,11 @@
     int optResFlags;
     char *optDataPath, *optPackFilename;
 
+    // Audio related
     SDL_AudioSpec optAfmt;
     int optAudioSetup;
 
+    int audioStatus;
     DMMutex *audioStreamMutex;
     Uint8 * audioStreamBuf;
     size_t audioStreamLen;
--- a/dmsimple.c	Tue Jul 30 15:31:12 2013 +0300
+++ b/dmsimple.c	Tue Jul 30 17:43:02 2013 +0300
@@ -102,11 +102,26 @@
 }
 
 
+static void enginePauseAudio(int status)
+{
+    if (status)
+        engine.audioStatus = SDL_AUDIO_PAUSED;
+    else
+        engine.audioStatus = SDL_AUDIO_PLAYING;
+
+    SDL_PauseAudio(status);
+}
+
+
 static int engineAudioThreadFunc(void *userdata)
 {
     do
     {
-        engineAudioCallback(userdata, engine.audioSimBuf, engine.audioSimBufSize);
+        if (engine.audioStatus == SDL_AUDIO_PLAYING)
+        {
+            engineAudioCallback(userdata, engine.audioSimBuf, engine.audioSimBufSize);
+        }
+
         SDL_Delay(engine.audioSimDelay);
     } while (!engine.audioSimDone);
 
@@ -724,6 +739,7 @@
     dmPrint(1, "Trying to init SDL audio with: fmt=%d, chn=%d, freq=%d\n",
         engine.optAfmt.format, engine.optAfmt.channels, engine.optAfmt.freq);
 
+    engine.audioStatus      = SDL_AUDIO_STOPPED;
     engine.optAfmt.callback = engineAudioCallback;
     engine.audioStreamMutex = dmCreateMutex();
     
@@ -743,8 +759,9 @@
         }
 
         engine.audioSimDelay   = 1000 / 50;
-        engine.audioSimBufSize = (engine.optAfmt.freq * sampleSize) / 50;
+        engine.audioSimBufSize = (engine.optAfmt.freq / 50) * sampleSize;
         engine.audioSimBuf     = dmMalloc(engine.audioSimBufSize);
+        engine.audioSimDone    = FALSE;
         engine.audioSimThread  = SDL_CreateThread(engineAudioThreadFunc, NULL);
     }
 
@@ -817,7 +834,7 @@
     dmPrint(1, "Starting up.\n");
 
     SDL_LockAudio();
-    SDL_PauseAudio(0);
+    enginePauseAudio(0);
     SDL_UnlockAudio();
 
     engine.startTime = SDL_GetTicks();
@@ -923,7 +940,7 @@
     SDL_ShowCursor(SDL_ENABLE);
 
     SDL_LockAudio();
-    SDL_PauseAudio(1);
+    enginePauseAudio(1);
 #ifdef DM_USE_JSS
     if (engine.optAudioSetup == DM_ASETUP_JSS)
     {