aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
Diffstat (limited to 'Alc')
-rw-r--r--Alc/mixer.c141
1 files changed, 73 insertions, 68 deletions
diff --git a/Alc/mixer.c b/Alc/mixer.c
index 3514daa4..e41bee42 100644
--- a/Alc/mixer.c
+++ b/Alc/mixer.c
@@ -96,11 +96,13 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
#define DO_MIX_MONO(S,sampler) do { \
- ALuint BufferIdx; \
ALuint pos = DataPosInt; \
ALuint frac = DataPosFrac; \
ALfloat DrySend[OUTPUTCHANNELS]; \
FILTER *DryFilter; \
+ ALuint BufferIdx; \
+ ALuint i, out; \
+ ALfloat value; \
\
DryFilter = &Source->Params.iirFilter; \
for(i = 0;i < OUTPUTCHANNELS;i++) \
@@ -110,15 +112,15 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
{ \
value = sampler##S(Data.p##S[pos], Data.p##S[pos+1], frac); \
\
- outsamp = lpFilter4PC(DryFilter, 0, value); \
- 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]; \
+ value = lpFilter4PC(DryFilter, 0, value); \
+ ClickRemoval[FRONT_LEFT] -= value*DrySend[FRONT_LEFT]; \
+ ClickRemoval[FRONT_RIGHT] -= value*DrySend[FRONT_RIGHT]; \
+ ClickRemoval[SIDE_LEFT] -= value*DrySend[SIDE_LEFT]; \
+ ClickRemoval[SIDE_RIGHT] -= value*DrySend[SIDE_RIGHT]; \
+ ClickRemoval[BACK_LEFT] -= value*DrySend[BACK_LEFT]; \
+ ClickRemoval[BACK_RIGHT] -= value*DrySend[BACK_RIGHT]; \
+ ClickRemoval[FRONT_CENTER] -= value*DrySend[FRONT_CENTER]; \
+ ClickRemoval[BACK_CENTER] -= value*DrySend[BACK_CENTER]; \
} \
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
{ \
@@ -126,15 +128,15 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos], Data.p##S[pos+1], frac); \
\
/* Direct path final mix buffer and panning */ \
- outsamp = lpFilter4P(DryFilter, 0, value); \
- DryBuffer[j][FRONT_LEFT] += outsamp*DrySend[FRONT_LEFT]; \
- DryBuffer[j][FRONT_RIGHT] += outsamp*DrySend[FRONT_RIGHT]; \
- DryBuffer[j][SIDE_LEFT] += outsamp*DrySend[SIDE_LEFT]; \
- DryBuffer[j][SIDE_RIGHT] += outsamp*DrySend[SIDE_RIGHT]; \
- DryBuffer[j][BACK_LEFT] += outsamp*DrySend[BACK_LEFT]; \
- DryBuffer[j][BACK_RIGHT] += outsamp*DrySend[BACK_RIGHT]; \
- DryBuffer[j][FRONT_CENTER] += outsamp*DrySend[FRONT_CENTER]; \
- DryBuffer[j][BACK_CENTER] += outsamp*DrySend[BACK_CENTER]; \
+ value = lpFilter4P(DryFilter, 0, value); \
+ DryBuffer[j][FRONT_LEFT] += value*DrySend[FRONT_LEFT]; \
+ DryBuffer[j][FRONT_RIGHT] += value*DrySend[FRONT_RIGHT]; \
+ DryBuffer[j][SIDE_LEFT] += value*DrySend[SIDE_LEFT]; \
+ DryBuffer[j][SIDE_RIGHT] += value*DrySend[SIDE_RIGHT]; \
+ DryBuffer[j][BACK_LEFT] += value*DrySend[BACK_LEFT]; \
+ DryBuffer[j][BACK_RIGHT] += value*DrySend[BACK_RIGHT]; \
+ DryBuffer[j][FRONT_CENTER] += value*DrySend[FRONT_CENTER]; \
+ DryBuffer[j][BACK_CENTER] += value*DrySend[BACK_CENTER]; \
\
frac += increment; \
pos += frac>>FRACTIONBITS; \
@@ -156,15 +158,15 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
} \
value = sampler##S(Data.p##S[p], Data.p##S[p+1], f); \
\
- outsamp = lpFilter4PC(DryFilter, 0, value); \
- PendingClicks[FRONT_LEFT] += outsamp*DrySend[FRONT_LEFT]; \
- PendingClicks[FRONT_RIGHT] += outsamp*DrySend[FRONT_RIGHT]; \
- PendingClicks[SIDE_LEFT] += outsamp*DrySend[SIDE_LEFT]; \
- PendingClicks[SIDE_RIGHT] += outsamp*DrySend[SIDE_RIGHT]; \
- PendingClicks[BACK_LEFT] += outsamp*DrySend[BACK_LEFT]; \
- PendingClicks[BACK_RIGHT] += outsamp*DrySend[BACK_RIGHT]; \
- PendingClicks[FRONT_CENTER] += outsamp*DrySend[FRONT_CENTER]; \
- PendingClicks[BACK_CENTER] += outsamp*DrySend[BACK_CENTER]; \
+ value = lpFilter4PC(DryFilter, 0, value); \
+ PendingClicks[FRONT_LEFT] += value*DrySend[FRONT_LEFT]; \
+ PendingClicks[FRONT_RIGHT] += value*DrySend[FRONT_RIGHT]; \
+ PendingClicks[SIDE_LEFT] += value*DrySend[SIDE_LEFT]; \
+ PendingClicks[SIDE_RIGHT] += value*DrySend[SIDE_RIGHT]; \
+ PendingClicks[BACK_LEFT] += value*DrySend[BACK_LEFT]; \
+ PendingClicks[BACK_RIGHT] += value*DrySend[BACK_RIGHT]; \
+ PendingClicks[FRONT_CENTER] += value*DrySend[FRONT_CENTER]; \
+ PendingClicks[BACK_CENTER] += value*DrySend[BACK_CENTER]; \
} \
\
for(out = 0;out < MAX_SENDS;out++) \
@@ -193,8 +195,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
{ \
value = sampler##S(Data.p##S[pos], Data.p##S[pos+1], frac); \
\
- outsamp = lpFilter2PC(WetFilter, 0, value); \
- WetClickRemoval[0] -= outsamp*WetSend; \
+ value = lpFilter2PC(WetFilter, 0, value); \
+ WetClickRemoval[0] -= value*WetSend; \
} \
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
{ \
@@ -202,8 +204,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos], Data.p##S[pos+1], frac); \
\
/* Room path final mix buffer and panning */ \
- outsamp = lpFilter2P(WetFilter, 0, value); \
- WetBuffer[j] += outsamp*WetSend; \
+ value = lpFilter2P(WetFilter, 0, value); \
+ WetBuffer[j] += value*WetSend; \
\
frac += increment; \
pos += frac>>FRACTIONBITS; \
@@ -225,8 +227,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
} \
value = sampler##S(Data.p##S[p], Data.p##S[p+1], f); \
\
- outsamp = lpFilter2PC(WetFilter, 0, value); \
- WetPendingClicks[0] += outsamp*WetSend; \
+ value = lpFilter2PC(WetFilter, 0, value); \
+ WetPendingClicks[0] += value*WetSend; \
} \
} \
DataPosInt = pos; \
@@ -235,11 +237,13 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
#define DO_MIX_STEREO(S,sampler) do { \
const ALfloat scaler = 1.0f/Channels; \
- ALuint BufferIdx; \
ALuint pos = DataPosInt; \
ALuint frac = DataPosFrac; \
ALfloat DrySend[OUTPUTCHANNELS]; \
FILTER *DryFilter; \
+ ALuint BufferIdx; \
+ ALuint i, out; \
+ ALfloat value; \
\
DryFilter = &Source->Params.iirFilter; \
for(i = 0;i < OUTPUTCHANNELS;i++) \
@@ -252,10 +256,10 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos*Channels + i], \
Data.p##S[(pos+1)*Channels + i], frac); \
\
- outsamp = lpFilter2PC(DryFilter, chans[i]*2, value); \
- ClickRemoval[chans[i+0]] -= outsamp*DrySend[chans[i+0]]; \
- ClickRemoval[chans[i+2]] -= outsamp*DrySend[chans[i+2]]; \
- ClickRemoval[chans[i+4]] -= outsamp*DrySend[chans[i+4]]; \
+ value = lpFilter2PC(DryFilter, chans[i]*2, value); \
+ ClickRemoval[chans[i+0]] -= value*DrySend[chans[i+0]]; \
+ ClickRemoval[chans[i+2]] -= value*DrySend[chans[i+2]]; \
+ ClickRemoval[chans[i+4]] -= value*DrySend[chans[i+4]]; \
} \
} \
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
@@ -265,10 +269,10 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos*Channels + i], \
Data.p##S[(pos+1)*Channels + i], frac); \
\
- outsamp = lpFilter2P(DryFilter, chans[i]*2, value); \
- DryBuffer[j][chans[i+0]] += outsamp*DrySend[chans[i+0]]; \
- DryBuffer[j][chans[i+2]] += outsamp*DrySend[chans[i+2]]; \
- DryBuffer[j][chans[i+4]] += outsamp*DrySend[chans[i+4]]; \
+ value = lpFilter2P(DryFilter, chans[i]*2, value); \
+ DryBuffer[j][chans[i+0]] += value*DrySend[chans[i+0]]; \
+ DryBuffer[j][chans[i+2]] += value*DrySend[chans[i+2]]; \
+ DryBuffer[j][chans[i+4]] += value*DrySend[chans[i+4]]; \
} \
\
frac += increment; \
@@ -294,10 +298,10 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[p*Channels + i], \
Data.p##S[(p+1)*Channels + i], f); \
\
- outsamp = lpFilter2PC(DryFilter, chans[i]*2, value); \
- PendingClicks[chans[i+0]] += outsamp*DrySend[chans[i+0]]; \
- PendingClicks[chans[i+2]] += outsamp*DrySend[chans[i+2]]; \
- PendingClicks[chans[i+4]] += outsamp*DrySend[chans[i+4]]; \
+ value = lpFilter2PC(DryFilter, chans[i]*2, value); \
+ PendingClicks[chans[i+0]] += value*DrySend[chans[i+0]]; \
+ PendingClicks[chans[i+2]] += value*DrySend[chans[i+2]]; \
+ PendingClicks[chans[i+4]] += value*DrySend[chans[i+4]]; \
} \
} \
\
@@ -330,8 +334,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos*Channels + i], \
Data.p##S[(pos+1)*Channels + i], frac); \
\
- outsamp = lpFilter1PC(WetFilter, chans[i], value); \
- WetClickRemoval[0] -= outsamp*WetSend * scaler; \
+ value = lpFilter1PC(WetFilter, chans[i], value); \
+ WetClickRemoval[0] -= value*WetSend * scaler; \
} \
} \
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
@@ -341,8 +345,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos*Channels + i], \
Data.p##S[(pos+1)*Channels + i], frac); \
\
- outsamp = lpFilter1P(WetFilter, chans[i], value); \
- WetBuffer[j] += outsamp*WetSend * scaler; \
+ value = lpFilter1P(WetFilter, chans[i], value); \
+ WetBuffer[j] += value*WetSend * scaler; \
} \
\
frac += increment; \
@@ -368,8 +372,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[p*Channels + i], \
Data.p##S[(p+1)*Channels + i], f); \
\
- outsamp = lpFilter1PC(WetFilter, chans[i], value); \
- WetPendingClicks[0] += outsamp*WetSend * scaler; \
+ value = lpFilter1PC(WetFilter, chans[i], value); \
+ WetPendingClicks[0] += value*WetSend * scaler; \
} \
} \
} \
@@ -379,11 +383,13 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
#define DO_MIX_MC(S,sampler) do { \
const ALfloat scaler = 1.0f/Channels; \
- ALuint BufferIdx; \
ALuint pos = DataPosInt; \
ALuint frac = DataPosFrac; \
ALfloat DrySend[OUTPUTCHANNELS]; \
FILTER *DryFilter; \
+ ALuint BufferIdx; \
+ ALuint i, out; \
+ ALfloat value; \
\
DryFilter = &Source->Params.iirFilter; \
for(i = 0;i < OUTPUTCHANNELS;i++) \
@@ -396,8 +402,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos*Channels + i], \
Data.p##S[(pos+1)*Channels + i], frac); \
\
- outsamp = lpFilter2PC(DryFilter, chans[i]*2, value); \
- ClickRemoval[chans[i]] -= outsamp*DrySend[chans[i]]; \
+ value = lpFilter2PC(DryFilter, chans[i]*2, value); \
+ ClickRemoval[chans[i]] -= value*DrySend[chans[i]]; \
} \
} \
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
@@ -407,8 +413,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos*Channels + i], \
Data.p##S[(pos+1)*Channels + i], frac); \
\
- outsamp = lpFilter2P(DryFilter, chans[i]*2, value); \
- DryBuffer[j][chans[i]] += outsamp*DrySend[chans[i]]; \
+ value = lpFilter2P(DryFilter, chans[i]*2, value); \
+ DryBuffer[j][chans[i]] += value*DrySend[chans[i]]; \
} \
\
frac += increment; \
@@ -434,8 +440,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[p*Channels + i], \
Data.p##S[(p+1)*Channels + i], f); \
\
- outsamp = lpFilter2PC(DryFilter, chans[i]*2, value); \
- PendingClicks[chans[i]] += outsamp*DrySend[chans[i]]; \
+ value = lpFilter2PC(DryFilter, chans[i]*2, value); \
+ PendingClicks[chans[i]] += value*DrySend[chans[i]]; \
} \
} \
\
@@ -468,8 +474,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos*Channels + i], \
Data.p##S[(pos+1)*Channels + i], frac); \
\
- outsamp = lpFilter1PC(WetFilter, chans[i], value); \
- WetClickRemoval[0] -= outsamp*WetSend * scaler; \
+ value = lpFilter1PC(WetFilter, chans[i], value); \
+ WetClickRemoval[0] -= value*WetSend * scaler; \
} \
} \
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
@@ -479,8 +485,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[pos*Channels + i], \
Data.p##S[(pos+1)*Channels + i], frac); \
\
- outsamp = lpFilter1P(WetFilter, chans[i], value); \
- WetBuffer[j] += outsamp*WetSend * scaler; \
+ value = lpFilter1P(WetFilter, chans[i], value); \
+ WetBuffer[j] += value*WetSend * scaler; \
} \
\
frac += increment; \
@@ -506,8 +512,8 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
value = sampler##S(Data.p##S[p*Channels + i], \
Data.p##S[(p+1)*Channels + i], f); \
\
- outsamp = lpFilter1PC(WetFilter, chans[i], value); \
- WetPendingClicks[0] += outsamp*WetSend * scaler; \
+ value = lpFilter1PC(WetFilter, chans[i], value); \
+ WetPendingClicks[0] += value*WetSend * scaler; \
} \
} \
} \
@@ -599,8 +605,6 @@ static void MixSource(ALsource *Source, ALCcontext *Context,
ALfloat (*DryBuffer)[OUTPUTCHANNELS], ALuint SamplesToDo,
ALfloat *ClickRemoval, ALfloat *PendingClicks)
{
- ALuint i, j, out;
- ALfloat value, outsamp;
ALbufferlistitem *BufferListItem;
ALint64 DataSize64,DataPos64;
ALint increment;
@@ -608,6 +612,7 @@ static void MixSource(ALsource *Source, ALCcontext *Context,
ALuint BuffersPlayed;
ALboolean Looping;
ALenum State;
+ ALuint i, j;
if(Source->NeedsUpdate)
{