diff options
author | Chris Robinson <chris.kcat@gmail.com> | 2020-12-12 13:52:14 -0800 |
---|---|---|
committer | Chris Robinson <chris.kcat@gmail.com> | 2020-12-12 13:52:14 -0800 |
commit | 176bc8a8354fe3b79c6a109d61c1e3e79898dfe6 (patch) | |
tree | 693ee820a36795c9a41bc2765db183736e441168 /alc | |
parent | 191fe888b4bf55aac539315c75ed7f6d15f2ea7e (diff) |
Avoid passing DirectHrtfState to MixDirectHrtf
Diffstat (limited to 'alc')
-rw-r--r-- | alc/alu.cpp | 6 | ||||
-rw-r--r-- | alc/hrtf.h | 15 | ||||
-rw-r--r-- | alc/mixer/defs.h | 6 | ||||
-rw-r--r-- | alc/mixer/hrtfbase.h | 19 | ||||
-rw-r--r-- | alc/mixer/mixer_c.cpp | 9 | ||||
-rw-r--r-- | alc/mixer/mixer_neon.cpp | 9 | ||||
-rw-r--r-- | alc/mixer/mixer_sse.cpp | 9 |
7 files changed, 39 insertions, 34 deletions
diff --git a/alc/alu.cpp b/alc/alu.cpp index 5ea54f23..cd180f41 100644 --- a/alc/alu.cpp +++ b/alc/alu.cpp @@ -157,8 +157,8 @@ struct ChanMap { }; using HrtfDirectMixerFunc = void(*)(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, - const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, DirectHrtfState *State, - const size_t BufferSize); + const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, + float *TempBuf, HrtfChannelState *ChanState, const size_t IrSize, const size_t BufferSize); HrtfDirectMixerFunc MixDirectHrtf{MixDirectHrtf_<CTag>}; @@ -289,7 +289,7 @@ void ALCdevice::ProcessHrtf(const size_t SamplesToDo) const ALuint ridx{RealOut.ChannelIndex[FrontRight]}; MixDirectHrtf(RealOut.Buffer[lidx], RealOut.Buffer[ridx], Dry.Buffer, HrtfAccumData, - mHrtfState.get(), SamplesToDo); + mHrtfState->mTemp.data(), mHrtfState->mChannels.data(), mHrtfState->mIrSize, SamplesToDo); } void ALCdevice::ProcessAmbiDec(const size_t SamplesToDo) @@ -80,19 +80,18 @@ struct AngularPoint { }; #define HRTF_DIRECT_DELAY 192 +struct HrtfChannelState { + std::array<float,HRTF_DIRECT_DELAY> mDelay{}; + BandSplitter mSplitter; + float mHfScale{}; + alignas(16) HrirArray mCoeffs{}; +}; struct DirectHrtfState { - struct ChannelData { - std::array<float,HRTF_DIRECT_DELAY> mDelay{}; - BandSplitter mSplitter; - float mHfScale{}; - alignas(16) HrirArray mCoeffs{}; - }; - std::array<float,HRTF_DIRECT_DELAY+BufferLineSize> mTemp; /* HRTF filter state for dry buffer content */ uint mIrSize{0}; - al::FlexArray<ChannelData> mChannels; + al::FlexArray<HrtfChannelState> mChannels; DirectHrtfState(size_t numchans) : mChannels{numchans} { } /** diff --git a/alc/mixer/defs.h b/alc/mixer/defs.h index 299830a8..897b23ff 100644 --- a/alc/mixer/defs.h +++ b/alc/mixer/defs.h @@ -6,7 +6,7 @@ #include "alspan.h" #include "core/bufferline.h" -struct DirectHrtfState; +struct HrtfChannelState; struct HrtfFilter; union InterpState; struct MixHrtfFilter; @@ -79,8 +79,8 @@ void MixHrtfBlend_(const float *InSamples, float2 *AccumSamples, const uint IrSi const HrtfFilter *oldparams, const MixHrtfFilter *newparams, const size_t BufferSize); template<typename InstTag> void MixDirectHrtf_(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, - const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, DirectHrtfState *State, - const size_t BufferSize); + const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, + float *TempBuf, HrtfChannelState *ChanState, const size_t IrSize, const size_t BufferSize); /* Vectorized resampler helpers */ inline void InitPosArrays(uint frac, uint increment, uint *frac_arr, uint *pos_arr, size_t size) diff --git a/alc/mixer/hrtfbase.h b/alc/mixer/hrtfbase.h index 634736c0..4f5b399a 100644 --- a/alc/mixer/hrtfbase.h +++ b/alc/mixer/hrtfbase.h @@ -85,7 +85,7 @@ inline void MixHrtfBlendBase(const float *InSamples, float2 *RESTRICT AccumSampl template<ApplyCoeffsT ApplyCoeffs> inline void MixDirectHrtfBase(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, const al::span<const FloatBufferLine> InSamples, float2 *RESTRICT AccumSamples, - DirectHrtfState *State, const size_t BufferSize) + float *TempBuf, HrtfChannelState *ChanState, const size_t IrSize, const size_t BufferSize) { ASSUME(BufferSize > 0); @@ -98,8 +98,6 @@ inline void MixDirectHrtfBase(FloatBufferLine &LeftOut, FloatBufferLine &RightOu AccumSamples[HRTF_DIRECT_DELAY+i][1] += RightOut[i]; } - const uint_fast32_t IrSize{State->mIrSize}; - auto chan_iter = State->mChannels.begin(); for(const FloatBufferLine &input : InSamples) { /* For dual-band processing, the signal needs extra scaling applied to @@ -112,19 +110,18 @@ inline void MixDirectHrtfBase(FloatBufferLine &LeftOut, FloatBufferLine &RightOu * padding. The delay serves to reduce the error caused by the IIR * filter's phase shift on a partial input. */ - al::span<float> tempbuf{al::assume_aligned<16>(State->mTemp.data()), - HRTF_DIRECT_DELAY+BufferSize}; + al::span<float> tempbuf{al::assume_aligned<16>(TempBuf), HRTF_DIRECT_DELAY+BufferSize}; auto tmpiter = std::reverse_copy(input.begin(), input.begin()+BufferSize, tempbuf.begin()); - std::copy(chan_iter->mDelay.cbegin(), chan_iter->mDelay.cend(), tmpiter); + std::copy(ChanState->mDelay.cbegin(), ChanState->mDelay.cend(), tmpiter); /* Save the unfiltered newest input samples for next time. */ - std::copy_n(tempbuf.begin(), chan_iter->mDelay.size(), chan_iter->mDelay.begin()); + std::copy_n(tempbuf.begin(), ChanState->mDelay.size(), ChanState->mDelay.begin()); /* Apply the all-pass on the reversed signal and reverse the resulting * sample array. This produces the forward response with a backwards * phase shift (+n degrees becomes -n degrees). */ - chan_iter->mSplitter.applyAllpass(tempbuf); + ChanState->mSplitter.applyAllpass(tempbuf); tempbuf = tempbuf.subspan<HRTF_DIRECT_DELAY>(); std::reverse(tempbuf.begin(), tempbuf.end()); @@ -132,17 +129,17 @@ inline void MixDirectHrtfBase(FloatBufferLine &LeftOut, FloatBufferLine &RightOu * forward phase shift, which cancels out with the backwards phase * shift to get the original phase on the scaled signal. */ - chan_iter->mSplitter.processHfScale(tempbuf, chan_iter->mHfScale); + ChanState->mSplitter.processHfScale(tempbuf, ChanState->mHfScale); /* Now apply the HRIR coefficients to this channel. */ - const auto &Coeffs = chan_iter->mCoeffs; + const auto &Coeffs = ChanState->mCoeffs; for(size_t i{0u};i < BufferSize;++i) { const float insample{tempbuf[i]}; ApplyCoeffs(AccumSamples+i, IrSize, Coeffs, insample, insample); } - ++chan_iter; + ++ChanState; } for(size_t i{0u};i < BufferSize;++i) diff --git a/alc/mixer/mixer_c.cpp b/alc/mixer/mixer_c.cpp index 702401e6..c2fdec66 100644 --- a/alc/mixer/mixer_c.cpp +++ b/alc/mixer/mixer_c.cpp @@ -151,9 +151,12 @@ void MixHrtfBlend_<CTag>(const float *InSamples, float2 *AccumSamples, const uin template<> void MixDirectHrtf_<CTag>(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, - const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, DirectHrtfState *State, - const size_t BufferSize) -{ MixDirectHrtfBase<ApplyCoeffs>(LeftOut, RightOut, InSamples, AccumSamples, State, BufferSize); } + const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, + float *TempBuf, HrtfChannelState *ChanState, const size_t IrSize, const size_t BufferSize) +{ + MixDirectHrtfBase<ApplyCoeffs>(LeftOut, RightOut, InSamples, AccumSamples, TempBuf, ChanState, + IrSize, BufferSize); +} template<> diff --git a/alc/mixer/mixer_neon.cpp b/alc/mixer/mixer_neon.cpp index 631b0371..0c3367a9 100644 --- a/alc/mixer/mixer_neon.cpp +++ b/alc/mixer/mixer_neon.cpp @@ -211,9 +211,12 @@ void MixHrtfBlend_<NEONTag>(const float *InSamples, float2 *AccumSamples, const template<> void MixDirectHrtf_<NEONTag>(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, - const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, DirectHrtfState *State, - const size_t BufferSize) -{ MixDirectHrtfBase<ApplyCoeffs>(LeftOut, RightOut, InSamples, AccumSamples, State, BufferSize); } + const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, + float *TempBuf, HrtfChannelState *ChanState, const size_t IrSize, const size_t BufferSize) +{ + MixDirectHrtfBase<ApplyCoeffs>(LeftOut, RightOut, InSamples, AccumSamples, TempBuf, ChanState, + IrSize, BufferSize); +} template<> diff --git a/alc/mixer/mixer_sse.cpp b/alc/mixer/mixer_sse.cpp index c59e8579..6adbc7fb 100644 --- a/alc/mixer/mixer_sse.cpp +++ b/alc/mixer/mixer_sse.cpp @@ -175,9 +175,12 @@ void MixHrtfBlend_<SSETag>(const float *InSamples, float2 *AccumSamples, const u template<> void MixDirectHrtf_<SSETag>(FloatBufferLine &LeftOut, FloatBufferLine &RightOut, - const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, DirectHrtfState *State, - const size_t BufferSize) -{ MixDirectHrtfBase<ApplyCoeffs>(LeftOut, RightOut, InSamples, AccumSamples, State, BufferSize); } + const al::span<const FloatBufferLine> InSamples, float2 *AccumSamples, + float *TempBuf, HrtfChannelState *ChanState, const size_t IrSize, const size_t BufferSize) +{ + MixDirectHrtfBase<ApplyCoeffs>(LeftOut, RightOut, InSamples, AccumSamples, TempBuf, ChanState, + IrSize, BufferSize); +} template<> |