aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/mixer.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2010-09-24 23:24:01 -0700
committerChris Robinson <[email protected]>2010-09-24 23:24:01 -0700
commite70141e57b62fb67b41f1a6d8f3497feb79172b2 (patch)
tree5d5bc69c8ce6b5190e3cb793d1da135d5da6f57c /Alc/mixer.c
parent2e70b82eaab5e8eef4723ab0d99fa3960e5519d7 (diff)
Localize some variables to the mixer macros
The hope here is to help break the mixer loops into separate functions, so the macro expansion doesn't cause the MixSource function to explode in size and kill compilation speed.
Diffstat (limited to 'Alc/mixer.c')
-rw-r--r--Alc/mixer.c135
1 files changed, 84 insertions, 51 deletions
diff --git a/Alc/mixer.c b/Alc/mixer.c
index 9572f7c3..2d2eb73b 100644
--- a/Alc/mixer.c
+++ b/Alc/mixer.c
@@ -99,6 +99,13 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
ALuint BufferIdx; \
ALuint pos = DataPosInt; \
ALuint frac = DataPosFrac; \
+ ALfloat DrySend[OUTPUTCHANNELS]; \
+ FILTER *DryFilter; \
+ \
+ DryFilter = &Source->Params.iirFilter; \
+ for(i = 0;i < OUTPUTCHANNELS;i++) \
+ DrySend[i] = Source->Params.DryGains[i]; \
+ \
if(j == 0) \
{ \
value = sampler##S(Data.p##S[pos], Data.p##S[pos+1], frac); \
@@ -159,11 +166,25 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
PendingClicks[FRONT_CENTER] += outsamp*DrySend[FRONT_CENTER]; \
PendingClicks[BACK_CENTER] += outsamp*DrySend[BACK_CENTER]; \
} \
+ \
for(out = 0;out < MAX_SENDS;out++) \
{ \
- if(!WetBuffer[out]) \
+ ALfloat WetSend; \
+ ALfloat *WetBuffer; \
+ ALfloat *WetClickRemoval; \
+ ALfloat *WetPendingClicks; \
+ FILTER *WetFilter; \
+ \
+ if(!Source->Send[out].Slot || \
+ Source->Send[out].Slot->effect.type == AL_EFFECT_NULL) \
continue; \
\
+ WetSend = Source->Params.WetGains[out]; \
+ WetBuffer = Source->Send[out].Slot->WetBuffer; \
+ WetClickRemoval = Source->Send[out].Slot->ClickRemoval; \
+ WetPendingClicks = Source->Send[out].Slot->PendingClicks; \
+ WetFilter = &Source->Params.Send[out].iirFilter; \
+ \
pos = DataPosInt; \
frac = DataPosFrac; \
j -= BufferSize; \
@@ -172,8 +193,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[out], 0, value); \
- WetClickRemoval[out][0] -= outsamp*WetSend[out]; \
+ outsamp = lpFilter2PC(WetFilter, 0, value); \
+ WetClickRemoval[0] -= outsamp*WetSend; \
} \
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
{ \
@@ -181,8 +202,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[out], 0, value); \
- WetBuffer[out][j] += outsamp*WetSend[out]; \
+ outsamp = lpFilter2P(WetFilter, 0, value); \
+ WetBuffer[j] += outsamp*WetSend; \
\
frac += increment; \
pos += frac>>FRACTIONBITS; \
@@ -204,8 +225,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[out], 0, value); \
- WetPendingClicks[out][0] += outsamp*WetSend[out]; \
+ outsamp = lpFilter2PC(WetFilter, 0, value); \
+ WetPendingClicks[0] += outsamp*WetSend; \
} \
} \
DataPosInt = pos; \
@@ -217,6 +238,13 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
ALuint BufferIdx; \
ALuint pos = DataPosInt; \
ALuint frac = DataPosFrac; \
+ ALfloat DrySend[OUTPUTCHANNELS]; \
+ FILTER *DryFilter; \
+ \
+ DryFilter = &Source->Params.iirFilter; \
+ for(i = 0;i < OUTPUTCHANNELS;i++) \
+ DrySend[i] = Source->Params.DryGains[i]; \
+ \
if(j == 0) \
{ \
for(i = 0;i < Channels;i++) \
@@ -272,11 +300,25 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
PendingClicks[chans[i+4]] += outsamp*DrySend[chans[i+4]]; \
} \
} \
+ \
for(out = 0;out < MAX_SENDS;out++) \
{ \
- if(!WetBuffer[out]) \
+ ALfloat WetSend; \
+ ALfloat *WetBuffer; \
+ ALfloat *WetClickRemoval; \
+ ALfloat *WetPendingClicks; \
+ FILTER *WetFilter; \
+ \
+ if(!Source->Send[out].Slot || \
+ Source->Send[out].Slot->effect.type == AL_EFFECT_NULL) \
continue; \
\
+ WetSend = Source->Params.WetGains[out]; \
+ WetBuffer = Source->Send[out].Slot->WetBuffer; \
+ WetClickRemoval = Source->Send[out].Slot->ClickRemoval; \
+ WetPendingClicks = Source->Send[out].Slot->PendingClicks; \
+ WetFilter = &Source->Params.Send[out].iirFilter; \
+ \
pos = DataPosInt; \
frac = DataPosFrac; \
j -= BufferSize; \
@@ -288,8 +330,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[out], chans[i], value); \
- WetClickRemoval[out][0] -= outsamp*WetSend[out] * scaler; \
+ outsamp = lpFilter1PC(WetFilter, chans[i], value); \
+ WetClickRemoval[0] -= outsamp*WetSend * scaler; \
} \
} \
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
@@ -299,8 +341,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[out], chans[i], value); \
- WetBuffer[out][j] += outsamp*WetSend[out] * scaler; \
+ outsamp = lpFilter1P(WetFilter, chans[i], value); \
+ WetBuffer[j] += outsamp*WetSend * scaler; \
} \
\
frac += increment; \
@@ -326,8 +368,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[out], chans[i], value); \
- WetPendingClicks[out][0] += outsamp*WetSend[out] * scaler; \
+ outsamp = lpFilter1PC(WetFilter, chans[i], value); \
+ WetPendingClicks[0] += outsamp*WetSend * scaler; \
} \
} \
} \
@@ -340,6 +382,13 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
ALuint BufferIdx; \
ALuint pos = DataPosInt; \
ALuint frac = DataPosFrac; \
+ ALfloat DrySend[OUTPUTCHANNELS]; \
+ FILTER *DryFilter; \
+ \
+ DryFilter = &Source->Params.iirFilter; \
+ for(i = 0;i < OUTPUTCHANNELS;i++) \
+ DrySend[i] = Source->Params.DryGains[i]; \
+ \
if(j == 0) \
{ \
for(i = 0;i < Channels;i++) \
@@ -389,11 +438,25 @@ static __inline ALfloat cos_lerp16(ALfloat val1, ALfloat val2, ALint frac)
PendingClicks[chans[i]] += outsamp*DrySend[chans[i]]; \
} \
} \
+ \
for(out = 0;out < MAX_SENDS;out++) \
{ \
- if(!WetBuffer[out]) \
+ ALfloat WetSend; \
+ ALfloat *WetBuffer; \
+ ALfloat *WetClickRemoval; \
+ ALfloat *WetPendingClicks; \
+ FILTER *WetFilter; \
+ \
+ if(!Source->Send[out].Slot || \
+ Source->Send[out].Slot->effect.type == AL_EFFECT_NULL) \
continue; \
\
+ WetSend = Source->Params.WetGains[out]; \
+ WetBuffer = Source->Send[out].Slot->WetBuffer; \
+ WetClickRemoval = Source->Send[out].Slot->ClickRemoval; \
+ WetPendingClicks = Source->Send[out].Slot->PendingClicks; \
+ WetFilter = &Source->Params.Send[out].iirFilter; \
+ \
pos = DataPosInt; \
frac = DataPosFrac; \
j -= BufferSize; \
@@ -405,8 +468,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[out], chans[i], value); \
- WetClickRemoval[out][0] -= outsamp*WetSend[out] * scaler; \
+ outsamp = lpFilter1PC(WetFilter, chans[i], value); \
+ WetClickRemoval[0] -= outsamp*WetSend * scaler; \
} \
} \
for(BufferIdx = 0;BufferIdx < BufferSize;BufferIdx++) \
@@ -416,8 +479,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[out], chans[i], value); \
- WetBuffer[out][j] += outsamp*WetSend[out] * scaler; \
+ outsamp = lpFilter1P(WetFilter, chans[i], value); \
+ WetBuffer[j] += outsamp*WetSend * scaler; \
} \
\
frac += increment; \
@@ -443,8 +506,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[out], chans[i], value); \
- WetPendingClicks[out][0] += outsamp*WetSend[out] * scaler; \
+ outsamp = lpFilter1PC(WetFilter, chans[i], value); \
+ WetPendingClicks[0] += outsamp*WetSend * scaler; \
} \
} \
} \
@@ -536,16 +599,10 @@ static void MixSource(ALsource *Source, ALCcontext *Context,
ALfloat (*DryBuffer)[OUTPUTCHANNELS], ALuint SamplesToDo,
ALfloat *ClickRemoval, ALfloat *PendingClicks)
{
- ALfloat *WetBuffer[MAX_SENDS];
- ALfloat DrySend[OUTPUTCHANNELS];
- ALfloat *WetClickRemoval[MAX_SENDS];
- ALfloat *WetPendingClicks[MAX_SENDS];
ALuint i, j, out;
ALfloat value, outsamp;
ALbufferlistitem *BufferListItem;
ALint64 DataSize64,DataPos64;
- FILTER *DryFilter, *WetFilter[MAX_SENDS];
- ALfloat WetSend[MAX_SENDS];
ALint increment;
ALuint DataPosInt, DataPosFrac;
ALuint BuffersPlayed;
@@ -565,33 +622,9 @@ static void MixSource(ALsource *Source, ALCcontext *Context,
DataPosFrac = Source->position_fraction;
Looping = Source->bLooping;
- for(i = 0;i < OUTPUTCHANNELS;i++)
- DrySend[i] = Source->Params.DryGains[i];
- for(i = 0;i < MAX_SENDS;i++)
- WetSend[i] = Source->Params.WetGains[i];
-
/* Get fixed point step */
increment = Source->Params.Step;
- DryFilter = &Source->Params.iirFilter;
- for(i = 0;i < MAX_SENDS;i++)
- {
- WetFilter[i] = &Source->Params.Send[i].iirFilter;
- if(Source->Send[i].Slot &&
- Source->Send[i].Slot->effect.type != AL_EFFECT_NULL)
- {
- WetBuffer[i] = Source->Send[i].Slot->WetBuffer;
- WetClickRemoval[i] = Source->Send[i].Slot->ClickRemoval;
- WetPendingClicks[i] = Source->Send[i].Slot->PendingClicks;
- }
- else
- {
- WetBuffer[i] = NULL;
- WetClickRemoval[i] = NULL;
- WetPendingClicks[i] = NULL;
- }
- }
-
/* Get current buffer queue item */
BufferListItem = Source->queue;
for(i = 0;i < BuffersPlayed;i++)