mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-04 03:24:46 +02:00
fix audio client starve detection
This commit is contained in:
parent
a40a9f1d73
commit
d7643ef2a0
1 changed files with 11 additions and 12 deletions
|
@ -1174,6 +1174,8 @@ bool AudioClient::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceIn
|
||||||
void AudioClient::outputNotify() {
|
void AudioClient::outputNotify() {
|
||||||
int recentUnfulfilled = _audioOutputIODevice.getRecentUnfulfilledReads();
|
int recentUnfulfilled = _audioOutputIODevice.getRecentUnfulfilledReads();
|
||||||
if (recentUnfulfilled > 0) {
|
if (recentUnfulfilled > 0) {
|
||||||
|
qCInfo(audioclient, "Starve detected, %d new unfulfilled reads", recentUnfulfilled);
|
||||||
|
|
||||||
if (_outputStarveDetectionEnabled.get()) {
|
if (_outputStarveDetectionEnabled.get()) {
|
||||||
quint64 now = usecTimestampNow() / 1000;
|
quint64 now = usecTimestampNow() / 1000;
|
||||||
int dt = (int)(now - _outputStarveDetectionStartTimeMsec);
|
int dt = (int)(now - _outputStarveDetectionStartTimeMsec);
|
||||||
|
@ -1183,14 +1185,15 @@ void AudioClient::outputNotify() {
|
||||||
} else {
|
} else {
|
||||||
_outputStarveDetectionCount += recentUnfulfilled;
|
_outputStarveDetectionCount += recentUnfulfilled;
|
||||||
if (_outputStarveDetectionCount > _outputStarveDetectionThreshold.get()) {
|
if (_outputStarveDetectionCount > _outputStarveDetectionThreshold.get()) {
|
||||||
_outputStarveDetectionStartTimeMsec = now;
|
|
||||||
_outputStarveDetectionCount = 0;
|
|
||||||
|
|
||||||
int oldOutputBufferSizeFrames = _sessionOutputBufferSizeFrames;
|
int oldOutputBufferSizeFrames = _sessionOutputBufferSizeFrames;
|
||||||
int newOutputBufferSizeFrames = setOutputBufferSize(oldOutputBufferSizeFrames + 1, false);
|
int newOutputBufferSizeFrames = setOutputBufferSize(oldOutputBufferSizeFrames + 1, false);
|
||||||
|
|
||||||
if (newOutputBufferSizeFrames > oldOutputBufferSizeFrames) {
|
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) {
|
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);
|
numFrames = std::min(std::max(numFrames, MIN_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES), MAX_AUDIO_OUTPUT_BUFFER_SIZE_FRAMES);
|
||||||
if (numFrames != _sessionOutputBufferSizeFrames) {
|
if (numFrames != _sessionOutputBufferSizeFrames) {
|
||||||
qCDebug(audioclient) << "Audio output buffer size (frames): " << numFrames;
|
qCInfo(audioclient, "Audio output buffer set to %d frames", numFrames);
|
||||||
_sessionOutputBufferSizeFrames = numFrames;
|
_sessionOutputBufferSizeFrames = numFrames;
|
||||||
if (persist) {
|
if (persist) {
|
||||||
_outputBufferSizeFrames.set(numFrames);
|
_outputBufferSizeFrames.set(numFrames);
|
||||||
|
@ -1383,24 +1386,20 @@ qint64 AudioClient::AudioOutputIODevice::readData(char * data, qint64 maxSize) {
|
||||||
auto samplesRequested = maxSize / sizeof(int16_t);
|
auto samplesRequested = maxSize / sizeof(int16_t);
|
||||||
int samplesPopped;
|
int samplesPopped;
|
||||||
int bytesWritten;
|
int bytesWritten;
|
||||||
|
|
||||||
if ((samplesPopped = _receivedAudioStream.popSamples((int)samplesRequested, false)) > 0) {
|
if ((samplesPopped = _receivedAudioStream.popSamples((int)samplesRequested, false)) > 0) {
|
||||||
AudioRingBuffer::ConstIterator lastPopOutput = _receivedAudioStream.getLastPopOutput();
|
AudioRingBuffer::ConstIterator lastPopOutput = _receivedAudioStream.getLastPopOutput();
|
||||||
lastPopOutput.readSamples((int16_t*)data, samplesPopped);
|
lastPopOutput.readSamples((int16_t*)data, samplesPopped);
|
||||||
bytesWritten = samplesPopped * sizeof(int16_t);
|
bytesWritten = samplesPopped * sizeof(int16_t);
|
||||||
} else {
|
} else {
|
||||||
// nothing on network, don't grab anything from injectors, and just
|
// nothing on network, don't grab anything from injectors, and just return 0s
|
||||||
// return 0s
|
// this will flood the log: qCDebug(audioclient, "empty/partial network buffer");
|
||||||
memset(data, 0, maxSize);
|
memset(data, 0, maxSize);
|
||||||
bytesWritten = maxSize;
|
bytesWritten = maxSize;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int bytesAudioOutputUnplayed = _audio->_audioOutput->bufferSize() - _audio->_audioOutput->bytesFree();
|
int bytesAudioOutputUnplayed = _audio->_audioOutput->bufferSize() - _audio->_audioOutput->bytesFree();
|
||||||
if (!bytesAudioOutputUnplayed) {
|
if (!bytesAudioOutputUnplayed) {
|
||||||
qCDebug(audioclient) << "empty audio buffer";
|
|
||||||
}
|
|
||||||
if (bytesAudioOutputUnplayed == 0 && bytesWritten == 0) {
|
|
||||||
_unfulfilledReads++;
|
_unfulfilledReads++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue