From 181a4e9bdcd4598e8d10ffeb8df6c169d4ad0376 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Sun, 31 Mar 2019 11:32:29 -0700 Subject: [PATCH] Disable parameter interpolation from reset state Restores original behavior of constant-volume streams (no initial fade-in) --- libraries/audio/src/AudioFOA.cpp | 9 ++++++++- libraries/audio/src/AudioFOA.h | 2 ++ libraries/audio/src/AudioHRTF.cpp | 21 +++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/libraries/audio/src/AudioFOA.cpp b/libraries/audio/src/AudioFOA.cpp index ddcdf7f250..0dd61fbd02 100644 --- a/libraries/audio/src/AudioFOA.cpp +++ b/libraries/audio/src/AudioFOA.cpp @@ -1081,10 +1081,15 @@ void AudioFOA::render(int16_t* input, float* output, int index, float qw, float // apply gain as uniform scale scaleMatrix_4x4(gain, rotation); + // disable interpolation from reset state + if (_resetState) { + memcpy(_rotationState, rotation, sizeof(_rotationState)); + } + // rotate and scale the soundfield rotate_4x4(in, _rotationState, rotation, crossfadeTable, FOA_BLOCK); - // rotation history update + // new parameters become old memcpy(_rotationState, rotation, sizeof(_rotationState)); // @@ -1119,4 +1124,6 @@ void AudioFOA::render(int16_t* input, float* output, int index, float qw, float output[2*i+0] += accBuffer[0][i + FOA_OVERLAP]; output[2*i+1] += accBuffer[1][i + FOA_OVERLAP]; } + + _resetState = false; } diff --git a/libraries/audio/src/AudioFOA.h b/libraries/audio/src/AudioFOA.h index b8257e5190..e8cacc22ab 100644 --- a/libraries/audio/src/AudioFOA.h +++ b/libraries/audio/src/AudioFOA.h @@ -52,6 +52,8 @@ private: // orientation and gain history float _rotationState[4][4] = {}; + + bool _resetState = true; }; #endif // AudioFOA_h diff --git a/libraries/audio/src/AudioHRTF.cpp b/libraries/audio/src/AudioHRTF.cpp index 6f7d01d3f9..e5e32781b0 100644 --- a/libraries/audio/src/AudioHRTF.cpp +++ b/libraries/audio/src/AudioHRTF.cpp @@ -1141,6 +1141,13 @@ void AudioHRTF::render(int16_t* input, float* output, int index, float azimuth, // apply global and local gain adjustment gain *= _gainAdjust; + // disable interpolation from reset state + if (_resetState) { + _azimuthState = azimuth; + _distanceState = distance; + _gainState = gain; + } + // to avoid polluting the cache, old filters are recomputed instead of stored setFilters(firCoef, bqCoef, delay, index, _azimuthState, _distanceState, _gainState, L0); @@ -1220,11 +1227,18 @@ void AudioHRTF::mixMono(int16_t* input, float* output, float gain, int numFrames // apply global and local gain adjustment gain *= _gainAdjust; + // disable interpolation from reset state + if (_resetState) { + _gainState = gain; + } + // crossfade gain and accumulate gainfade_1x2(input, output, crossfadeTable, _gainState, gain, HRTF_BLOCK); // new parameters become old _gainState = gain; + + _resetState = false; } void AudioHRTF::mixStereo(int16_t* input, float* output, float gain, int numFrames) { @@ -1234,9 +1248,16 @@ void AudioHRTF::mixStereo(int16_t* input, float* output, float gain, int numFram // apply global and local gain adjustment gain *= _gainAdjust; + // disable interpolation from reset state + if (_resetState) { + _gainState = gain; + } + // crossfade gain and accumulate gainfade_2x2(input, output, crossfadeTable, _gainState, gain, HRTF_BLOCK); // new parameters become old _gainState = gain; + + _resetState = false; }