In AudioInjector, replace SOXR with AudioSRC.

Used for pitch shifting in playSound(). Setup time (once per sound) is drastically improved.
This commit is contained in:
Ken Cooke 2015-09-22 23:08:05 -07:00
parent 0ad01ca935
commit 4b9c2ed6b6

View file

@ -16,12 +16,12 @@
#include <udt/PacketHeaders.h> #include <udt/PacketHeaders.h>
#include <SharedUtil.h> #include <SharedUtil.h>
#include <UUID.h> #include <UUID.h>
#include <soxr.h>
#include "AbstractAudioInterface.h" #include "AbstractAudioInterface.h"
#include "AudioRingBuffer.h" #include "AudioRingBuffer.h"
#include "AudioLogging.h" #include "AudioLogging.h"
#include "SoundCache.h" #include "SoundCache.h"
#include "AudioSRC.h"
#include "AudioInjector.h" #include "AudioInjector.h"
@ -316,23 +316,20 @@ AudioInjector* AudioInjector::playSound(const QString& soundUrl, const float vol
return playSoundAndDelete(samples, options, NULL); 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 standardRate = AudioConstants::SAMPLE_RATE;
const int resampledRate = standardRate * stretchFactor; const int resampledRate = standardRate * stretchFactor;
const int nInputSamples = samples.size() / sizeof(int16_t); const int channelCount = sound->isStereo() ? 2 : 1;
const int nOutputSamples = nInputSamples * stretchFactor;
QByteArray resampled(nOutputSamples * sizeof(int16_t), '\0'); AudioSRC resampler(standardRate, resampledRate, channelCount);
const int16_t* receivedSamples = reinterpret_cast<const int16_t*>(samples.data());
soxr_error_t soxError = soxr_oneshot(standardRate, resampledRate, channelCount, const int nInputFrames = samples.size() / (channelCount * sizeof(int16_t));
receivedSamples, nInputSamples, NULL, const int maxOutputFrames = resampler.getMaxOutput(nInputFrames);
reinterpret_cast<int16_t*>(resampled.data()), nOutputSamples, NULL, QByteArray resampled(maxOutputFrames * channelCount * sizeof(int16_t), '\0');
&spec, &qualitySpec, 0);
if (soxError) { int nOutputFrames = resampler.render(reinterpret_cast<const int16_t*>(samples.data()),
qCDebug(audio) << "Unable to resample" << soundUrl << "from" << nInputSamples << "@" << standardRate << "to" << nOutputSamples << "@" << resampledRate; reinterpret_cast<int16_t*>(resampled.data()),
resampled = samples; nInputFrames);
}
return playSoundAndDelete(resampled, options, NULL); return playSoundAndDelete(resampled, options, NULL);
} }