diff options
author | Chris Robinson <[email protected]> | 2010-08-14 22:59:55 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2010-08-14 22:59:55 -0700 |
commit | 0c49e5ba56bb9b944ea3a55ce34a7ecc69832f38 (patch) | |
tree | f5ee01a0743b45f87c364253f92daf6234713fe3 /Alc | |
parent | b65bc4523653017dfc7b910ebafcb213714fcb0c (diff) |
Use click removal when starting a source
Diffstat (limited to 'Alc')
-rw-r--r-- | Alc/mixer.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/Alc/mixer.c b/Alc/mixer.c index 08b501c4..2abaa8ce 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -96,6 +96,7 @@ static void MixSource(ALsource *ALSource, ALCcontext *ALContext, ALfloat DrySend[OUTPUTCHANNELS]; ALfloat dryGainStep[OUTPUTCHANNELS]; ALfloat wetGainStep[MAX_SENDS]; + ALfloat *ClickRemoval; ALuint i, j, out; ALfloat value, outsamp; ALbufferlistitem *BufferListItem; @@ -140,6 +141,7 @@ static void MixSource(ALsource *ALSource, ALCcontext *ALContext, WetSend[i] = ALSource->WetGains[i]; } + ClickRemoval = ALContext->Device->ClickRemoval; /* Compute the gain steps for each output channel */ DeviceFreq = ALContext->Device->Frequency; @@ -245,6 +247,20 @@ static void MixSource(ALsource *ALSource, ALCcontext *ALContext, if(Channels == 1) /* Mono */ { #define DO_MIX(resampler) do { \ + if(j == 0 && ALSource->FirstStart) \ + { \ + value = (resampler)(Data[DataPosInt], Data[DataPosInt+1], \ + DataPosFrac); \ + outsamp = lpFilter4PC(DryFilter, 0, value) * -1.0f; \ + ClickRemoval[FRONT_LEFT] += outsamp*DrySend[FRONT_LEFT]; \ + ClickRemoval[FRONT_RIGHT] += outsamp*DrySend[FRONT_RIGHT]; \ + ClickRemoval[SIDE_LEFT] += outsamp*DrySend[SIDE_LEFT]; \ + ClickRemoval[SIDE_RIGHT] += outsamp*DrySend[SIDE_RIGHT]; \ + ClickRemoval[BACK_LEFT] += outsamp*DrySend[BACK_LEFT]; \ + ClickRemoval[BACK_RIGHT] += outsamp*DrySend[BACK_RIGHT]; \ + ClickRemoval[FRONT_CENTER] += outsamp*DrySend[FRONT_CENTER]; \ + ClickRemoval[BACK_CENTER] += outsamp*DrySend[BACK_CENTER]; \ + } \ while(BufferSize--) \ { \ for(i = 0;i < OUTPUTCHANNELS;i++) \ @@ -305,6 +321,20 @@ static void MixSource(ALsource *ALSource, ALCcontext *ALContext, }; #define DO_MIX(resampler) do { \ + if(j == 0 && ALSource->FirstStart) \ + { \ + for(i = 0;i < Channels;i++) \ + { \ + value = (resampler)(Data[DataPosInt*Channels + i], \ + Data[(DataPosInt+1)*Channels + i], \ + DataPosFrac); \ + \ + outsamp = lpFilter2PC(DryFilter, chans[i]*2, value) * -1.0f; \ + ClickRemoval[chans[i]] += outsamp*DrySend[chans[i]]; \ + ClickRemoval[chans2[i*2+0]] += outsamp*DrySend[chans2[i*2+0]]; \ + ClickRemoval[chans2[i*2+1]] += outsamp*DrySend[chans2[i*2+1]]; \ + } \ + } \ const ALfloat scaler = 1.0f/Channels; \ while(BufferSize--) \ { \ @@ -360,6 +390,18 @@ static void MixSource(ALsource *ALSource, ALCcontext *ALContext, }; #define DO_MIX(resampler) do { \ + if(j == 0 && ALSource->FirstStart) \ + { \ + for(i = 0;i < Channels;i++) \ + { \ + value = (resampler)(Data[DataPosInt*Channels + i], \ + Data[(DataPosInt+1)*Channels + i], \ + DataPosFrac); \ + \ + outsamp = lpFilter2PC(DryFilter, chans[i]*2, value) * -1.0f; \ + ClickRemoval[chans[i]] += outsamp*DrySend[chans[i]]; \ + } \ + } \ const ALfloat scaler = 1.0f/Channels; \ while(BufferSize--) \ { \ |