From d7643ef2a0a4b8b7cbe0dcd23cc78b622765a8ce Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Thu, 8 Sep 2016 14:25:33 -0700 Subject: [PATCH 1/2] fix audio client starve detection --- libraries/audio-client/src/AudioClient.cpp | 23 +++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 7fdda5a118..f5077c118b 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1174,6 +1174,8 @@ bool AudioClient::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceIn void AudioClient::outputNotify() { int recentUnfulfilled = _audioOutputIODevice.getRecentUnfulfilledReads(); if (recentUnfulfilled > 0) { + qCInfo(audioclient, "Starve detected, %d new unfulfilled reads", recentUnfulfilled); + if (_outputStarveDetectionEnabled.get()) { quint64 now = usecTimestampNow() / 1000; int dt = (int)(now - _outputStarveDetectionStartTimeMsec); @@ -1183,14 +1185,15 @@ void AudioClient::outputNotify() { } else { _outputStarveDetectionCount += recentUnfulfilled; if (_outputStarveDetectionCount > _outputStarveDetectionThreshold.get()) { - _outputStarveDetectionStartTimeMsec = now; - _outputStarveDetectionCount = 0; - int oldOutputBufferSizeFrames = _sessionOutputBufferSizeFrames; int newOutputBufferSizeFrames = setOutputBufferSize(oldOutputBufferSizeFrames + 1, false); + if (newOutputBufferSizeFrames > oldOutputBufferSizeFrames) { - qCDebug(audioclient) << "Starve detection threshold met, increasing buffer size to " << newOutputBufferSizeFrames; + qCInfo(audioclient, "Starve threshold surpassed (%d starves in %d ms)", _outputStarveDetectionCount, dt); } + + _outputStarveDetectionStartTimeMsec = now; + _outputStarveDetectionCount = 0; } } } @@ -1278,7 +1281,7 @@ bool AudioClient::switchOutputToAudioDevice(const QAudioDeviceInfo& outputDevice int AudioClient::setOutputBufferSize(int numFrames, bool persist) { numFrames = std::min(std::max(numFrames, MIN_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES), MAX_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES); if (numFrames != _sessionOutputBufferSizeFrames) { - qCDebug(audioclient) << "Audio output buffer size (frames): " << numFrames; + qCInfo(audioclient, "Audio output buffer set to %d frames", numFrames); _sessionOutputBufferSizeFrames = numFrames; if (persist) { _outputBufferSizeFrames.set(numFrames); @@ -1383,24 +1386,20 @@ qint64 AudioClient::AudioOutputIODevice::readData(char * data, qint64 maxSize) { auto samplesRequested = maxSize / sizeof(int16_t); int samplesPopped; int bytesWritten; - + if ((samplesPopped = _receivedAudioStream.popSamples((int)samplesRequested, false)) > 0) { AudioRingBuffer::ConstIterator lastPopOutput = _receivedAudioStream.getLastPopOutput(); lastPopOutput.readSamples((int16_t*)data, samplesPopped); bytesWritten = samplesPopped * sizeof(int16_t); } else { - // nothing on network, don't grab anything from injectors, and just - // return 0s + // nothing on network, don't grab anything from injectors, and just return 0s + // this will flood the log: qCDebug(audioclient, "empty/partial network buffer"); memset(data, 0, maxSize); bytesWritten = maxSize; - } int bytesAudioOutputUnplayed = _audio->_audioOutput->bufferSize() - _audio->_audioOutput->bytesFree(); if (!bytesAudioOutputUnplayed) { - qCDebug(audioclient) << "empty audio buffer"; - } - if (bytesAudioOutputUnplayed == 0 && bytesWritten == 0) { _unfulfilledReads++; } From 2a2673d8980260544823ba7802f4c4d9a565e7af Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Thu, 8 Sep 2016 15:26:09 -0700 Subject: [PATCH 2/2] bring audio starve check to standard --- libraries/audio-client/src/AudioClient.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index f5077c118b..7b5feb99d8 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1398,8 +1398,8 @@ qint64 AudioClient::AudioOutputIODevice::readData(char * data, qint64 maxSize) { bytesWritten = maxSize; } - int bytesAudioOutputUnplayed = _audio->_audioOutput->bufferSize() - _audio->_audioOutput->bytesFree(); - if (!bytesAudioOutputUnplayed) { + bool wasBufferStarved = _audio->_audioOutput->bufferSize() == _audio->_audioOutput->bytesFree(); + if (wasBufferStarved) { _unfulfilledReads++; }