From ac9152c2796ea8dd9948ec88ea1e2e0962e917e0 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 4 Feb 2013 08:30:11 -0800 Subject: [PATCH] fix a miscalculation in ring buffer wrap around --- Source/Audio.cpp | 7 ++++--- Source/AudioRingBuffer.cpp | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Source/Audio.cpp b/Source/Audio.cpp index 74638ad5c5..5d350558cc 100644 --- a/Source/Audio.cpp +++ b/Source/Audio.cpp @@ -24,7 +24,7 @@ const short PACKET_LENGTH_SAMPLES = PACKET_LENGTH_BYTES / sizeof(int16_t); const int PHASE_DELAY_AT_90 = 20; const float AMPLITUDE_RATIO_AT_90 = 0.5; -const short RING_BUFFER_FRAMES = 4; +const short RING_BUFFER_FRAMES = 5; const short RING_BUFFER_SIZE_SAMPLES = RING_BUFFER_FRAMES * BUFFER_LENGTH_SAMPLES; const short JITTER_BUFFER_LENGTH_MSECS = 3; @@ -235,6 +235,7 @@ void *receiveAudioViaUDP(void *args) { // check for possibility of overlap bufferSampleOverlap = ringBuffer->bufferOverlap(copyToPointer, PACKET_LENGTH_SAMPLES); + } if (!bufferSampleOverlap) { @@ -254,11 +255,11 @@ void *receiveAudioViaUDP(void *args) { memcpy(copyToPointer, receivedData, PACKET_LENGTH_BYTES); ringBuffer->endOfLastWrite += PACKET_LENGTH_SAMPLES; } - } else { + } else { // no jitter buffer, but overlap // copy to the end, and then from the begining to the overlap memcpy(copyToPointer, receivedData, (PACKET_LENGTH_SAMPLES - bufferSampleOverlap) * sizeof(int16_t)); - memcpy(ringBuffer->buffer, receivedData + bufferSampleOverlap, bufferSampleOverlap * sizeof(int16_t)); + memcpy(ringBuffer->buffer, receivedData + (PACKET_LENGTH_SAMPLES - bufferSampleOverlap), bufferSampleOverlap * sizeof(int16_t)); // the end of the write is the amount of overlap ringBuffer->endOfLastWrite = ringBuffer->buffer + bufferSampleOverlap; diff --git a/Source/AudioRingBuffer.cpp b/Source/AudioRingBuffer.cpp index 6cb617457d..215d2c5ad5 100644 --- a/Source/AudioRingBuffer.cpp +++ b/Source/AudioRingBuffer.cpp @@ -36,7 +36,7 @@ short AudioRingBuffer::bufferOverlap(int16_t *pointer, short addedDistance) { short samplesLeft = (buffer + ringBufferLengthSamples) - pointer; - if (samplesLeft <= addedDistance) { + if (samplesLeft < addedDistance) { return addedDistance - samplesLeft; } else { return 0;