From 836fda2c051d866b0d5cde905689875ff2d15b5a Mon Sep 17 00:00:00 2001 From: matsukaze Date: Fri, 4 Apr 2014 09:07:27 -0700 Subject: [PATCH] Clamp the audio summation. --- interface/src/Audio.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/interface/src/Audio.cpp b/interface/src/Audio.cpp index 930a88e222..374976c691 100644 --- a/interface/src/Audio.cpp +++ b/interface/src/Audio.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "Application.h" #include "Audio.h" @@ -624,9 +625,11 @@ unsigned int Audio::timeValToSampleTick(const quint64 time, int sampleRate) { void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, const AudioRingBuffer& spatialAudio) { - // Calculate the number of remaining samples available + // Calculate the number of remaining samples available, the source spatial audio buffer will get + // clipped if there are insufficient samples available in the accumulation buffer. unsigned int remaining = _spatialAudioRingBuffer.getSampleCapacity() - _spatialAudioRingBuffer.samplesAvailable(); + // Locate where in the accumulation buffer the new samples need to go if (sampleTime >= _spatialAudioFinish) { if (_spatialAudioStart == _spatialAudioFinish) { @@ -636,12 +639,12 @@ void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, const AudioRingBuff if (sampleCt) { _spatialAudioRingBuffer.writeSamples(spatialAudio.getNextOutput(), sampleCt); } - _spatialAudioFinish = _spatialAudioStart + spatialAudio.samplesAvailable() / _desiredOutputFormat.channelCount(); + _spatialAudioFinish = _spatialAudioStart + sampleCt / _desiredOutputFormat.channelCount(); } else { - // Spatial audio ring buffer already has data, but there is no overlap with the new sample - // compute the appropriate time delay and pad with silence until the new start time + // Spatial audio ring buffer already has data, but there is no overlap with the new sample. + // Compute the appropriate time delay and pad with silence until the new start time. unsigned int delay = sampleTime - _spatialAudioFinish; unsigned int ct = delay * _desiredOutputFormat.channelCount(); unsigned int silentCt = (remaining < ct) ? remaining : ct; @@ -670,16 +673,18 @@ void Audio::addSpatialAudioToBuffer(unsigned int sampleTime, const AudioRingBuff int j = 0; for (int i = accumulationCt; --i >= 0; j++) { - _spatialAudioRingBuffer[j + offset] += spatialAudio[j]; + int tmp = _spatialAudioRingBuffer[j + offset] + spatialAudio[j]; + _spatialAudioRingBuffer[j + offset] = + static_cast(glm::clamp(tmp, std::numeric_limits::min(), std::numeric_limits::max())); } - // Copy the remaining unoverlapped spatial audio to the accumulation buffer + // Copy the remaining unoverlapped spatial audio to the accumulation buffer, if any unsigned int sampleCt = spatialAudio.samplesAvailable() - accumulationCt; sampleCt = (remaining < sampleCt) ? remaining : sampleCt; if (sampleCt) { _spatialAudioRingBuffer.writeSamples(spatialAudio.getNextOutput() + accumulationCt, sampleCt); + _spatialAudioFinish += sampleCt / _desiredOutputFormat.channelCount(); } - _spatialAudioFinish += sampleCt / _desiredOutputFormat.channelCount(); } }