diff options
author | Chris Robinson <[email protected]> | 2018-01-13 09:58:47 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2018-01-13 09:58:47 -0800 |
commit | 2b968766b9610cab51721e77e6402ce2652416b1 (patch) | |
tree | ca2b6d5470b6011b74f73e8708876521b4b179eb /Alc/effects | |
parent | 78cb70a5f9f2782e1335aea03168ffee2fea0122 (diff) |
Pre-apply the T60 filter midgain to the HF filter coeffs
Diffstat (limited to 'Alc/effects')
-rw-r--r-- | Alc/effects/reverb.c | 68 |
1 files changed, 30 insertions, 38 deletions
diff --git a/Alc/effects/reverb.c b/Alc/effects/reverb.c index 49362e2a..eb0d0684 100644 --- a/Alc/effects/reverb.c +++ b/Alc/effects/reverb.c @@ -319,7 +319,6 @@ typedef struct ALreverbState { struct { ALfloat LFCoeffs[3]; ALfloat HFCoeffs[3]; - ALfloat MidCoeff; /* The LF and HF filters keep a state of the last input and last * output sample. */ @@ -431,8 +430,6 @@ static void ALreverbState_Construct(ALreverbState *state) state->Late.Filters[i].LFCoeffs[j] = 0.0f; state->Late.Filters[i].HFCoeffs[j] = 0.0f; } - state->Late.Filters[i].MidCoeff = 0.0f; - state->Late.Filters[i].States[0][0] = 0.0f; state->Late.Filters[i].States[0][1] = 0.0f; state->Late.Filters[i].States[1][0] = 0.0f; @@ -924,7 +921,7 @@ static inline void CalcHighShelfCoeffs(const ALfloat gain, const ALfloat w, ALfl static void CalcT60DampingCoeffs(const ALfloat length, const ALfloat lfDecayTime, const ALfloat mfDecayTime, const ALfloat hfDecayTime, const ALfloat lfW, const ALfloat hfW, ALfloat lfcoeffs[3], - ALfloat hfcoeffs[3], ALfloat *midcoeff) + ALfloat hfcoeffs[3]) { ALfloat lfGain = CalcDecayCoeff(length, lfDecayTime); ALfloat mfGain = CalcDecayCoeff(length, mfDecayTime); @@ -932,51 +929,46 @@ static void CalcT60DampingCoeffs(const ALfloat length, const ALfloat lfDecayTime if(lfGain < mfGain) { + CalcHighpassCoeffs(lfGain / mfGain, lfW, lfcoeffs); if(mfGain < hfGain) { - CalcLowShelfCoeffs(mfGain / hfGain, hfW, lfcoeffs); - CalcHighpassCoeffs(lfGain / mfGain, lfW, hfcoeffs); - *midcoeff = hfGain; + CalcLowShelfCoeffs(mfGain / hfGain, hfW, hfcoeffs); + hfcoeffs[0] *= hfGain; hfcoeffs[1] *= hfGain; } else if(mfGain > hfGain) { - CalcHighpassCoeffs(lfGain / mfGain, lfW, lfcoeffs); CalcLowpassCoeffs(hfGain / mfGain, hfW, hfcoeffs); - *midcoeff = mfGain; + hfcoeffs[0] *= mfGain; hfcoeffs[1] *= mfGain; } else { - lfcoeffs[0] = 1.0f; - lfcoeffs[1] = 0.0f; - lfcoeffs[2] = 0.0f; - CalcHighpassCoeffs(lfGain / mfGain, lfW, hfcoeffs); - *midcoeff = mfGain; + hfcoeffs[0] = mfGain; + hfcoeffs[1] = 0.0f; + hfcoeffs[2] = 0.0f; } } else if(lfGain > mfGain) { + CalcHighShelfCoeffs(mfGain / lfGain, lfW, lfcoeffs); if(mfGain < hfGain) { ALfloat hg = mfGain / lfGain; ALfloat lg = mfGain / hfGain; + ALfloat mg = maxf(lfGain, hfGain) / maxf(hg, lg); - CalcHighShelfCoeffs(hg, lfW, lfcoeffs); CalcLowShelfCoeffs(lg, hfW, hfcoeffs); - *midcoeff = maxf(lfGain, hfGain) / maxf(hg, lg); + hfcoeffs[0] *= mg; hfcoeffs[1] *= mg; } else if(mfGain > hfGain) { - CalcHighShelfCoeffs(mfGain / lfGain, lfW, lfcoeffs); CalcLowpassCoeffs(hfGain / mfGain, hfW, hfcoeffs); - *midcoeff = lfGain; + hfcoeffs[0] *= lfGain; hfcoeffs[1] *= lfGain; } else { - lfcoeffs[0] = 1.0f; - lfcoeffs[1] = 0.0f; - lfcoeffs[2] = 0.0f; - CalcHighShelfCoeffs(mfGain / lfGain, lfW, hfcoeffs); - *midcoeff = lfGain; + hfcoeffs[0] = lfGain; + hfcoeffs[1] = 0.0f; + hfcoeffs[2] = 0.0f; } } else @@ -988,19 +980,18 @@ static void CalcT60DampingCoeffs(const ALfloat length, const ALfloat lfDecayTime if(mfGain < hfGain) { CalcLowShelfCoeffs(mfGain / hfGain, hfW, hfcoeffs); - *midcoeff = hfGain; + hfcoeffs[0] *= hfGain; hfcoeffs[1] *= hfGain; } else if(mfGain > hfGain) { CalcLowpassCoeffs(hfGain / mfGain, hfW, hfcoeffs); - *midcoeff = mfGain; + hfcoeffs[0] *= mfGain; hfcoeffs[1] *= mfGain; } else { - hfcoeffs[3] = 1.0f; - hfcoeffs[4] = 0.0f; - hfcoeffs[5] = 0.0f; - *midcoeff = mfGain; + hfcoeffs[0] = mfGain; + hfcoeffs[1] = 0.0f; + hfcoeffs[2] = 0.0f; } } } @@ -1162,8 +1153,7 @@ static ALvoid UpdateLateLines(const ALfloat density, const ALfloat diffusion, co /* Calculate the T60 damping coefficients for each line. */ CalcT60DampingCoeffs(length, lfDecayTime, mfDecayTime, hfDecayTime, lfW, hfW, State->Late.Filters[i].LFCoeffs, - State->Late.Filters[i].HFCoeffs, - &State->Late.Filters[i].MidCoeff); + State->Late.Filters[i].HFCoeffs); } } @@ -1386,7 +1376,8 @@ static inline ALfloat DelayLineOut(const DelayLineI *Delay, const ALsizei offset static inline ALfloat FadedDelayLineOut(const DelayLineI *Delay, const ALsizei off0, const ALsizei off1, const ALsizei c, const ALfloat mu) { - return lerp(Delay->Line[off0&Delay->Mask][c], Delay->Line[off1&Delay->Mask][c], mu); + return Delay->Line[off0&Delay->Mask][c]*(1.0f-mu) + + Delay->Line[off1&Delay->Mask][c]*( mu); } #define UnfadedDelayLineOut(d, o0, o1, c, mu) DelayLineOut(d, o0, c) @@ -1615,12 +1606,13 @@ static inline ALfloat FirstOrderFilter(const ALfloat in, const ALfloat coeffs[3] /* Applies the two T60 damping filter sections. */ static inline ALfloat LateT60Filter(const ALsizei index, const ALfloat in, ALreverbState *State) { - ALfloat out = FirstOrderFilter(in, State->Late.Filters[index].LFCoeffs, - State->Late.Filters[index].States[0]); - - return State->Late.Filters[index].MidCoeff * - FirstOrderFilter(out, State->Late.Filters[index].HFCoeffs, - State->Late.Filters[index].States[1]); + return FirstOrderFilter( + FirstOrderFilter( + in, State->Late.Filters[index].LFCoeffs, + State->Late.Filters[index].States[0] + ), State->Late.Filters[index].HFCoeffs, + State->Late.Filters[index].States[1] + ); } /* This generates the reverb tail using a modified feed-back delay network |