// Given an input sample, this function mixes echo into the four-channel late // reverb. static __inline ALvoid EAXEcho(ALverbState *State, ALfloat in, ALfloat *late) { ALfloat out, feed; // Get the latest attenuated echo sample for output. feed = AttenuatedDelayLineOut(&State->Echo.Delay, State->Offset - State->Echo.Offset, State->Echo.Coeff); // Mix the output into the late reverb channels. out = State->Echo.MixCoeff[0] * feed; late[0] = (State->Echo.MixCoeff[1] * late[0]) + out; late[1] = (State->Echo.MixCoeff[1] * late[1]) + out; late[2] = (State->Echo.MixCoeff[1] * late[2]) + out; late[3] = (State->Echo.MixCoeff[1] * late[3]) + out; // Mix the energy-attenuated input with the output and pass it through // the echo low-pass filter. feed += State->Echo.DensityGain * in; feed = lerp(feed, State->Echo.LpSample, State->Echo.LpCoeff); State->Echo.LpSample = feed; // Then the echo all-pass filter. feed = AllpassInOut(&State->Echo.ApDelay, State->Offset - State->Echo.ApOffset, State->Offset, feed, State->Echo.ApFeedCoeff, State->Echo.ApCoeff); // Feed the delay with the mixed and filtered sample. DelayLineIn(&State->Echo.Delay, State->Offset, feed); }
static float LateAllPassInOut(IDirectSoundBufferImpl* dsb, unsigned int index, float in) { return AllpassInOut(&dsb->eax.Late.ApDelay[index], dsb->eax.Offset - dsb->eax.Late.ApOffset[index], dsb->eax.Offset, in, dsb->eax.Late.ApFeedCoeff, dsb->eax.Late.ApCoeff[index]); }
// All-pass input/output routine for late reverb. static __inline ALfloat LateAllPassInOut(ALverbState *State, ALuint index, ALfloat in) { return AllpassInOut(&State->Late.ApDelay[index], State->Offset - State->Late.ApOffset[index], State->Offset, in, State->Late.ApFeedCoeff, State->Late.ApCoeff[index]); }