diff options
author | Chris Robinson <[email protected]> | 2013-07-21 18:45:09 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2013-07-21 22:12:50 -0700 |
commit | 2219ce2475dff2b819599b447f9b014be8d3e398 (patch) | |
tree | ce128bbe1f4a8461fad6715bc1a19b893b79927c | |
parent | 393d0eb1383cd2c2194ff638464f36e7680225ce (diff) |
Implement master high-pass filter for EAXREVERB
-rw-r--r-- | Alc/effects/reverb.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/Alc/effects/reverb.c b/Alc/effects/reverb.c index 61edd8e7..5758a09e 100644 --- a/Alc/effects/reverb.c +++ b/Alc/effects/reverb.c @@ -57,8 +57,9 @@ typedef struct ALreverbState { ALfloat *SampleBuffer; ALuint TotalSamples; - // Master effect low-pass filter + // Master effect filters ALfilterState LpFilter; + ALfilterState HpFilter; // EAX only struct { // Modulator delay line. @@ -489,7 +490,7 @@ static inline ALvoid VerbPass(ALreverbState *State, ALfloat in, ALfloat *restric { ALfloat feed, late[4], taps[4]; - // Low-pass filter the incoming sample. + // Filter the incoming sample. in = ALfilterState_processSingle(&State->LpFilter, in); // Feed the initial delay line. @@ -530,6 +531,7 @@ static inline ALvoid EAXVerbPass(ALreverbState *State, ALfloat in, ALfloat *rest // Low-pass filter the incoming sample. in = ALfilterState_processSingle(&State->LpFilter, in); + in = ALfilterState_processSingle(&State->HpFilter, in); // Perform any modulation on the input. in = EAXModulation(State, in); @@ -1083,7 +1085,8 @@ static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *Reflection static ALvoid ALreverbState_update(ALreverbState *State, ALCdevice *Device, const ALeffectslot *Slot) { ALuint frequency = Device->Frequency; - ALfloat freq_scale, cw, x, y, hfRatio; + ALfloat lfscale, hfscale, hfRatio; + ALfloat cw, x, y; if(Slot->EffectType == AL_EFFECT_EAXREVERB && !EmulateEAXReverb) State->IsEax = AL_TRUE; @@ -1092,12 +1095,23 @@ static ALvoid ALreverbState_update(ALreverbState *State, ALCdevice *Device, cons // Calculate the master low-pass filter (from the master effect HF gain). if(State->IsEax) - freq_scale = Slot->EffectProps.Reverb.HFReference / frequency; + { + hfscale = Slot->EffectProps.Reverb.HFReference / frequency; + ALfilterState_setParams(&State->LpFilter, ALfilterType_HighShelf, + Slot->EffectProps.Reverb.GainHF, + hfscale, 0.0f); + lfscale = Slot->EffectProps.Reverb.LFReference / frequency; + ALfilterState_setParams(&State->HpFilter, ALfilterType_LowShelf, + Slot->EffectProps.Reverb.GainLF, + lfscale, 0.0f); + } else - freq_scale = (ALfloat)LOWPASSFREQREF / frequency; - ALfilterState_setParams(&State->LpFilter, ALfilterType_HighShelf, - Slot->EffectProps.Reverb.GainHF, - freq_scale, 0.0f); + { + hfscale = (ALfloat)LOWPASSFREQREF / frequency; + ALfilterState_setParams(&State->LpFilter, ALfilterType_HighShelf, + Slot->EffectProps.Reverb.GainHF, + hfscale, 0.0f); + } if(State->IsEax) { @@ -1134,7 +1148,7 @@ static ALvoid ALreverbState_update(ALreverbState *State, ALCdevice *Device, cons Slot->EffectProps.Reverb.AirAbsorptionGainHF, Slot->EffectProps.Reverb.DecayTime); - cw = cosf(F_PI*2.0f * freq_scale); + cw = cosf(F_PI*2.0f * hfscale); // Update the late lines. UpdateLateLines(Slot->EffectProps.Reverb.Gain, Slot->EffectProps.Reverb.LateReverbGain, x, Slot->EffectProps.Reverb.Density, Slot->EffectProps.Reverb.DecayTime, @@ -1198,6 +1212,7 @@ static ALeffectState *ALreverbStateFactory_create(ALreverbStateFactory *factory) state->SampleBuffer = NULL; ALfilterState_clear(&state->LpFilter); + ALfilterState_clear(&state->HpFilter); state->Mod.Delay.Mask = 0; state->Mod.Delay.Line = NULL; |