# HG changeset patch # User Matti Hamalainen # Date 1422956718 -7200 # Node ID 2c6b092328be817f09a4a133f35f27378d58aa09 # Parent 56e12109b936e0951846091ba728758bd8335694 Possibly improve audio synchronization. diff -r 56e12109b936 -r 2c6b092328be src/dmengine.c --- 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); } diff -r 56e12109b936 -r 2c6b092328be src/dmengine.h --- 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; diff -r 56e12109b936 -r 2c6b092328be src/dmsimple.c --- 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: