Use one send gain per buffer channel

This commit is contained in:
Chris Robinson
2015-10-23 15:11:34 -07:00
parent 4813125d31
commit bca854baac
3 changed files with 18 additions and 13 deletions
+16 -11
View File
@@ -245,26 +245,30 @@ static void UpdateDryStepping(DirectParams *params, ALuint num_chans, ALuint ste
params->Counter = steps;
}
static void UpdateWetStepping(SendParams *params, ALuint steps)
static void UpdateWetStepping(SendParams *params, ALuint num_chans, ALuint steps)
{
ALfloat delta;
ALuint i;
if(steps < 2)
{
params->Gain.Current = params->Gain.Target;
params->Gain.Step = 0.0f;
for(i = 0;i < num_chans;i++)
{
params->Gains[i].Current = params->Gains[i].Target;
params->Gains[i].Step = 0.0f;
}
params->Counter = 0;
return;
}
delta = 1.0f / (ALfloat)steps;
for(i = 0;i < num_chans;i++)
{
ALfloat diff = params->Gain.Target - params->Gain.Current;
ALfloat diff = params->Gains[i].Target - params->Gains[i].Current;
if(fabs(diff) >= GAIN_SILENCE_THRESHOLD)
params->Gain.Step = diff * delta;
params->Gains[i].Step = diff * delta;
else
params->Gain.Step = 0.0f;
params->Gains[i].Step = 0.0f;
}
params->Counter = steps;
}
@@ -625,8 +629,9 @@ ALvoid CalcNonAttnSourceParams(ALvoice *voice, const ALsource *ALSource, const A
}
for(i = 0;i < NumSends;i++)
{
voice->Send[i].Gain.Target = WetGain[i];
UpdateWetStepping(&voice->Send[i], (voice->Send[i].Moving ? 64 : 0));
for(c = 0;c < num_channels;c++)
voice->Send[i].Gains[c].Target = WetGain[i];
UpdateWetStepping(&voice->Send[i], num_channels, (voice->Send[i].Moving ? 64 : 0));
voice->Send[i].Moving = AL_TRUE;
}
@@ -1093,8 +1098,8 @@ ALvoid CalcSourceParams(ALvoice *voice, const ALsource *ALSource, const ALCconte
}
for(i = 0;i < NumSends;i++)
{
voice->Send[i].Gain.Target = WetGain[i];
UpdateWetStepping(&voice->Send[i], (voice->Send[i].Moving ? 64 : 0));
voice->Send[i].Gains[0].Target = WetGain[i];
UpdateWetStepping(&voice->Send[i], 1, (voice->Send[i].Moving ? 64 : 0));
voice->Send[i].Moving = AL_TRUE;
}
+1 -1
View File
@@ -505,7 +505,7 @@ ALvoid MixSource(ALvoice *voice, ALsource *Source, ALCdevice *Device, ALuint Sam
Device->FilteredData, ResampledData, DstBufferSize,
parms->Filters[chan].ActiveType
);
MixSamples(samples, 1, parms->OutBuffer, &parms->Gain,
MixSamples(samples, 1, parms->OutBuffer, &parms->Gains[chan],
parms->Counter, OutPos, DstBufferSize);
}
}
+1 -1
View File
@@ -139,7 +139,7 @@ typedef struct SendParams {
/* Gain control, which applies to all input channels to a single (mono)
* output buffer. */
MixGains Gain;
MixGains Gains[MAX_INPUT_CHANNELS];
} SendParams;