From 100bc022ec55a0851a6d5ffb6bff1d16f06bd03c Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 19 Jun 2014 16:42:51 -0700 Subject: [PATCH] fixed a for loop that erased elements while iterating --- assignment-client/src/audio/AudioMixerClientData.cpp | 9 ++++++--- libraries/audio/src/AudioRingBuffer.h | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/audio/AudioMixerClientData.cpp b/assignment-client/src/audio/AudioMixerClientData.cpp index 2f78a4ac78..2329946e49 100644 --- a/assignment-client/src/audio/AudioMixerClientData.cpp +++ b/assignment-client/src/audio/AudioMixerClientData.cpp @@ -120,9 +120,10 @@ void AudioMixerClientData::checkBuffersBeforeFrameSend(int jitterBufferLengthSam } void AudioMixerClientData::pushBuffersAfterFrameSend() { - for (int i = 0; i < _ringBuffers.size(); i++) { + QList::iterator i = _ringBuffers.begin(); + while (i != _ringBuffers.end()) { // this was a used buffer, push the output pointer forwards - PositionalAudioRingBuffer* audioBuffer = _ringBuffers[i]; + PositionalAudioRingBuffer* audioBuffer = *i; if (audioBuffer->willBeAddedToMix()) { audioBuffer->shiftReadPosition(audioBuffer->isStereo() @@ -133,7 +134,9 @@ void AudioMixerClientData::pushBuffersAfterFrameSend() { && audioBuffer->hasStarted() && audioBuffer->isStarved()) { // this is an empty audio buffer that has starved, safe to delete delete audioBuffer; - _ringBuffers.erase(_ringBuffers.begin() + i); + i = _ringBuffers.erase(i); + continue; } + i++; } } diff --git a/libraries/audio/src/AudioRingBuffer.h b/libraries/audio/src/AudioRingBuffer.h index 105e3761ae..46bc333e4b 100644 --- a/libraries/audio/src/AudioRingBuffer.h +++ b/libraries/audio/src/AudioRingBuffer.h @@ -25,6 +25,7 @@ const int TIME_GAP_NUM_SAMPLES_IN_INTERVAL = 500; const int TIME_GAP_NUM_INTERVALS_IN_WINDOW = 10; +// class used to track time between incoming frames for the purpose of varying the jitter buffer length class InterframeTimeGapHistory { public: InterframeTimeGapHistory();