Repack some AmbiUpsampler fields for better access patterns
This commit is contained in:
parent
ba9aba699d
commit
11d815cfd3
@ -278,8 +278,9 @@ void BFormatDec::upSample(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALflo
|
|||||||
|
|
||||||
void AmbiUpsampler::reset(const ALCdevice *device)
|
void AmbiUpsampler::reset(const ALCdevice *device)
|
||||||
{
|
{
|
||||||
mXOver[0].init(400.0f / (float)device->Frequency);
|
mInput[0].XOver.init(400.0f / (float)device->Frequency);
|
||||||
std::fill(std::begin(mXOver)+1, std::end(mXOver), mXOver[0]);
|
for(auto input = std::begin(mInput)+1;input != std::end(mInput);++input)
|
||||||
|
input->XOver = mInput[0].XOver;
|
||||||
|
|
||||||
ALfloat encgains[8][MAX_OUTPUT_CHANNELS];
|
ALfloat encgains[8][MAX_OUTPUT_CHANNELS];
|
||||||
for(size_t k{0u};k < COUNTOF(Ambi3DPoints);k++)
|
for(size_t k{0u};k < COUNTOF(Ambi3DPoints);k++)
|
||||||
@ -299,30 +300,30 @@ void AmbiUpsampler::reset(const ALCdevice *device)
|
|||||||
(device->Dry.NumChannels > 9) ? 3 :
|
(device->Dry.NumChannels > 9) ? 3 :
|
||||||
(device->Dry.NumChannels > 4) ? 2 : 1
|
(device->Dry.NumChannels > 4) ? 2 : 1
|
||||||
);
|
);
|
||||||
mGains.fill({});
|
|
||||||
for(ALsizei i{0};i < 4;i++)
|
for(ALsizei i{0};i < 4;i++)
|
||||||
{
|
{
|
||||||
|
mInput[i].Gains.fill({});
|
||||||
const ALdouble hfscale = static_cast<ALdouble>(Ambi3DDecoderHFScale[i]) / hfscales[i];
|
const ALdouble hfscale = static_cast<ALdouble>(Ambi3DDecoderHFScale[i]) / hfscales[i];
|
||||||
for(ALsizei j{0};j < device->Dry.NumChannels;j++)
|
for(ALsizei j{0};j < device->Dry.NumChannels;j++)
|
||||||
{
|
{
|
||||||
ALdouble gain{0.0};
|
ALdouble gain{0.0};
|
||||||
for(size_t k{0u};k < COUNTOF(Ambi3DDecoder);k++)
|
for(size_t k{0u};k < COUNTOF(Ambi3DDecoder);k++)
|
||||||
gain += (ALdouble)Ambi3DDecoder[k][i] * encgains[k][j];
|
gain += (ALdouble)Ambi3DDecoder[k][i] * encgains[k][j];
|
||||||
mGains[i][HF_BAND][j] = (ALfloat)(gain * hfscale);
|
mInput[i].Gains[HF_BAND][j] = (ALfloat)(gain * hfscale);
|
||||||
mGains[i][LF_BAND][j] = (ALfloat)gain;
|
mInput[i].Gains[LF_BAND][j] = (ALfloat)gain;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AmbiUpsampler::process(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei SamplesToDo)
|
void AmbiUpsampler::process(ALfloat (*OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*InSamples)[BUFFERSIZE], const ALsizei SamplesToDo)
|
||||||
{
|
{
|
||||||
for(ALsizei i{0};i < 4;i++)
|
for(auto input = std::begin(mInput);input != std::end(mInput);++input)
|
||||||
{
|
{
|
||||||
mXOver[i].process(mSamples[HF_BAND], mSamples[LF_BAND], InSamples[i], SamplesToDo);
|
input->XOver.process(mSamples[HF_BAND], mSamples[LF_BAND], *(InSamples++), SamplesToDo);
|
||||||
|
|
||||||
MixSamples(mSamples[HF_BAND], OutChannels, OutBuffer, mGains[i][HF_BAND].data(),
|
MixSamples(mSamples[HF_BAND], OutChannels, OutBuffer, input->Gains[HF_BAND].data(),
|
||||||
mGains[i][HF_BAND].data(), 0, 0, SamplesToDo);
|
input->Gains[HF_BAND].data(), 0, 0, SamplesToDo);
|
||||||
MixSamples(mSamples[LF_BAND], OutChannels, OutBuffer, mGains[i][LF_BAND].data(),
|
MixSamples(mSamples[LF_BAND], OutChannels, OutBuffer, input->Gains[LF_BAND].data(),
|
||||||
mGains[i][LF_BAND].data(), 0, 0, SamplesToDo);
|
input->Gains[LF_BAND].data(), 0, 0, SamplesToDo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,13 +62,14 @@ public:
|
|||||||
private:
|
private:
|
||||||
alignas(16) ALfloat mSamples[sNumBands][BUFFERSIZE];
|
alignas(16) ALfloat mSamples[sNumBands][BUFFERSIZE];
|
||||||
|
|
||||||
BandSplitter mXOver[4];
|
struct {
|
||||||
|
BandSplitter XOver;
|
||||||
std::array<std::array<std::array<ALfloat,MAX_OUTPUT_CHANNELS>,sNumBands>,4> mGains;
|
std::array<std::array<ALfloat,MAX_OUTPUT_CHANNELS>,sNumBands> Gains;
|
||||||
|
} mInput[4];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void reset(const ALCdevice *device);
|
void reset(const ALCdevice *device);
|
||||||
void process(ALfloat (*RESTRICT OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*RESTRICT InSamples)[BUFFERSIZE], const ALsizei SamplesToDo);
|
void process(ALfloat (*OutBuffer)[BUFFERSIZE], const ALsizei OutChannels, const ALfloat (*InSamples)[BUFFERSIZE], const ALsizei SamplesToDo);
|
||||||
|
|
||||||
DEF_NEWDEL(AmbiUpsampler)
|
DEF_NEWDEL(AmbiUpsampler)
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user