From 9f6e9718399f1c38e5db103a578f39be6dfc04e6 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Wed, 25 May 2016 07:24:34 -0700 Subject: [PATCH 1/4] Default to darker reverb settings, by increasing the high-frequency rolloff and damping. --- libraries/audio/src/AudioEffectOptions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/audio/src/AudioEffectOptions.cpp b/libraries/audio/src/AudioEffectOptions.cpp index 9d3ce9299b..a9e4cbae6c 100644 --- a/libraries/audio/src/AudioEffectOptions.cpp +++ b/libraries/audio/src/AudioEffectOptions.cpp @@ -32,7 +32,7 @@ static const QString LATE_MIX_LEFT_HANDLE = "lateMixLeft"; static const QString LATE_MIX_RIGHT_HANDLE = "lateMixRight"; static const QString WET_DRY_MIX_HANDLE = "wetDryMix"; -static const float BANDWIDTH_DEFAULT = 10000.0f; +static const float BANDWIDTH_DEFAULT = 7000.0f; static const float PRE_DELAY_DEFAULT = 20.0f; static const float LATE_DELAY_DEFAULT = 0.0f; static const float REVERB_TIME_DEFAULT = 2.0f; @@ -42,7 +42,7 @@ static const float ROOM_SIZE_DEFAULT = 50.0f; static const float DENSITY_DEFAULT = 100.0f; static const float BASS_MULT_DEFAULT = 1.5f; static const float BASS_FREQ_DEFAULT = 250.0f; -static const float HIGH_GAIN_DEFAULT = -6.0f; +static const float HIGH_GAIN_DEFAULT = -12.0f; static const float HIGH_FREQ_DEFAULT = 3000.0f; static const float MOD_RATE_DEFAULT = 2.3f; static const float MOD_DEPTH_DEFAULT = 50.0f; From 54293fdad034eb35da373753e01b47598e32381b Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Fri, 3 Jun 2016 18:39:43 -0700 Subject: [PATCH 2/4] Replace the linear interpolation embedded in the .WAV/.RAW loader with high quality polyphase resampling. When downsampling 48khz to 24khz, linear interpolation creates aliasing distortion that is quite audible. This change greatly improves the audio quality for all sound assets. --- libraries/audio/src/Sound.cpp | 55 ++++++++++------------------------- 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index 806e33819e..c3e936e33a 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -25,6 +25,8 @@ #include "AudioRingBuffer.h" #include "AudioLogging.h" +#include "AudioSRC.h" + #include "Sound.h" QScriptValue soundSharedPointerToScriptValue(QScriptEngine* engine, const SharedSoundPointer& in) { @@ -89,49 +91,22 @@ void Sound::downSample(const QByteArray& rawAudioByteArray) { // we want to convert it to the format that the audio-mixer wants // which is signed, 16-bit, 24Khz - int numSourceSamples = rawAudioByteArray.size() / sizeof(AudioConstants::AudioSample); + int numChannels = _isStereo ? 2 : 1; + AudioSRC resampler(48000, AudioConstants::SAMPLE_RATE, numChannels); - if (_isStereo && numSourceSamples % 2 != 0){ - // in the unlikely case that we have stereo audio but we seem to be missing a sample - // (the sample for one channel is missing in a set of interleaved samples) - // then drop the odd sample - --numSourceSamples; - } + // resize to max possible output + int numSourceFrames = rawAudioByteArray.size() / (numChannels * sizeof(AudioConstants::AudioSample)); + int maxDestinationFrames = resampler.getMaxOutput(numSourceFrames); + int maxDestinationBytes = maxDestinationFrames * numChannels * sizeof(AudioConstants::AudioSample); + _byteArray.resize(maxDestinationBytes); - int numDestinationSamples = numSourceSamples / 2.0f; + int numDestinationFrames = resampler.render((int16_t*)rawAudioByteArray.data(), + (int16_t*)_byteArray.data(), + numSourceFrames); - if (_isStereo && numDestinationSamples % 2 != 0) { - // if this is stereo we need to make sure we produce stereo output - // which means we should have an even number of output samples - numDestinationSamples += 1; - } - - int numDestinationBytes = numDestinationSamples * sizeof(AudioConstants::AudioSample); - - _byteArray.resize(numDestinationBytes); - - int16_t* sourceSamples = (int16_t*) rawAudioByteArray.data(); - int16_t* destinationSamples = (int16_t*) _byteArray.data(); - - if (_isStereo) { - for (int i = 0; i < numSourceSamples; i += 4) { - if (i + 2 >= numSourceSamples) { - destinationSamples[i / 2] = sourceSamples[i]; - destinationSamples[(i / 2) + 1] = sourceSamples[i + 1]; - } else { - destinationSamples[i / 2] = (sourceSamples[i] + sourceSamples[i + 2]) / 2; - destinationSamples[(i / 2) + 1] = (sourceSamples[i + 1] + sourceSamples[i + 3]) / 2; - } - } - } else { - for (int i = 1; i < numSourceSamples; i += 2) { - if (i + 1 >= numSourceSamples) { - destinationSamples[(i - 1) / 2] = (sourceSamples[i - 1] + sourceSamples[i]) / 2; - } else { - destinationSamples[(i - 1) / 2] = ((sourceSamples[i - 1] + sourceSamples[i + 1]) / 4) + (sourceSamples[i] / 2); - } - } - } + // truncate to actual output + int numDestinationBytes = numDestinationFrames * numChannels * sizeof(AudioConstants::AudioSample); + _byteArray.resize(maxDestinationBytes); } // From 280289045c91e43541e21de7bd3b74ed155b5a44 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Fri, 3 Jun 2016 18:48:23 -0700 Subject: [PATCH 3/4] Revert change to reverb settings. --- libraries/audio/src/AudioEffectOptions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/audio/src/AudioEffectOptions.cpp b/libraries/audio/src/AudioEffectOptions.cpp index a9e4cbae6c..9d3ce9299b 100644 --- a/libraries/audio/src/AudioEffectOptions.cpp +++ b/libraries/audio/src/AudioEffectOptions.cpp @@ -32,7 +32,7 @@ static const QString LATE_MIX_LEFT_HANDLE = "lateMixLeft"; static const QString LATE_MIX_RIGHT_HANDLE = "lateMixRight"; static const QString WET_DRY_MIX_HANDLE = "wetDryMix"; -static const float BANDWIDTH_DEFAULT = 7000.0f; +static const float BANDWIDTH_DEFAULT = 10000.0f; static const float PRE_DELAY_DEFAULT = 20.0f; static const float LATE_DELAY_DEFAULT = 0.0f; static const float REVERB_TIME_DEFAULT = 2.0f; @@ -42,7 +42,7 @@ static const float ROOM_SIZE_DEFAULT = 50.0f; static const float DENSITY_DEFAULT = 100.0f; static const float BASS_MULT_DEFAULT = 1.5f; static const float BASS_FREQ_DEFAULT = 250.0f; -static const float HIGH_GAIN_DEFAULT = -12.0f; +static const float HIGH_GAIN_DEFAULT = -6.0f; static const float HIGH_FREQ_DEFAULT = 3000.0f; static const float MOD_RATE_DEFAULT = 2.3f; static const float MOD_DEPTH_DEFAULT = 50.0f; From 89bfa5bc0930da99113592f6c231ac6a94db10cb Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Fri, 3 Jun 2016 19:22:29 -0700 Subject: [PATCH 4/4] fixed typo --- libraries/audio/src/Sound.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio/src/Sound.cpp b/libraries/audio/src/Sound.cpp index c3e936e33a..764ade2661 100644 --- a/libraries/audio/src/Sound.cpp +++ b/libraries/audio/src/Sound.cpp @@ -106,7 +106,7 @@ void Sound::downSample(const QByteArray& rawAudioByteArray) { // truncate to actual output int numDestinationBytes = numDestinationFrames * numChannels * sizeof(AudioConstants::AudioSample); - _byteArray.resize(maxDestinationBytes); + _byteArray.resize(numDestinationBytes); } //