From 7ecde7be301bad4d86a565e461a2aa3dbf13f1dc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 10 Mar 2015 12:49:43 -0700 Subject: [PATCH] add fix for out of bounds Sound resampling --- libraries/audio/src/Sound.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index cc41a849e7..a7c8c887bb 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -94,22 +94,32 @@ void Sound::downloadFinished(QNetworkReply* reply) { void Sound::downSample(const QByteArray& rawAudioByteArray) { // assume that this was a RAW file and is now an array of samples that are - // signed, 16-bit, 48Khz, mono + // signed, 16-bit, 48Khz // we want to convert it to the format that the audio-mixer wants - // which is signed, 16-bit, 24Khz, mono + // which is signed, 16-bit, 24Khz + + int numDestinationBytes = rawAudioByteArray.size() / 2; + if (_isStereo && numDestinationBytes % 4 != 0) { + numDestinationBytes += 1; + } - _byteArray.resize(rawAudioByteArray.size() / 2); + _byteArray.resize(numDestinationBytes); int numSourceSamples = rawAudioByteArray.size() / sizeof(int16_t); int16_t* sourceSamples = (int16_t*) rawAudioByteArray.data(); int16_t* destinationSamples = (int16_t*) _byteArray.data(); - if (_isStereo) { for (int i = 0; i < numSourceSamples; i += 4) { - destinationSamples[i / 2] = (sourceSamples[i] / 2) + (sourceSamples[i + 2] / 2); - destinationSamples[(i / 2) + 1] = (sourceSamples[i + 1] / 2) + (sourceSamples[i + 3] / 2); + if (i + 2 >= numSourceSamples) { + destinationSamples[i / 2] = sourceSamples[i]; + destinationSamples[(i / 2) + 1] = sourceSamples[i + 1]; + } else { + destinationSamples[i / 2] = (sourceSamples[i] / 2) + (sourceSamples[i + 2] / 2); + destinationSamples[(i / 2) + 1] = (sourceSamples[i + 1] / 2) + (sourceSamples[i + 3] / 2); + } + } } else { for (int i = 1; i < numSourceSamples; i += 2) {