Merge pull request #4413 from birarda/master

fix stereo to stereo resampling via soxr
This commit is contained in:
Philip Rosedale 2015-03-10 16:09:31 -07:00
commit 2e85cf7459
3 changed files with 28 additions and 14 deletions

View file

@ -20,11 +20,11 @@ var trailingLoudness = 0.0;
var soundClip = SoundCache.getSound("https://s3.amazonaws.com/hifi-public/sounds/Tabla+Loops/Tabla1.wav"); var soundClip = SoundCache.getSound("https://s3.amazonaws.com/hifi-public/sounds/Tabla+Loops/Tabla1.wav");
var properties = { var properties = {
type: "Box", type: "Box",
position: orbitCenter, position: orbitCenter,
dimensions: { x: 0.25, y: 0.25, z: 0.25 }, dimensions: { x: 0.25, y: 0.25, z: 0.25 },
color: { red: 100, green: 0, blue : 0 } color: { red: 100, green: 0, blue : 0 }
}; };
var objectId = Entities.addEntity(properties); var objectId = Entities.addEntity(properties);
var sound = Audio.playSound(soundClip, { position: orbitCenter, loop: true, volume: 0.5 }); var sound = Audio.playSound(soundClip, { position: orbitCenter, loop: true, volume: 0.5 });
@ -34,7 +34,7 @@ function update(deltaTime) {
currentPosition = { x: orbitCenter.x + Math.cos(time * SPEED) * RADIUS, y: orbitCenter.y, z: orbitCenter.z + Math.sin(time * SPEED) * RADIUS }; currentPosition = { x: orbitCenter.x + Math.cos(time * SPEED) * RADIUS, y: orbitCenter.y, z: orbitCenter.z + Math.sin(time * SPEED) * RADIUS };
trailingLoudness = 0.9 * trailingLoudness + 0.1 * sound.loudness; trailingLoudness = 0.9 * trailingLoudness + 0.1 * sound.loudness;
Entities.editEntity( objectId, { position: currentPosition, color: { red: Math.min(trailingLoudness * 2000, 255), green: 0, blue: 0 } } ); Entities.editEntity( objectId, { position: currentPosition, color: { red: Math.min(trailingLoudness * 2000, 255), green: 0, blue: 0 } } );
sound.setOptions({ position: currentPosition }); sound.options = { position: currentPosition };
} }
Script.scriptEnding.connect(function() { Script.scriptEnding.connect(function() {

View file

@ -320,6 +320,7 @@ bool adjustedFormatForAudioDevice(const QAudioDeviceInfo& audioDevice,
#ifdef Q_OS_ANDROID #ifdef Q_OS_ANDROID
adjustedAudioFormat.setSampleRate(FORTY_FOUR); adjustedAudioFormat.setSampleRate(FORTY_FOUR);
#else #else
const int HALF_FORTY_FOUR = FORTY_FOUR / 2; const int HALF_FORTY_FOUR = FORTY_FOUR / 2;
if (audioDevice.supportedSampleRates().contains(AudioConstants::SAMPLE_RATE * 2)) { if (audioDevice.supportedSampleRates().contains(AudioConstants::SAMPLE_RATE * 2)) {
@ -397,18 +398,24 @@ soxr_error_t possibleResampling(soxr_t resampler,
numSourceSamples, numSourceSamples,
sourceAudioFormat, destinationAudioFormat); sourceAudioFormat, destinationAudioFormat);
qDebug() << "resample from" << sourceAudioFormat << "to" << destinationAudioFormat
<< "from" << numChannelCoversionSamples << "to" << numDestinationSamples;
resampleError = soxr_process(resampler, resampleError = soxr_process(resampler,
channelConversionSamples, numChannelCoversionSamples, NULL, channelConversionSamples, numChannelCoversionSamples, NULL,
destinationSamples, numDestinationSamples, NULL); destinationSamples, numDestinationSamples, NULL);
delete[] channelConversionSamples; delete[] channelConversionSamples;
} else { } else {
unsigned int numAdjustedSourceSamples = numSourceSamples;
unsigned int numAdjustedDestinationSamples = numDestinationSamples;
if (sourceAudioFormat.channelCount() == 2 && destinationAudioFormat.channelCount() == 2) {
numAdjustedSourceSamples /= 2;
numAdjustedDestinationSamples /= 2;
}
resampleError = soxr_process(resampler, resampleError = soxr_process(resampler,
sourceSamples, numSourceSamples, NULL, sourceSamples, numAdjustedSourceSamples, NULL,
destinationSamples, numDestinationSamples, NULL); destinationSamples, numAdjustedDestinationSamples, NULL);
} }
return resampleError; return resampleError;
@ -429,9 +436,12 @@ soxr_t soxrResamplerFromInputFormatToOutputFormat(const QAudioFormat& sourceAudi
// setup soxr_quality_spec_t for quality options // setup soxr_quality_spec_t for quality options
soxr_quality_spec_t qualitySpec = soxr_quality_spec(SOXR_MQ, 0); soxr_quality_spec_t qualitySpec = soxr_quality_spec(SOXR_MQ, 0);
int channelCount = (sourceAudioFormat.channelCount() == 2 && destinationAudioFormat.channelCount() == 2)
? 2 : 1;
soxr_t newResampler = soxr_create(sourceAudioFormat.sampleRate(), soxr_t newResampler = soxr_create(sourceAudioFormat.sampleRate(),
destinationAudioFormat.sampleRate(), destinationAudioFormat.sampleRate(),
1, channelCount,
&soxrError, &inputToNetworkSpec, &qualitySpec, 0); &soxrError, &inputToNetworkSpec, &qualitySpec, 0);
if (soxrError) { if (soxrError) {
@ -1136,7 +1146,7 @@ bool AudioClient::switchOutputToAudioDevice(const QAudioDeviceInfo& outputDevice
if (!outputDeviceInfo.isNull()) { if (!outputDeviceInfo.isNull()) {
qDebug() << "The audio output device " << outputDeviceInfo.deviceName() << "is available."; qDebug() << "The audio output device " << outputDeviceInfo.deviceName() << "is available.";
_outputAudioDeviceName = outputDeviceInfo.deviceName().trimmed(); _outputAudioDeviceName = outputDeviceInfo.deviceName().trimmed();
if (adjustedFormatForAudioDevice(outputDeviceInfo, _desiredOutputFormat, _outputFormat)) { if (adjustedFormatForAudioDevice(outputDeviceInfo, _desiredOutputFormat, _outputFormat)) {
qDebug() << "The format to be used for audio output is" << _outputFormat; qDebug() << "The format to be used for audio output is" << _outputFormat;

View file

@ -30,6 +30,8 @@ class AbstractAudioInterface;
class AudioInjector : public QObject { class AudioInjector : public QObject {
Q_OBJECT Q_OBJECT
Q_PROPERTY(AudioInjectorOptions options WRITE setOptions READ getOptions)
public: public:
AudioInjector(QObject* parent); AudioInjector(QObject* parent);
AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions); AudioInjector(Sound* sound, const AudioInjectorOptions& injectorOptions);
@ -51,7 +53,9 @@ public slots:
void triggerDeleteAfterFinish() { _shouldDeleteAfterFinish = true; } void triggerDeleteAfterFinish() { _shouldDeleteAfterFinish = true; }
void stopAndDeleteLater(); void stopAndDeleteLater();
void setOptions(AudioInjectorOptions& options) { _options = options; } const AudioInjectorOptions& getOptions() const { return _options; }
void setOptions(const AudioInjectorOptions& options) { _options = options; }
void setCurrentSendPosition(int currentSendPosition) { _currentSendPosition = currentSendPosition; } void setCurrentSendPosition(int currentSendPosition) { _currentSendPosition = currentSendPosition; }
float getLoudness() const { return _loudness; } float getLoudness() const { return _loudness; }
bool isPlaying() const { return !_isFinished; } bool isPlaying() const { return !_isFinished; }