aboutsummaryrefslogtreecommitdiffstats
path: root/alc
diff options
context:
space:
mode:
authorChris Robinson <chris.kcat@gmail.com>2020-12-12 13:52:14 -0800
committerChris Robinson <chris.kcat@gmail.com>2020-12-12 13:52:14 -0800
commit176bc8a8354fe3b79c6a109d61c1e3e79898dfe6 (patch)
tree693ee820a36795c9a41bc2765db183736e441168 /alc
parent191fe888b4bf55aac539315c75ed7f6d15f2ea7e (diff)
Avoid passing DirectHrtfState to MixDirectHrtf
Diffstat (limited to 'alc')
-rw-r--r--alc/alu.cpp6
-rw-r--r--alc/hrtf.h15
-rw-r--r--alc/mixer/defs.h6
-rw-r--r--alc/mixer/hrtfbase.h19
-rw-r--r--alc/mixer/mixer_c.cpp9
-rw-r--r--alc/mixer/mixer_neon.cpp9
-rw-r--r--alc/mixer/mixer_sse.cpp9
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)
diff --git a/alc/hrtf.h b/alc/hrtf.h
index 025bfa92..e0e406dc 100644
--- a/alc/hrtf.h
+++ b/alc/hrtf.h
@@ -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<>