Add a corrective, click-remval sample value offset
This will hopefully be more effective and rebust at removing clicks and pops, particularly from starts and stops in the middle of a sound. Based on an idea by Ben Davis.
This commit is contained in:
@@ -901,6 +901,9 @@ static ALCboolean UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
|
||||
device->SamplesPlayed += oldRate-1;
|
||||
device->SamplesPlayed /= oldRate;
|
||||
|
||||
for(i = 0;i < OUTPUTCHANNELS;i++)
|
||||
device->ClickRemoval[i] = 0.0f;
|
||||
|
||||
for(i = 0;i < device->NumContexts;i++)
|
||||
{
|
||||
ALCcontext *context = device->Contexts[i];
|
||||
|
||||
+11
@@ -534,6 +534,7 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
|
||||
{
|
||||
float (*DryBuffer)[OUTPUTCHANNELS];
|
||||
ALfloat (*Matrix)[OUTPUTCHANNELS];
|
||||
ALfloat *ClickRemoval;
|
||||
const ALuint *ChanMap;
|
||||
ALuint SamplesToDo;
|
||||
ALeffectslot *ALEffectSlot;
|
||||
@@ -597,6 +598,16 @@ ALvoid aluMixData(ALCdevice *device, ALvoid *buffer, ALsizei size)
|
||||
ProcessContext(NULL);
|
||||
|
||||
//Post processing loop
|
||||
ClickRemoval = device->ClickRemoval;
|
||||
for(i = 0;i < SamplesToDo;i++)
|
||||
{
|
||||
for(c = 0;c < OUTPUTCHANNELS;c++)
|
||||
{
|
||||
ClickRemoval[c] -= ClickRemoval[c] / 256.0f;
|
||||
DryBuffer[i][c] += ClickRemoval[c];
|
||||
}
|
||||
}
|
||||
|
||||
ChanMap = device->DevChannels;
|
||||
Matrix = device->ChannelMatrix;
|
||||
switch(device->Format)
|
||||
|
||||
@@ -409,6 +409,8 @@ struct ALCdevice_struct
|
||||
ALfloat PanningLUT[OUTPUTCHANNELS * LUT_NUM];
|
||||
ALuint NumChan;
|
||||
|
||||
ALfloat ClickRemoval[OUTPUTCHANNELS];
|
||||
|
||||
// Contexts created on this device
|
||||
ALCcontext **Contexts;
|
||||
ALuint NumContexts;
|
||||
|
||||
Reference in New Issue
Block a user