From 0fd32b36ad2b364f074ad71a23a8fd18dc84116d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 15 Apr 2016 11:04:35 -0700 Subject: [PATCH] use a steadier clock for AudioMixer block timing --- assignment-client/src/audio/AudioMixer.cpp | 27 ++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index cc6c4930ff..7f8b44e8b2 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #ifdef _WIN32 #include @@ -577,15 +578,14 @@ void AudioMixer::domainSettingsRequestComplete() { void AudioMixer::broadcastMixes() { auto nodeList = DependencyManager::get(); - int64_t nextFrame = 0; - QElapsedTimer timer; - timer.start(); - - int64_t usecToSleep = AudioConstants::NETWORK_FRAME_USECS; + auto nextFrameTimestamp = p_high_resolution_clock::now(); + auto timeToSleep = std::chrono::microseconds(0); const int TRAILING_AVERAGE_FRAMES = 100; int framesSinceCutoffEvent = TRAILING_AVERAGE_FRAMES; + int currentFrame { 1 }; + while (!_isFinished) { const float STRUGGLE_TRIGGER_SLEEP_PERCENTAGE_THRESHOLD = 0.10f; const float BACK_OFF_TRIGGER_SLEEP_PERCENTAGE_THRESHOLD = 0.20f; @@ -595,12 +595,12 @@ void AudioMixer::broadcastMixes() { const float CURRENT_FRAME_RATIO = 1.0f / TRAILING_AVERAGE_FRAMES; const float PREVIOUS_FRAMES_RATIO = 1.0f - CURRENT_FRAME_RATIO; - if (usecToSleep < 0) { - usecToSleep = 0; + if (timeToSleep.count() < 0) { + timeToSleep = std::chrono::microseconds(0); } _trailingSleepRatio = (PREVIOUS_FRAMES_RATIO * _trailingSleepRatio) - + (usecToSleep * CURRENT_FRAME_RATIO / (float) AudioConstants::NETWORK_FRAME_USECS); + + (timeToSleep.count() * CURRENT_FRAME_RATIO / (float) AudioConstants::NETWORK_FRAME_USECS); float lastCutoffRatio = _performanceThrottlingRatio; bool hasRatioChanged = false; @@ -718,11 +718,14 @@ void AudioMixer::broadcastMixes() { break; } - usecToSleep = (++nextFrame * AudioConstants::NETWORK_FRAME_USECS) - (timer.nsecsElapsed() / 1000); + // push the next frame timestamp to when we should send the next + nextFrameTimestamp += std::chrono::microseconds(AudioConstants::NETWORK_FRAME_USECS); - if (usecToSleep > 0) { - usleep(usecToSleep); - } + // sleep as long as we need until next frame, if we can + auto now = p_high_resolution_clock::now(); + timeToSleep = std::chrono::duration_cast(nextFrameTimestamp - now); + + std::this_thread::sleep_for(timeToSleep); } }