changeset 868:2c6b092328be

Possibly improve audio synchronization.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 03 Feb 2015 11:45:18 +0200
parents 56e12109b936
children 4cecc74e1b85
files src/dmengine.c src/dmengine.h src/dmsimple.c
diffstat 3 files changed, 23 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/dmengine.c	Thu Jan 08 03:49:56 2015 +0200
+++ b/src/dmengine.c	Tue Feb 03 11:45:18 2015 +0200
@@ -373,7 +373,7 @@
 
 int engineGetTick(DMEngineData *engine)
 {
-    return engine->frameTime - engine->startTime;
+    return engine->frameTime - engine->startTime - engine->offsetTime;
 }
 
 
@@ -429,15 +429,21 @@
         return;
 
     dmMutexLock(engine->audioStreamMutex);
+    
+    // Update variables for analysis buffer (FFT, etc.)
     engine->audioStreamBuf  = stream;
     engine->audioStreamLen  = len / engine->audioSampleSize;
+
+    // Update audio stream time position
     engine->audioTimePos   += (1000 * engine->audioStreamLen) / engine->optAfmt.freq;
 
+    // If paused, just render nothing
     if (engine->paused)
     {
         memset(stream, 0, len);
     }
     else
+    // Otherwise, render audio
     switch (engine->optAudioSetup)
     {
 #ifdef DM_USE_JSS
@@ -462,6 +468,14 @@
             break;
     }
 
+    // First round of audio callback sets up the
+    // necessary variables for audio synchro
+    if (engine->startTimeAudio == -1 && engine->startTime != -1)
+    {
+        engine->startTimeAudio = SDL_GetTicks();
+        engine->offsetTime = engine->startTimeAudio - engine->startTime;
+    }
+
     dmMutexUnlock(engine->audioStreamMutex);
 }
 
--- a/src/dmengine.h	Thu Jan 08 03:49:56 2015 +0200
+++ b/src/dmengine.h	Tue Feb 03 11:45:18 2015 +0200
@@ -235,6 +235,7 @@
 
     int frameTime, frameCount,
         startTime, endTime,
+        startTimeAudio, offsetTime,
         pauseTime;
 
     BOOL pauseFlag, paused, exitFlag;
--- a/src/dmsimple.c	Thu Jan 08 03:49:56 2015 +0200
+++ b/src/dmsimple.c	Tue Feb 03 11:45:18 2015 +0200
@@ -623,6 +623,9 @@
     }
     initSDL = TRUE;
 
+    // Set start time
+    engine.startTimeAudio = -1;
+    engine.startTime = -1;
 
     // Present video mode selector
     if (engine.optVidAspect <= 0)
@@ -764,12 +767,12 @@
 
     dmPrint(1, "Starting up.\n");
 
+    engine.startTime = SDL_GetTicks();
+
     SDL_LockAudio();
     enginePauseAudio(0);
     SDL_UnlockAudio();
 
-    engine.startTime = SDL_GetTicks();
-
     while (!engine.exitFlag)
     {
         while (SDL_PollEvent(&engine.event))
@@ -864,6 +867,8 @@
         engine.frameCount, engine.endTime - engine.startTime,
         (float) (engine.frameCount * 1000.0f) / (float) (engine.endTime - engine.startTime));
 
+    dmPrint(1, "startTime=%d, startTimeAudio=%d, offsetTime=%d\n",
+        engine.startTime, engine.startTimeAudio, engine.offsetTime);
 
 error_exit: