diff options
Diffstat (limited to 'Alc')
-rw-r--r-- | Alc/ALu.c | 29 | ||||
-rw-r--r-- | Alc/mixer.c | 2 | ||||
-rw-r--r-- | Alc/mixer_c.c | 20 | ||||
-rw-r--r-- | Alc/mixer_sse.c | 31 |
4 files changed, 50 insertions, 32 deletions
@@ -437,12 +437,20 @@ ALvoid CalcNonAttnSourceParams(ALsource *ALSource, const ALCcontext *ALContext) for(i = 0;i < NumSends;i++) { ALeffectslot *Slot = ALSource->Send[i].Slot; - if(!Slot && i == 0) Slot = Device->DefaultSlot; - if(Slot && Slot->EffectType == AL_EFFECT_NULL) - Slot = NULL; - ALSource->Params.Send[i].Slot = Slot; + if(!Slot || Slot->EffectType == AL_EFFECT_NULL) + { + ALSource->Params.Send[i].OutBuffer = NULL; + ALSource->Params.Send[i].ClickRemoval = NULL; + ALSource->Params.Send[i].PendingClicks = NULL; + } + else + { + ALSource->Params.Send[i].OutBuffer = Slot->WetBuffer; + ALSource->Params.Send[i].ClickRemoval = Slot->ClickRemoval; + ALSource->Params.Send[i].PendingClicks = Slot->PendingClicks; + } ALSource->Params.Send[i].Gain = WetGain[i]; } @@ -574,7 +582,18 @@ ALvoid CalcSourceParams(ALsource *ALSource, const ALCcontext *ALContext) RoomAirAbsorption[i] = AIRABSORBGAINHF; } - ALSource->Params.Send[i].Slot = Slot; + if(!Slot || Slot->EffectType == AL_EFFECT_NULL) + { + ALSource->Params.Send[i].OutBuffer = NULL; + ALSource->Params.Send[i].ClickRemoval = NULL; + ALSource->Params.Send[i].PendingClicks = NULL; + } + else + { + ALSource->Params.Send[i].OutBuffer = Slot->WetBuffer; + ALSource->Params.Send[i].ClickRemoval = Slot->ClickRemoval; + ALSource->Params.Send[i].PendingClicks = Slot->PendingClicks; + } } /* Transform source to listener space (convert to head relative) */ diff --git a/Alc/mixer.c b/Alc/mixer.c index 3039f29f..5f76feaa 100644 --- a/Alc/mixer.c +++ b/Alc/mixer.c @@ -337,7 +337,7 @@ ALvoid MixSource(ALsource *Source, ALCdevice *Device, ALuint SamplesToDo) for(j = 0;j < Device->NumAuxSends;j++) { SendParams *sendparms = &Source->Params.Send[j]; - if(!sendparms->Slot) + if(!sendparms->OutBuffer) continue; DoFilter(&sendparms->LpFilter[chan], SrcData, ResampledData, diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index 045a8b1f..168aa43f 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -86,7 +86,7 @@ static inline void ApplyCoeffs(ALuint Offset, ALfloat (*restrict Values)[2], void MixDirect_C(const DirectParams *params, const ALfloat *restrict data, ALuint srcchan, ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize) { - ALfloat (*restrict DryBuffer)[BUFFERSIZE] = params->OutBuffer; + ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer; ALfloat *restrict ClickRemoval = params->ClickRemoval; ALfloat *restrict PendingClicks = params->PendingClicks; ALfloat DrySend; @@ -102,7 +102,7 @@ void MixDirect_C(const DirectParams *params, const ALfloat *restrict data, ALuin if(OutPos == 0) ClickRemoval[c] -= data[0]*DrySend; for(pos = 0;pos < BufferSize;pos++) - DryBuffer[c][OutPos+pos] += data[pos]*DrySend; + OutBuffer[c][OutPos+pos] += data[pos]*DrySend; if(OutPos+pos == SamplesToDo) PendingClicks[c] += data[pos]*DrySend; } @@ -112,20 +112,20 @@ void MixDirect_C(const DirectParams *params, const ALfloat *restrict data, ALuin void MixSend_C(const SendParams *params, const ALfloat *restrict data, ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize) { - ALeffectslot *Slot = params->Slot; - ALfloat (*restrict WetBuffer)[BUFFERSIZE] = Slot->WetBuffer; - ALfloat *restrict WetClickRemoval = Slot->ClickRemoval; - ALfloat *restrict WetPendingClicks = Slot->PendingClicks; - ALfloat WetSend = params->Gain; + ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer; + ALfloat *restrict ClickRemoval = params->ClickRemoval; + ALfloat *restrict PendingClicks = params->PendingClicks; + ALfloat WetSend; ALuint pos; + WetSend = params->Gain; if(!(WetSend > 0.00001f)) return; if(OutPos == 0) - WetClickRemoval[0] -= data[0] * WetSend; + ClickRemoval[0] -= data[0] * WetSend; for(pos = 0;pos < BufferSize;pos++) - WetBuffer[0][OutPos+pos] += data[pos] * WetSend; + OutBuffer[0][OutPos+pos] += data[pos] * WetSend; if(OutPos+pos == SamplesToDo) - WetPendingClicks[0] += data[pos] * WetSend; + PendingClicks[0] += data[pos] * WetSend; } diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c index d348f9da..cd8ea299 100644 --- a/Alc/mixer_sse.c +++ b/Alc/mixer_sse.c @@ -143,17 +143,16 @@ static inline void ApplyCoeffs(ALuint Offset, ALfloat (*restrict Values)[2], void MixDirect_SSE(const DirectParams *params, const ALfloat *restrict data, ALuint srcchan, ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize) { - ALfloat (*restrict DryBuffer)[BUFFERSIZE] = params->OutBuffer; + ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer; ALfloat *restrict ClickRemoval = params->ClickRemoval; ALfloat *restrict PendingClicks = params->PendingClicks; ALfloat DrySend; + __m128 gain; ALuint pos; ALuint c; for(c = 0;c < MaxChannels;c++) { - __m128 gain; - DrySend = params->Gains[srcchan][c]; if(!(DrySend > 0.00001f)) continue; @@ -165,12 +164,12 @@ void MixDirect_SSE(const DirectParams *params, const ALfloat *restrict data, ALu for(pos = 0;BufferSize-pos > 3;pos += 4) { const __m128 val4 = _mm_load_ps(&data[pos]); - __m128 dry4 = _mm_load_ps(&DryBuffer[c][OutPos+pos]); + __m128 dry4 = _mm_load_ps(&OutBuffer[c][OutPos+pos]); dry4 = _mm_add_ps(dry4, _mm_mul_ps(val4, gain)); - _mm_store_ps(&DryBuffer[c][OutPos+pos], dry4); + _mm_store_ps(&OutBuffer[c][OutPos+pos], dry4); } for(;pos < BufferSize;pos++) - DryBuffer[c][OutPos+pos] += data[pos]*DrySend; + OutBuffer[c][OutPos+pos] += data[pos]*DrySend; if(OutPos+pos == SamplesToDo) PendingClicks[c] += data[pos]*DrySend; @@ -181,31 +180,31 @@ void MixDirect_SSE(const DirectParams *params, const ALfloat *restrict data, ALu void MixSend_SSE(const SendParams *params, const ALfloat *restrict data, ALuint OutPos, ALuint SamplesToDo, ALuint BufferSize) { - ALeffectslot *Slot = params->Slot; - ALfloat (*restrict WetBuffer)[BUFFERSIZE] = Slot->WetBuffer; - ALfloat *restrict WetClickRemoval = Slot->ClickRemoval; - ALfloat *restrict WetPendingClicks = Slot->PendingClicks; - const ALfloat WetGain = params->Gain; + ALfloat (*restrict OutBuffer)[BUFFERSIZE] = params->OutBuffer; + ALfloat *restrict ClickRemoval = params->ClickRemoval; + ALfloat *restrict PendingClicks = params->PendingClicks; + ALfloat WetGain; __m128 gain; ALuint pos; + WetGain = params->Gain; if(!(WetGain > 0.00001f)) return; if(OutPos == 0) - WetClickRemoval[0] -= data[0] * WetGain; + ClickRemoval[0] -= data[0] * WetGain; gain = _mm_set1_ps(WetGain); for(pos = 0;BufferSize-pos > 3;pos += 4) { const __m128 val4 = _mm_load_ps(&data[pos]); - __m128 wet4 = _mm_load_ps(&WetBuffer[0][OutPos+pos]); + __m128 wet4 = _mm_load_ps(&OutBuffer[0][OutPos+pos]); wet4 = _mm_add_ps(wet4, _mm_mul_ps(val4, gain)); - _mm_store_ps(&WetBuffer[0][OutPos+pos], wet4); + _mm_store_ps(&OutBuffer[0][OutPos+pos], wet4); } for(;pos < BufferSize;pos++) - WetBuffer[0][OutPos+pos] += data[pos] * WetGain; + OutBuffer[0][OutPos+pos] += data[pos] * WetGain; if(OutPos+pos == SamplesToDo) - WetPendingClicks[0] += data[pos] * WetGain; + PendingClicks[0] += data[pos] * WetGain; } |