aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2013-05-27 19:14:02 -0700
committerChris Robinson <[email protected]>2013-05-27 19:14:02 -0700
commitfeeec3433377d46f71771c3930e5e00bf9834feb (patch)
tree7f35880242639f791f65753d341e923b73e877c6 /Alc
parentbcf4842eb3f226faa83e2343e2492dda31386c20 (diff)
Use ALfilterState for the source direct and send filters
Diffstat (limited to 'Alc')
-rw-r--r--Alc/ALu.c39
-rw-r--r--Alc/mixer.c10
2 files changed, 22 insertions, 27 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 4d6c46da..70b5c80a 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -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);