aboutsummaryrefslogtreecommitdiffstats
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
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.
-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++)