Avoid passing DirectHrtfState to MixDirectHrtf
This commit is contained in:
+3
-3
@@ -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)
|
||||
|
||||
+7
-8
@@ -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} { }
|
||||
/**
|
||||
|
||||
+3
-3
@@ -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)
|
||||
|
||||
+8
-11
@@ -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)
|
||||
|
||||
@@ -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<>
|
||||
|
||||
@@ -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<>
|
||||
|
||||
@@ -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<>
|
||||
|
||||
Reference in New Issue
Block a user