static void EarlyReflection(IDirectSoundBufferImpl* dsb, float in, float *out) { float d[4], v, f[4]; /* Obtain the decayed results of each early delay line. */ d[0] = EarlyDelayLineOut(dsb, 0); d[1] = EarlyDelayLineOut(dsb, 1); d[2] = EarlyDelayLineOut(dsb, 2); d[3] = EarlyDelayLineOut(dsb, 3); /* The following uses a lossless scattering junction from waveguide * theory. It actually amounts to a householder mixing matrix, which * will produce a maximally diffuse response, and means this can probably * be considered a simple feed-back delay network (FDN). * N * --- * \ * v = 2/N / d_i * --- * i=1 */ v = (d[0] + d[1] + d[2] + d[3]) * 0.5f; /* The junction is loaded with the input here. */ v += in; /* Calculate the feed values for the delay lines. */ f[0] = v - d[0]; f[1] = v - d[1]; f[2] = v - d[2]; f[3] = v - d[3]; /* Re-feed the delay lines. */ DelayLineIn(&dsb->eax.Early.Delay[0], dsb->eax.Offset, f[0]); DelayLineIn(&dsb->eax.Early.Delay[1], dsb->eax.Offset, f[1]); DelayLineIn(&dsb->eax.Early.Delay[2], dsb->eax.Offset, f[2]); DelayLineIn(&dsb->eax.Early.Delay[3], dsb->eax.Offset, f[3]); /* Output the results of the junction for all four channels. */ out[0] = dsb->eax.Early.Gain * f[0]; out[1] = dsb->eax.Early.Gain * f[1]; out[2] = dsb->eax.Early.Gain * f[2]; out[3] = dsb->eax.Early.Gain * f[3]; }
// Given an input sample, this function produces four-channel output for the // early reflections. static __inline ALvoid EarlyReflection(ALverbState *State, ALfloat in, ALfloat *out) { ALfloat d[4], v, f[4]; // Obtain the decayed results of each early delay line. d[0] = EarlyDelayLineOut(State, 0); d[1] = EarlyDelayLineOut(State, 1); d[2] = EarlyDelayLineOut(State, 2); d[3] = EarlyDelayLineOut(State, 3); /* The following uses a lossless scattering junction from waveguide * theory. It actually amounts to a householder mixing matrix, which * will produce a maximally diffuse response, and means this can probably * be considered a simple feed-back delay network (FDN). * N * --- * \ * v = 2/N / d_i * --- * i=1 */ v = (d[0] + d[1] + d[2] + d[3]) * 0.5f; // The junction is loaded with the input here. v += in; // Calculate the feed values for the delay lines. f[0] = v - d[0]; f[1] = v - d[1]; f[2] = v - d[2]; f[3] = v - d[3]; // Re-feed the delay lines. DelayLineIn(&State->Early.Delay[0], State->Offset, f[0]); DelayLineIn(&State->Early.Delay[1], State->Offset, f[1]); DelayLineIn(&State->Early.Delay[2], State->Offset, f[2]); DelayLineIn(&State->Early.Delay[3], State->Offset, f[3]); // Output the results of the junction for all four channels. out[0] = State->Early.Gain * f[0]; out[1] = State->Early.Gain * f[1]; out[2] = State->Early.Gain * f[2]; out[3] = State->Early.Gain * f[3]; }
// Delay line output routine for early reflections. static __inline ALfloat EarlyDelayLineOut(ALverbState *State, ALuint index) { return AttenuatedDelayLineOut(&State->Early.Delay[index], State->Offset - State->Early.Offset[index], State->Early.Coeff[index]); } // Given an input sample, this function produces four-channel output for the // early reflections. static __inline ALvoid EarlyReflection(ALverbState *State, ALfloat in, ALfloat *RESTRICT out) { ALfloat d[4], v, f[4]; // Obtain the decayed results of each early delay line. d[0] = EarlyDelayLineOut(State, 0); d[1] = EarlyDelayLineOut(State, 1); d[2] = EarlyDelayLineOut(State, 2); d[3] = EarlyDelayLineOut(State, 3); /* The following uses a lossless scattering junction from waveguide * theory. It actually amounts to a householder mixing matrix, which * will produce a maximally diffuse response, and means this can probably * be considered a simple feed-back delay network (FDN). * N * --- * \ * v = 2/N / d_i * --- * i=1 */