// Perform the non-EAX reverb pass on a given input sample, resulting in // four-channel output. static __inline ALvoid VerbPass(ALverbState *State, ALfloat in, ALfloat *early, ALfloat *late) { ALfloat feed, taps[4]; // Low-pass filter the incoming sample. in = lpFilter2P(&State->LpFilter, 0, in); // Feed the initial delay line. DelayLineIn(&State->Delay, State->Offset, in); // Calculate the early reflection from the first delay tap. in = DelayLineOut(&State->Delay, State->Offset - State->DelayTap[0]); EarlyReflection(State, in, early); // Feed the decorrelator from the energy-attenuated output of the second // delay tap. in = DelayLineOut(&State->Delay, State->Offset - State->DelayTap[1]); feed = in * State->Late.DensityGain; DelayLineIn(&State->Decorrelator, State->Offset, feed); // Calculate the late reverb from the decorrelator taps. taps[0] = feed; taps[1] = DelayLineOut(&State->Decorrelator, State->Offset - State->DecoTap[0]); taps[2] = DelayLineOut(&State->Decorrelator, State->Offset - State->DecoTap[1]); taps[3] = DelayLineOut(&State->Decorrelator, State->Offset - State->DecoTap[2]); LateReverb(State, taps, late); // Step all delays forward one sample. State->Offset++; }
static void VerbPass(IDirectSoundBufferImpl* dsb, float in, float* out) { float feed, late[4], taps[4]; /* Low-pass filter the incoming sample. */ in = lpFilter2P(&dsb->eax.LpFilter, 0, in); /* Feed the initial delay line. */ DelayLineIn(&dsb->eax.Delay, dsb->eax.Offset, in); /* Calculate the early reflection from the first delay tap. */ in = DelayLineOut(&dsb->eax.Delay, dsb->eax.Offset - dsb->eax.DelayTap[0]); EarlyReflection(dsb, in, out); /* Feed the decorrelator from the energy-attenuated output of the second * delay tap. */ in = DelayLineOut(&dsb->eax.Delay, dsb->eax.Offset - dsb->eax.DelayTap[1]); feed = in * dsb->eax.Late.DensityGain; DelayLineIn(&dsb->eax.Decorrelator, dsb->eax.Offset, feed); /* Calculate the late reverb from the decorrelator taps. */ taps[0] = feed; taps[1] = DelayLineOut(&dsb->eax.Decorrelator, dsb->eax.Offset - dsb->eax.DecoTap[0]); taps[2] = DelayLineOut(&dsb->eax.Decorrelator, dsb->eax.Offset - dsb->eax.DecoTap[1]); taps[3] = DelayLineOut(&dsb->eax.Decorrelator, dsb->eax.Offset - dsb->eax.DecoTap[2]); LateReverb(dsb, taps, late); /* Mix early reflections and late reverb. */ out[0] += late[0]; out[1] += late[1]; out[2] += late[2]; out[3] += late[3]; /* Step all delays forward one sample. */ dsb->eax.Offset++; }