From 4b9c2ed6b63c747657fe6e4034a345f85ed6e126 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Tue, 22 Sep 2015 23:08:05 -0700 Subject: [PATCH] In AudioInjector, replace SOXR with AudioSRC. Used for pitch shifting in playSound(). Setup time (once per sound) is drastically improved. --- libraries/audio/src/AudioInjector.cpp | 29 ++++++++++++--------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/libraries/audio/src/AudioInjector.cpp b/libraries/audio/src/AudioInjector.cpp index 716ed5d43e..a3577e6c58 100644 --- a/libraries/audio/src/AudioInjector.cpp +++ b/libraries/audio/src/AudioInjector.cpp @@ -16,12 +16,12 @@ #include #include #include -#include #include "AbstractAudioInterface.h" #include "AudioRingBuffer.h" #include "AudioLogging.h" #include "SoundCache.h" +#include "AudioSRC.h" #include "AudioInjector.h" @@ -316,23 +316,20 @@ AudioInjector* AudioInjector::playSound(const QString& soundUrl, const float vol return playSoundAndDelete(samples, options, NULL); } - soxr_io_spec_t spec = soxr_io_spec(SOXR_INT16_I, SOXR_INT16_I); - soxr_quality_spec_t qualitySpec = soxr_quality_spec(SOXR_MQ, 0); - const int channelCount = sound->isStereo() ? 2 : 1; const int standardRate = AudioConstants::SAMPLE_RATE; const int resampledRate = standardRate * stretchFactor; - const int nInputSamples = samples.size() / sizeof(int16_t); - const int nOutputSamples = nInputSamples * stretchFactor; - QByteArray resampled(nOutputSamples * sizeof(int16_t), '\0'); - const int16_t* receivedSamples = reinterpret_cast(samples.data()); - soxr_error_t soxError = soxr_oneshot(standardRate, resampledRate, channelCount, - receivedSamples, nInputSamples, NULL, - reinterpret_cast(resampled.data()), nOutputSamples, NULL, - &spec, &qualitySpec, 0); - if (soxError) { - qCDebug(audio) << "Unable to resample" << soundUrl << "from" << nInputSamples << "@" << standardRate << "to" << nOutputSamples << "@" << resampledRate; - resampled = samples; - } + const int channelCount = sound->isStereo() ? 2 : 1; + + AudioSRC resampler(standardRate, resampledRate, channelCount); + + const int nInputFrames = samples.size() / (channelCount * sizeof(int16_t)); + const int maxOutputFrames = resampler.getMaxOutput(nInputFrames); + QByteArray resampled(maxOutputFrames * channelCount * sizeof(int16_t), '\0'); + + int nOutputFrames = resampler.render(reinterpret_cast(samples.data()), + reinterpret_cast(resampled.data()), + nInputFrames); + return playSoundAndDelete(resampled, options, NULL); }