diff options
author | Chris Robinson <[email protected]> | 2013-05-27 19:14:02 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2013-05-27 19:14:02 -0700 |
commit | feeec3433377d46f71771c3930e5e00bf9834feb (patch) | |
tree | 7f35880242639f791f65753d341e923b73e877c6 /Alc | |
parent | bcf4842eb3f226faa83e2343e2492dda31386c20 (diff) |
Use ALfilterState for the source direct and send filters
Diffstat (limited to 'Alc')
-rw-r--r-- | Alc/ALu.c | 39 | ||||
-rw-r--r-- | Alc/mixer.c | 10 |
2 files changed, 22 insertions, 27 deletions
@@ -254,8 +254,6 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext) ALboolean DirectChannels; ALfloat hwidth = 0.0f; ALfloat Pitch; - ALfloat coeff; - ALfloat cw; ALint i, c; /* Get device properties */ @@ -453,21 +451,20 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext) ALSource->Params.Send[i].Gain = WetGain[i]; } - /* Update filter coefficients. Calculations based on the I3DL2 - * spec. */ - cw = cosf(F_PI*2.0f * LOWPASSFREQREF / Frequency); - - /* We use two chained one-pole filters, so we need to take the - * square root of the squared gain, which is the same as the base - * gain. */ - coeff = lpCoeffCalc(DryGainHF, cw); - for(c = 0;c < num_channels;c++) - ALSource->Params.Direct.Filter[c].coeff = lpCoeffCalc(DryGainHF, cw); + { + ALfloat gain = maxf(0.001f, DryGainHF); + for(c = 0;c < num_channels;c++) + ALfilterState_setParams(&ALSource->Params.Direct.Filter[c], + ALfilterType_LowPass, gain, + (ALfloat)LOWPASSFREQREF/Frequency, 0.0f); + } for(i = 0;i < NumSends;i++) { - coeff = lpCoeffCalc(WetGainHF[i], cw); + ALfloat gain = maxf(0.001f, WetGainHF[i]); for(c = 0;c < num_channels;c++) - ALSource->Params.Send[i].Filter[c].coeff = coeff; + ALfilterState_setParams(&ALSource->Params.Send[i].Filter[c], + ALfilterType_LowPass, gain, + (ALfloat)LOWPASSFREQREF/Frequency, 0.0f); } } @@ -499,7 +496,6 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext) ALfloat Pitch; ALuint Frequency; ALint NumSends; - ALfloat cw; ALint i, j; DryGainHF = 1.0f; @@ -904,15 +900,14 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext) for(i = 0;i < NumSends;i++) ALSource->Params.Send[i].Gain = WetGain[i]; - /* Update filter coefficients. */ - cw = cosf(F_PI*2.0f * LOWPASSFREQREF / Frequency); - ALSource->Params.Direct.Filter[0].coeff = lpCoeffCalc(DryGainHF, cw); + ALfilterState_setParams(&ALSource->Params.Direct.Filter[0], + ALfilterType_LowPass, maxf(0.001f, DryGainHF), + (ALfloat)LOWPASSFREQREF/Frequency, 0.0f); for(i = 0;i < NumSends;i++) - { - ALfloat a = lpCoeffCalc(WetGainHF[i], cw); - ALSource->Params.Send[i].Filter[0].coeff = a; - } + ALfilterState_setParams(&ALSource->Params.Send[i].Filter[0], + ALfilterType_LowPass, maxf(0.001f, WetGainHF[i]), + (ALfloat)LOWPASSFREQREF/Frequency, 0.0f); } diff --git a/Alc/mixer.c b/Alc/mixer.c index 58e3a535..b9dcc1c1 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -84,13 +84,13 @@ static void SilenceData(ALfloat *dst, ALuint samples) } -static void Filter2P(FILTER *filter, ALfloat *restrict dst, const ALfloat *restrict src, +static void DoFilter(ALfilterState *filter, ALfloat *restrict dst, const ALfloat *restrict src, ALuint numsamples) { ALuint i; for(i = 0;i < numsamples;i++) - dst[i] = lpFilter2P(filter, src[i]); - dst[i] = lpFilter2PC(filter, src[i]); + dst[i] = ALfilterState_processSingle(filter, src[i]); + dst[i] = ALfilterState_processSingleC(filter, src[i]); } @@ -328,7 +328,7 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo) { DirectParams *directparms = &Source->Params.Direct; - Filter2P(&directparms->Filter[chan], SrcData, ResampledData, + DoFilter(&directparms->Filter[chan], SrcData, ResampledData, DstBufferSize); Source->Params.DryMix(directparms, SrcData, chan, OutPos, SamplesToDo, DstBufferSize); @@ -340,7 +340,7 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo) if(!sendparms->Slot) continue; - Filter2P(&sendparms->Filter[chan], SrcData, ResampledData, + DoFilter(&sendparms->Filter[chan], SrcData, ResampledData, DstBufferSize); Source->Params.WetMix(sendparms, SrcData, OutPos, SamplesToDo, DstBufferSize); |