From 599ef68df80d00dd816f2ad41e8a68568c6cca94 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 20 Feb 2015 08:26:11 -0800 Subject: [PATCH] fix for scratchy audio on windows --- interface/src/audio/AudioScope.h | 2 +- libraries/audio-client/src/AudioClient.cpp | 21 +++++++++------------ libraries/audio-client/src/AudioClient.h | 14 ++++++++++++-- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/interface/src/audio/AudioScope.h b/interface/src/audio/AudioScope.h index df902fe7cd..cc9367e2d5 100644 --- a/interface/src/audio/AudioScope.h +++ b/interface/src/audio/AudioScope.h @@ -75,4 +75,4 @@ private: }; -#endif // hifi_AudioScope_h \ No newline at end of file +#endif // hifi_AudioScope_h diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index b427d5ba42..49dd1e1a35 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -85,16 +85,9 @@ AudioClient::AudioClient() : _isStereoInput(false), _outputStarveDetectionStartTimeMsec(0), _outputStarveDetectionCount(0), - _outputBufferSizeFrames("audioOutputBufferSize", - DEFAULT_MAX_FRAMES_OVER_DESIRED), -#ifdef Q_OS_ANDROID - _outputStarveDetectionEnabled("audioOutputStarveDetectionEnabled", - false), -#else + _outputBufferSizeFrames("audioOutputBufferSize", DEFAULT_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES), _outputStarveDetectionEnabled("audioOutputStarveDetectionEnabled", DEFAULT_AUDIO_OUTPUT_STARVE_DETECTION_ENABLED), -#endif - _outputStarveDetectionPeriodMsec("audioOutputStarveDetectionPeriod", DEFAULT_AUDIO_OUTPUT_STARVE_DETECTION_PERIOD), _outputStarveDetectionThreshold("audioOutputStarveDetectionThreshold", @@ -1089,12 +1082,16 @@ void AudioClient::outputNotify() { } else { _outputStarveDetectionCount += recentUnfulfilled; if (_outputStarveDetectionCount > _outputStarveDetectionThreshold.get()) { - int newOutputBufferSizeFrames = _outputBufferSizeFrames.get() + 1; - qDebug() << "Starve detection threshold met, increasing buffer size to " << newOutputBufferSizeFrames; - setOutputBufferSize(newOutputBufferSizeFrames); - _outputStarveDetectionStartTimeMsec = now; _outputStarveDetectionCount = 0; + + int oldOutputBufferSizeFrames = _outputBufferSizeFrames.get(); + int newOutputBufferSizeFrames = oldOutputBufferSizeFrames + 1; + setOutputBufferSize(newOutputBufferSizeFrames); + newOutputBufferSizeFrames = _outputBufferSizeFrames.get(); + if (newOutputBufferSizeFrames > oldOutputBufferSizeFrames) { + qDebug() << "Starve detection threshold met, increasing buffer size to " << newOutputBufferSizeFrames; + } } } } diff --git a/libraries/audio-client/src/AudioClient.h b/libraries/audio-client/src/AudioClient.h index 0095a885eb..811282c0a1 100644 --- a/libraries/audio-client/src/AudioClient.h +++ b/libraries/audio-client/src/AudioClient.h @@ -56,8 +56,18 @@ static const int NUM_AUDIO_CHANNELS = 2; static const int DEFAULT_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES = 3; static const int MIN_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES = 1; -static const int MAX_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES = 20; -static const int DEFAULT_AUDIO_OUTPUT_STARVE_DETECTION_ENABLED = true; +#ifdef _WIN32 + // WORKAROUND: Some sound devices on Windows (at least 8.1) will get scratchy if their output + // buffer is set too high so we have to limit the number of frames in the buffer. + static const int MAX_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES = 5; +#else + static const int MAX_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES = 20; +#endif +#ifdef Q_OS_ANDROID + static const int DEFAULT_AUDIO_OUTPUT_STARVE_DETECTION_ENABLED = false; +#else + static const int DEFAULT_AUDIO_OUTPUT_STARVE_DETECTION_ENABLED = true; +#endif static const int DEFAULT_AUDIO_OUTPUT_STARVE_DETECTION_THRESHOLD = 3; static const quint64 DEFAULT_AUDIO_OUTPUT_STARVE_DETECTION_PERIOD = 10 * 1000; // 10 Seconds