From a2bb4c3f1344ad5876181fd0c3131e018915276e Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sun, 4 May 2014 00:13:19 -0700 Subject: Always use the current gains when mixing The current gain gets explicitly set to the target when the stepping is finished to ensure the target is still used. This way, however, will allow for asynchronously 'canceling' a fade by setting the counter to 0. --- Alc/mixer_sse.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'Alc/mixer_sse.c') diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c index a2b8461d..645053d9 100644 --- a/Alc/mixer_sse.c +++ b/Alc/mixer_sse.c @@ -152,10 +152,10 @@ void MixDirect_SSE(DirectParams *params, const ALfloat *restrict data, ALuint sr for(c = 0;c < MaxChannels;c++) { ALuint pos = 0; + DrySend = params->Mix.Gains.Current[srcchan][c]; Step = params->Mix.Gains.Step[srcchan][c]; if(Step != 1.0f && Counter > 0) { - DrySend = params->Mix.Gains.Current[srcchan][c]; /* Mix with applying gain steps in aligned multiples of 4. */ if(BufferSize-pos > 3 && Counter-pos > 3) { @@ -182,13 +182,14 @@ void MixDirect_SSE(DirectParams *params, const ALfloat *restrict data, ALuint sr OutBuffer[c][OutPos+pos] += data[pos]*DrySend; DrySend *= Step; } + if(pos == Counter) + DrySend = params->Mix.Gains.Target[srcchan][c]; + params->Mix.Gains.Current[srcchan][c] = DrySend; /* Mix until pos is aligned with 4 or the mix is done. */ for(;pos < BufferSize && (pos&3) != 0;pos++) OutBuffer[c][OutPos+pos] += data[pos]*DrySend; - params->Mix.Gains.Current[srcchan][c] = DrySend; } - DrySend = params->Mix.Gains.Target[srcchan][c]; if(!(DrySend > GAIN_SILENCE_THRESHOLD)) continue; gain = _mm_set1_ps(DrySend); @@ -215,11 +216,10 @@ void MixSend_SSE(SendParams *params, const ALfloat *restrict data, { ALuint pos = 0; - + WetGain = params->Gain.Current; Step = params->Gain.Step; if(Step != 1.0f && Counter > 0) { - WetGain = params->Gain.Current; if(BufferSize-pos > 3 && Counter-pos > 3) { gain = _mm_set_ps( @@ -244,12 +244,13 @@ void MixSend_SSE(SendParams *params, const ALfloat *restrict data, OutBuffer[0][OutPos+pos] += data[pos]*WetGain; WetGain *= Step; } + if(pos == Counter) + WetGain = params->Gain.Target; + params->Gain.Current = WetGain; for(;pos < BufferSize && (pos&3) != 0;pos++) OutBuffer[0][OutPos+pos] += data[pos]*WetGain; - params->Gain.Current = WetGain; } - WetGain = params->Gain.Target; if(!(WetGain > GAIN_SILENCE_THRESHOLD)) return; gain = _mm_set1_ps(WetGain); -- cgit v1.2.3