@@ -461,7 +461,7 @@ static ConVar volume( "volume", "1.0", FCVAR_ARCHIVE | FCVAR_ARCHIVE_XBOX, "Soun
461461// user configurable music volume
462462ConVar snd_musicvolume ( " snd_musicvolume" , " 1.0" , FCVAR_ARCHIVE | FCVAR_ARCHIVE_XBOX, " Music volume" , true , 0 .0f , true , 1 .0f );
463463
464- ConVar snd_mixahead ( " snd_mixahead" , " 0.05 " );
464+ ConVar snd_mixahead ( " snd_mixahead" , " 0.04 " );
465465ConVar snd_mix_async ( " snd_mix_async" , " 0" );
466466#ifdef _DEBUG
467467static ConCommand snd_mixvol (" snd_mixvol" , MXR_DebugSetMixGroupVolume, " Set named Mixgroup to mix volume." );
@@ -6547,61 +6547,49 @@ void S_Update_Guts( float mixAheadTime )
65476547}
65486548
65496549#if !defined( _X360 )
6550- #define THREADED_MIX_TIME 7
6550+ #define THREADED_MIX_TIME 0.001
65516551#else
6552- #define THREADED_MIX_TIME XMA_POLL_RATE
6552+ #define THREADED_MIX_TIME XMA_POLL_RATE * 0.001
65536553#endif
6554- #define THREADED_MIX_TIME_S (THREADED_MIX_TIME) * 0 .001f
65556554
65566555ConVar snd_ShowThreadFrameTime ( " snd_ShowThreadFrameTime" , " 0" );
65576556
65586557bool g_bMixThreadExit;
65596558ThreadHandle_t g_hMixThread;
65606559void S_Update_Thread ()
65616560{
6562- float frameTime = THREADED_MIX_TIME_S;
6563- double lastFrameTime = Plat_FloatTime ();
6561+ double frameTime = THREADED_MIX_TIME;
65646562
65656563 while ( !g_bMixThreadExit )
65666564 {
6567- #ifdef _X360
6568- float t0 = Plat_FloatTime ();
6569- #endif
6565+ const double t0 = Plat_FloatTime ();
65706566 S_Update_Guts (frameTime + snd_mixahead.GetFloat ());
6571- # ifdef _X360
6567+ const double tf = Plat_FloatTime ();
65726568
6573- // mixing (for 360) needs to be updated at a steady rate
6574- // large update times causes the mixer to demand more audio data
6575- // the 360 decoder has finite latency and cannot fulfill spike requests
6576- float tf = Plat_FloatTime ();
6577- float dt = tf - t0;
6578- float nextFrameTime = tf + THREADED_MIX_TIME_S - dt;
6579- int updateTime = (int )dt * 1000 ;
6569+ const double dt = tf - t0;
6570+ const double fWaitTime = THREADED_MIX_TIME - dt;
6571+ const double fWaitEnd = tf + fWaitTime ;
65806572
65816573 // try to maintain a steadier rate by compensating for fluctuating mix times
6582- // leave 1 ms for tighter timings in loop
6583- int sleepTime = THREADED_MIX_TIME - updateTime - 1 ;
6584- if ( sleepTime > 0 )
6574+ // leave 2 ms for tighter timings in loop
6575+ const int nSleepMS = ( int ) (( THREADED_MIX_TIME - dt) * 1000 - 2 ) ;
6576+ if ( nSleepMS > 0 )
65856577 {
6586- ThreadSleep ( sleepTime );
6578+ ThreadSleep ( nSleepMS );
65876579 }
65886580
6589- while (Plat_FloatTime () < nextFrameTime )
6581+ while (Plat_FloatTime () < fWaitEnd )
65906582 {
65916583 ThreadSleep ();
65926584 }
6593- #else
6594- // Give up our time slice
6595- ThreadSleep ();
6596- #endif
6585+
65976586 // mimic a frametime needed for sound update
6598- double t1 = Plat_FloatTime ();
6599- frameTime = t1 - lastFrameTime;
6600- lastFrameTime = t1;
6587+ const double t1 = Plat_FloatTime ();
6588+ frameTime = t1 - tf;
66016589
66026590 if ( snd_ShowThreadFrameTime.GetBool () )
66036591 {
6604- Msg ( " S_Update_Thread: frameTime: %d ms \n " , ( int )( frameTime * 1000 . 0f ) );
6592+ Msg ( " S_Update_Thread: frameTime: %f s \n " , frameTime );
66056593 }
66066594 }
66076595}
0 commit comments