diff options
author | Chris Robinson <[email protected]> | 2020-05-16 11:35:55 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2020-05-16 11:35:55 -0700 |
commit | 36aebbb6ae02337a58705bd0cfd98be407a89c85 (patch) | |
tree | e7b164491d445b6abb50b9b23446448637556c64 /alc/uhjfilter.cpp | |
parent | 0f81fafc6274068003a5d4fcf3a6e33f621d2665 (diff) |
Include the existing direct signal in the UHJ delay
So any direct_channels sources and normal panned sources remain aligned, and
the reported latency is accurate.
Diffstat (limited to 'alc/uhjfilter.cpp')
-rw-r--r-- | alc/uhjfilter.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/alc/uhjfilter.cpp b/alc/uhjfilter.cpp index faf8fa3f..e0469bf9 100644 --- a/alc/uhjfilter.cpp +++ b/alc/uhjfilter.cpp @@ -165,6 +165,9 @@ void Uhj2Encoder::encode(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, { ASSUME(SamplesToDo > 0); + float *RESTRICT left{al::assume_aligned<16>(LeftOut.data())}; + float *RESTRICT right{al::assume_aligned<16>(RightOut.data())}; + const float *RESTRICT winput{al::assume_aligned<16>(InSamples[0].data())}; const float *RESTRICT xinput{al::assume_aligned<16>(InSamples[1].data())}; const float *RESTRICT yinput{al::assume_aligned<16>(InSamples[2].data())}; @@ -178,6 +181,12 @@ void Uhj2Encoder::encode(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, std::transform(yinput, yinput+SamplesToDo, mSide.begin(), [](const float y) noexcept -> float { return 0.6554516f*y; }); + /* Include any existing direct signal in the mid/side buffers. */ + for(size_t i{0};i < SamplesToDo;++i) + mMid[i] += left[i] + right[i]; + for(size_t i{0};i < SamplesToDo;++i) + mSide[i] += left[i] - right[i]; + /* Apply a delay to the non-filtered signal to align with the filter delay. */ if LIKELY(SamplesToDo >= sFilterSize) { @@ -209,11 +218,9 @@ void Uhj2Encoder::encode(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, allpass_process({mSide.data(), SamplesToDo}, mTemp.data()); /* Left = (S + D)/2.0 */ - float *RESTRICT left{al::assume_aligned<16>(LeftOut.data())}; for(size_t i{0};i < SamplesToDo;i++) - left[i] += (mMid[i] + mSide[i]) * 0.5f; + left[i] = (mMid[i] + mSide[i]) * 0.5f; /* Right = (S - D)/2.0 */ - float *RESTRICT right{al::assume_aligned<16>(RightOut.data())}; for(size_t i{0};i < SamplesToDo;i++) - right[i] += (mMid[i] - mSide[i]) * 0.5f; + right[i] = (mMid[i] - mSide[i]) * 0.5f; } |