Improve some post-process handlers

This commit is contained in:
Chris Robinson 2018-12-26 12:46:01 -08:00
parent 5cc545f157
commit 3b9defa4af

View File

@ -124,49 +124,49 @@ inline HrtfDirectMixerFunc SelectHrtfMixer(void)
void ProcessHrtf(ALCdevice *device, ALsizei SamplesToDo) void ProcessHrtf(ALCdevice *device, ALsizei SamplesToDo)
{ {
if(device->AmbiUp) const ALsizei num_chans{device->Dry.NumChannels};
device->AmbiUp->process(device->Dry.Buffer, device->Dry.NumChannels, ASSUME(num_chans > 0);
device->FOAOut.Buffer, SamplesToDo
);
int lidx{GetChannelIdxByName(device->RealOut, FrontLeft)}; if(AmbiUpsampler *ambiup{device->AmbiUp.get()})
int ridx{GetChannelIdxByName(device->RealOut, FrontRight)}; ambiup->process(device->Dry.Buffer, num_chans, device->FOAOut.Buffer, SamplesToDo);
assert(lidx != -1 && ridx != -1);
/* HRTF is stereo output only. */
const int lidx{(device->RealOut.ChannelName[0]==FrontLeft) ? 0 : 1};
const int ridx{(device->RealOut.ChannelName[1]==FrontRight) ? 1 : 0};
ALfloat *LeftOut{device->RealOut.Buffer[lidx]};
ALfloat *RightOut{device->RealOut.Buffer[ridx]};
const ALfloat (*Input)[BUFFERSIZE]{device->Dry.Buffer};
DirectHrtfState *state{device->mHrtfState.get()}; DirectHrtfState *state{device->mHrtfState.get()};
for(ALsizei c{0};c < device->Dry.NumChannels;c++) for(ALsizei c{0};c < num_chans;c++)
{ {
MixDirectHrtf(device->RealOut.Buffer[lidx], device->RealOut.Buffer[ridx], MixDirectHrtf(LeftOut, RightOut, Input[c], state->Offset, state->IrSize,
device->Dry.Buffer[c], state->Offset, state->IrSize, state->Chan[c].Coeffs, state->Chan[c].Values, SamplesToDo);
state->Chan[c].Coeffs, state->Chan[c].Values, SamplesToDo
);
} }
state->Offset += SamplesToDo; state->Offset += SamplesToDo;
} }
void ProcessAmbiDec(ALCdevice *device, ALsizei SamplesToDo) void ProcessAmbiDec(ALCdevice *device, ALsizei SamplesToDo)
{ {
BFormatDec *ambidec{device->AmbiDecoder.get()};
if(device->Dry.Buffer != device->FOAOut.Buffer) if(device->Dry.Buffer != device->FOAOut.Buffer)
device->AmbiDecoder->upSample(device->Dry.Buffer, device->FOAOut.Buffer, ambidec->upSample(device->Dry.Buffer, device->FOAOut.Buffer, device->FOAOut.NumChannels,
device->FOAOut.NumChannels, SamplesToDo SamplesToDo);
); ambidec->process(device->RealOut.Buffer, device->RealOut.NumChannels, device->Dry.Buffer,
device->AmbiDecoder->process(device->RealOut.Buffer, device->RealOut.NumChannels, SamplesToDo);
device->Dry.Buffer, SamplesToDo
);
} }
void ProcessAmbiUp(ALCdevice *device, ALsizei SamplesToDo) void ProcessAmbiUp(ALCdevice *device, ALsizei SamplesToDo)
{ {
device->AmbiUp->process(device->RealOut.Buffer, device->RealOut.NumChannels, device->AmbiUp->process(device->RealOut.Buffer, device->RealOut.NumChannels,
device->FOAOut.Buffer, SamplesToDo device->FOAOut.Buffer, SamplesToDo);
);
} }
void ProcessUhj(ALCdevice *device, ALsizei SamplesToDo) void ProcessUhj(ALCdevice *device, ALsizei SamplesToDo)
{ {
int lidx = GetChannelIdxByName(device->RealOut, FrontLeft); /* UHJ is stereo output only. */
int ridx = GetChannelIdxByName(device->RealOut, FrontRight); const int lidx{(device->RealOut.ChannelName[0]==FrontLeft) ? 0 : 1};
assert(lidx != -1 && ridx != -1); const int ridx{(device->RealOut.ChannelName[1]==FrontRight) ? 1 : 0};
/* Encode to stereo-compatible 2-channel UHJ output. */ /* Encode to stereo-compatible 2-channel UHJ output. */
EncodeUhj2(device->Uhj_Encoder.get(), EncodeUhj2(device->Uhj_Encoder.get(),
@ -177,9 +177,9 @@ void ProcessUhj(ALCdevice *device, ALsizei SamplesToDo)
void ProcessBs2b(ALCdevice *device, ALsizei SamplesToDo) void ProcessBs2b(ALCdevice *device, ALsizei SamplesToDo)
{ {
int lidx = GetChannelIdxByName(device->RealOut, FrontLeft); /* BS2B is stereo output only. */
int ridx = GetChannelIdxByName(device->RealOut, FrontRight); const int lidx{(device->RealOut.ChannelName[0]==FrontLeft) ? 0 : 1};
assert(lidx != -1 && ridx != -1); const int ridx{(device->RealOut.ChannelName[1]==FrontRight) ? 1 : 0};
/* Apply binaural/crossfeed filter */ /* Apply binaural/crossfeed filter */
bs2b_cross_feed(device->Bs2b.get(), device->RealOut.Buffer[lidx], bs2b_cross_feed(device->Bs2b.get(), device->RealOut.Buffer[lidx],