aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/ALu.c
diff options
context:
space:
mode:
Diffstat (limited to 'Alc/ALu.c')
-rw-r--r--Alc/ALu.c125
1 files changed, 74 insertions, 51 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index 1f8f04f9..9102fbf1 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -413,20 +413,28 @@ ALvoid CalcNonAttnSourceParams(ALactivesource *src, const ALCcontext *ALContext)
if(DirectChannels != AL_FALSE)
{
- ALfloat (*Matrix)[MaxChannels] = src->Direct.Mix.Gains.Target;
for(i = 0;i < MAX_INPUT_CHANNELS;i++)
{
- for(c = 0;c < MaxChannels;c++)
- Matrix[i][c] = 0.0f;
+ ALfloat *restrict Current = src->Direct.Mix.Gains[i].Current;
+ ALfloat *restrict Step = src->Direct.Mix.Gains[i].Step;
+ ALfloat *restrict Target = src->Direct.Mix.Gains[i].Target;
+ for(j = 0;j < MaxChannels;j++)
+ {
+ Current[j] = 0.0f;
+ Step[j] = 1.0f;
+ Target[j] = 0.0f;
+ }
}
+
for(c = 0;c < num_channels;c++)
{
+ ALfloat *restrict Target = src->Direct.Mix.Gains[c].Target;
for(i = 0;i < (ALint)Device->NumChan;i++)
{
enum Channel chan = Device->Speaker2Chan[i];
if(chan == chans[c].channel)
{
- Matrix[c][chan] = DryGain;
+ Target[chan] = DryGain;
break;
}
}
@@ -434,33 +442,35 @@ ALvoid CalcNonAttnSourceParams(ALactivesource *src, const ALCcontext *ALContext)
if(src->Direct.Moving)
{
- ALfloat (*restrict Current)[MaxChannels] = src->Direct.Mix.Gains.Current;
- ALfloat (*restrict Step)[MaxChannels] = src->Direct.Mix.Gains.Step;
for(i = 0;i < MAX_INPUT_CHANNELS;i++)
{
+ ALfloat *restrict Current = src->Direct.Mix.Gains[i].Current;
+ ALfloat *restrict Step = src->Direct.Mix.Gains[i].Step;
+ ALfloat *restrict Target = src->Direct.Mix.Gains[i].Target;
for(j = 0;j < MaxChannels;j++)
{
- ALfloat cur = maxf(Current[i][j], FLT_EPSILON);
- ALfloat trg = maxf(Matrix[i][j], FLT_EPSILON);
+ ALfloat cur = maxf(Current[j], FLT_EPSILON);
+ ALfloat trg = maxf(Target[j], FLT_EPSILON);
if(fabs(trg - cur) >= GAIN_SILENCE_THRESHOLD)
- Step[i][j] = powf(trg/cur, 1.0f/64.0f);
+ Step[j] = powf(trg/cur, 1.0f/64.0f);
else
- Step[i][j] = 1.0f;
- Current[i][j] = cur;
+ Step[j] = 1.0f;
+ Current[j] = cur;
}
}
src->Direct.Counter = 64;
}
else
{
- ALfloat (*restrict Current)[MaxChannels] = src->Direct.Mix.Gains.Current;
- ALfloat (*restrict Step)[MaxChannels] = src->Direct.Mix.Gains.Step;
for(i = 0;i < MAX_INPUT_CHANNELS;i++)
{
+ ALfloat *restrict Current = src->Direct.Mix.Gains[i].Current;
+ ALfloat *restrict Step = src->Direct.Mix.Gains[i].Step;
+ ALfloat *restrict Target = src->Direct.Mix.Gains[i].Target;
for(j = 0;j < MaxChannels;j++)
{
- Current[i][j] = Matrix[i][j];
- Step[i][j] = 1.0f;
+ Current[j] = Target[j];
+ Step[j] = 1.0f;
}
}
src->Direct.Counter = 0;
@@ -504,55 +514,63 @@ ALvoid CalcNonAttnSourceParams(ALactivesource *src, const ALCcontext *ALContext)
}
else
{
- ALfloat (*Matrix)[MaxChannels] = src->Direct.Mix.Gains.Target;
for(i = 0;i < MAX_INPUT_CHANNELS;i++)
{
- for(c = 0;c < MaxChannels;c++)
- Matrix[i][c] = 0.0f;
+ ALfloat *restrict Current = src->Direct.Mix.Gains[i].Current;
+ ALfloat *restrict Step = src->Direct.Mix.Gains[i].Step;
+ ALfloat *restrict Target = src->Direct.Mix.Gains[i].Target;
+ for(j = 0;j < MaxChannels;j++)
+ {
+ Current[j] = 0.0f;
+ Step[j] = 1.0f;
+ Target[j] = 0.0f;
+ }
}
DryGain *= lerp(1.0f, 1.0f/sqrtf((float)Device->NumChan), hwidth/F_PI);
for(c = 0;c < num_channels;c++)
{
+ ALfloat *restrict Target = src->Direct.Mix.Gains[c].Target;
/* Special-case LFE */
if(chans[c].channel == LFE)
{
- Matrix[c][chans[c].channel] = DryGain;
+ Target[chans[c].channel] = DryGain;
continue;
}
- ComputeAngleGains(Device, chans[c].angle, hwidth, DryGain,
- Matrix[c]);
+ ComputeAngleGains(Device, chans[c].angle, hwidth, DryGain, Target);
}
if(src->Direct.Moving)
{
- ALfloat (*restrict Current)[MaxChannels] = src->Direct.Mix.Gains.Current;
- ALfloat (*restrict Step)[MaxChannels] = src->Direct.Mix.Gains.Step;
for(i = 0;i < MAX_INPUT_CHANNELS;i++)
{
+ ALfloat *restrict Current = src->Direct.Mix.Gains[i].Current;
+ ALfloat *restrict Step = src->Direct.Mix.Gains[i].Step;
+ ALfloat *restrict Target = src->Direct.Mix.Gains[i].Target;
for(j = 0;j < MaxChannels;j++)
{
- ALfloat trg = maxf(Matrix[i][j], FLT_EPSILON);
- ALfloat cur = maxf(Current[i][j], FLT_EPSILON);
+ ALfloat trg = maxf(Target[j], FLT_EPSILON);
+ ALfloat cur = maxf(Current[j], FLT_EPSILON);
if(fabs(trg - cur) >= GAIN_SILENCE_THRESHOLD)
- Step[i][j] = powf(trg/cur, 1.0f/64.0f);
+ Step[j] = powf(trg/cur, 1.0f/64.0f);
else
- Step[i][j] = 1.0f;
- Current[i][j] = cur;
+ Step[j] = 1.0f;
+ Current[j] = cur;
}
}
src->Direct.Counter = 64;
}
else
{
- ALfloat (*restrict Current)[MaxChannels] = src->Direct.Mix.Gains.Current;
- ALfloat (*restrict Step)[MaxChannels] = src->Direct.Mix.Gains.Step;
for(i = 0;i < MAX_INPUT_CHANNELS;i++)
{
+ ALfloat *restrict Current = src->Direct.Mix.Gains[i].Current;
+ ALfloat *restrict Step = src->Direct.Mix.Gains[i].Step;
+ ALfloat *restrict Target = src->Direct.Mix.Gains[i].Target;
for(j = 0;j < MaxChannels;j++)
{
- Current[i][j] = Matrix[i][j];
- Step[i][j] = 1.0f;
+ Current[j] = Target[j];
+ Step[j] = 1.0f;
}
}
src->Direct.Counter = 0;
@@ -1028,15 +1046,23 @@ ALvoid CalcSourceParams(ALactivesource *src, const ALCcontext *ALContext)
}
else
{
- ALfloat (*Matrix)[MaxChannels] = src->Direct.Mix.Gains.Target;
+ ALfloat *restrict Target;
ALfloat DirGain = 0.0f;
ALfloat AmbientGain;
for(i = 0;i < MAX_INPUT_CHANNELS;i++)
{
+ ALfloat *restrict Current = src->Direct.Mix.Gains[i].Current;
+ ALfloat *restrict Step = src->Direct.Mix.Gains[i].Step;
+ Target = src->Direct.Mix.Gains[i].Target;
for(j = 0;j < MaxChannels;j++)
- Matrix[i][j] = 0.0f;
+ {
+ Current[j] = 0.0f;
+ Step[j] = 1.0f;
+ Target[j] = 0.0f;
+ }
}
+ Target = src->Direct.Mix.Gains[0].Target;
/* Normalize the length, and compute panned gains. */
if(Distance > FLT_EPSILON)
@@ -1048,7 +1074,7 @@ ALvoid CalcSourceParams(ALactivesource *src, const ALCcontext *ALContext)
DirGain = sqrtf(Position[0]*Position[0] + Position[2]*Position[2]);
ComputeAngleGains(Device, atan2f(Position[0], -Position[2]*ZScale), 0.0f,
- DryGain*DirGain, Matrix[0]);
+ DryGain*DirGain, Target);
}
/* Adjustment for vertical offsets. Not the greatest, but simple
@@ -1057,36 +1083,33 @@ ALvoid CalcSourceParams(ALactivesource *src, const ALCcontext *ALContext)
for(i = 0;i < (ALint)Device->NumChan;i++)
{
enum Channel chan = Device->Speaker2Chan[i];
- Matrix[0][chan] = maxf(Matrix[0][chan], AmbientGain);
+ Target[chan] = maxf(Target[chan], AmbientGain);
}
if(src->Direct.Moving)
{
- ALfloat (*restrict Current)[MaxChannels] = src->Direct.Mix.Gains.Current;
- ALfloat (*restrict Step)[MaxChannels] = src->Direct.Mix.Gains.Step;
+ ALfloat *restrict Current = src->Direct.Mix.Gains[0].Current;
+ ALfloat *restrict Step = src->Direct.Mix.Gains[0].Step;
for(j = 0;j < MaxChannels;j++)
{
- ALfloat cur = maxf(Current[0][j], FLT_EPSILON);
- ALfloat trg = maxf(Matrix[0][j], FLT_EPSILON);
+ ALfloat cur = maxf(Current[j], FLT_EPSILON);
+ ALfloat trg = maxf(Target[j], FLT_EPSILON);
if(fabs(trg - cur) >= GAIN_SILENCE_THRESHOLD)
- Step[0][j] = powf(trg/cur, 1.0f/64.0f);
+ Step[j] = powf(trg/cur, 1.0f/64.0f);
else
- Step[0][j] = 1.0f;
- Current[0][j] = cur;
+ Step[j] = 1.0f;
+ Current[j] = cur;
}
src->Direct.Counter = 64;
}
else
{
- ALfloat (*restrict Current)[MaxChannels] = src->Direct.Mix.Gains.Current;
- ALfloat (*restrict Step)[MaxChannels] = src->Direct.Mix.Gains.Step;
- for(i = 0;i < MAX_INPUT_CHANNELS;i++)
+ ALfloat *restrict Current = src->Direct.Mix.Gains[0].Current;
+ ALfloat *restrict Step = src->Direct.Mix.Gains[0].Step;
+ for(j = 0;j < MaxChannels;j++)
{
- for(j = 0;j < MaxChannels;j++)
- {
- Current[i][j] = Matrix[i][j];
- Step[i][j] = 1.0f;
- }
+ Current[j] = Target[j];
+ Step[j] = 1.0f;
}
src->Direct.Counter = 0;
src->Direct.Moving = AL_TRUE;