Clear mixing target parameters before setting them

This commit is contained in:
Chris Robinson
2018-03-25 18:02:07 -07:00
parent 79eb2ea26e
commit 2475d4652c
+23 -70
View File
@@ -107,6 +107,13 @@ const aluMatrixf IdentityMatrixf = {{
}};
static void ClearArray(ALfloat f[MAX_OUTPUT_CHANNELS])
{
size_t i;
for(i = 0;i < MAX_OUTPUT_CHANNELS;i++)
f[i] = 0.0f;
}
struct ChanMap {
enum Channel channel;
ALfloat angle;
@@ -544,7 +551,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
ALsizei num_channels = 0;
bool isbformat = false;
ALfloat downmix_gain = 1.0f;
ALsizei c, i, j;
ALsizei c, i;
switch(Buffer->FmtChannels)
{
@@ -611,6 +618,18 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
break;
}
for(c = 0;c < num_channels;c++)
{
memset(&voice->Direct.Params[c].Hrtf.Target, 0,
sizeof(voice->Direct.Params[c].Hrtf.Target));
ClearArray(voice->Direct.Params[c].Gains.Target);
}
for(i = 0;i < NumSends;i++)
{
for(c = 0;c < num_channels;c++)
ClearArray(voice->Send[i].Params[c].Gains.Target);
}
voice->Flags &= ~(VOICE_HAS_HRTF | VOICE_HAS_NFC);
if(isbformat)
{
@@ -656,12 +675,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
/* NOTE: W needs to be scaled by sqrt(2) due to FuMa normalization. */
ComputeDryPanGains(&Device->Dry, coeffs, DryGain*1.414213562f,
voice->Direct.Params[0].Gains.Target);
for(c = 1;c < num_channels;c++)
{
for(j = 0;j < MAX_OUTPUT_CHANNELS;j++)
voice->Direct.Params[c].Gains.Target[j] = 0.0f;
}
for(i = 0;i < NumSends;i++)
{
const ALeffectslot *Slot = SendSlots[i];
@@ -669,14 +682,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels,
coeffs, WetGain[i]*1.414213562f, voice->Send[i].Params[0].Gains.Target
);
else
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[0].Gains.Target[j] = 0.0f;
for(c = 1;c < num_channels;c++)
{
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
}
}
}
else
@@ -750,12 +755,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
matrix.m[c], WetGain[i], voice->Send[i].Params[c].Gains.Target
);
}
else
{
for(c = 0;c < num_channels;c++)
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
}
}
}
}
@@ -770,8 +769,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
for(c = 0;c < num_channels;c++)
{
int idx;
for(j = 0;j < MAX_OUTPUT_CHANNELS;j++)
voice->Direct.Params[c].Gains.Target[j] = 0.0f;
if((idx=GetChannelIdxByName(&Device->RealOut, chans[c].channel)) != -1)
voice->Direct.Params[c].Gains.Target[idx] = DryGain;
}
@@ -791,9 +788,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels,
coeffs, WetGain[i], voice->Send[i].Params[c].Gains.Target
);
else
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
}
}
}
@@ -825,10 +819,7 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
for(c = 1;c < num_channels;c++)
{
/* Skip LFE */
if(chans[c].channel == LFE)
memset(&voice->Direct.Params[c].Hrtf.Target, 0,
sizeof(voice->Direct.Params[c].Hrtf.Target));
else
if(chans[c].channel != LFE)
voice->Direct.Params[c].Hrtf.Target = voice->Direct.Params[0].Hrtf.Target;
}
@@ -844,18 +835,12 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
for(c = 0;c < num_channels;c++)
{
/* Skip LFE */
if(chans[c].channel == LFE)
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
else
if(chans[c].channel != LFE)
ComputePanningGainsBF(Slot->ChanMap,
Slot->NumChannels, coeffs, WetGain[i] * downmix_gain,
voice->Send[i].Params[c].Gains.Target
);
}
else
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
}
}
else
@@ -871,13 +856,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
if(chans[c].channel == LFE)
{
/* Skip LFE */
memset(&voice->Direct.Params[c].Hrtf.Target, 0,
sizeof(voice->Direct.Params[c].Hrtf.Target));
for(i = 0;i < NumSends;i++)
{
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
}
continue;
}
@@ -901,9 +879,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels,
coeffs, WetGain[i], voice->Send[i].Params[c].Gains.Target
);
else
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
}
}
}
@@ -958,8 +933,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
/* Special-case LFE */
if(chans[c].channel == LFE)
{
for(j = 0;j < MAX_OUTPUT_CHANNELS;j++)
voice->Direct.Params[c].Gains.Target[j] = 0.0f;
if(Device->Dry.Buffer == Device->RealOut.Buffer)
{
int idx = GetChannelIdxByName(&Device->RealOut, chans[c].channel);
@@ -980,21 +953,12 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
for(c = 0;c < num_channels;c++)
{
/* Skip LFE */
if(chans[c].channel == LFE)
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
else
if(chans[c].channel != LFE)
ComputePanningGainsBF(Slot->ChanMap,
Slot->NumChannels, coeffs, WetGain[i] * downmix_gain,
voice->Send[i].Params[c].Gains.Target
);
}
else
for(c = 0;c < num_channels;c++)
{
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
}
}
}
else
@@ -1026,19 +990,11 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
/* Special-case LFE */
if(chans[c].channel == LFE)
{
for(j = 0;j < MAX_OUTPUT_CHANNELS;j++)
voice->Direct.Params[c].Gains.Target[j] = 0.0f;
if(Device->Dry.Buffer == Device->RealOut.Buffer)
{
int idx = GetChannelIdxByName(&Device->RealOut, chans[c].channel);
if(idx != -1) voice->Direct.Params[c].Gains.Target[idx] = DryGain;
}
for(i = 0;i < NumSends;i++)
{
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
}
continue;
}
@@ -1057,9 +1013,6 @@ static void CalcPanningAndFilters(ALvoice *voice, const ALfloat Distance, const
ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels,
coeffs, WetGain[i], voice->Send[i].Params[c].Gains.Target
);
else
for(j = 0;j < MAX_EFFECT_CHANNELS;j++)
voice->Send[i].Params[c].Gains.Target[j] = 0.0f;
}
}
}