diff options
author | Chris Robinson <[email protected]> | 2010-09-24 23:24:01 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2010-09-24 23:24:01 -0700 |
commit | e70141e57b62fb67b41f1a6d8f3497feb79172b2 (patch) | |
tree | 5d5bc69c8ce6b5190e3cb793d1da135d5da6f57c | |
parent | 2e70b82eaab5e8eef4723ab0d99fa3960e5519d7 (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.c | 135 |
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++) |