diff options
author | Chris Robinson <[email protected]> | 2014-05-04 00:13:19 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2014-05-04 00:13:19 -0700 |
commit | a2bb4c3f1344ad5876181fd0c3131e018915276e (patch) | |
tree | ab376924a6b9fb23a453d910c69a8168ae6475b8 /Alc/mixer_neon.c | |
parent | d066c7b124a7efa771996bc7ba09e0e074683739 (diff) |
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.
Diffstat (limited to 'Alc/mixer_neon.c')
-rw-r--r-- | Alc/mixer_neon.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index 1b695d81..0fa80939 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -89,22 +89,23 @@ void MixDirect_Neon(DirectParams *params, const ALfloat *restrict data, ALuint s 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]; for(;pos < BufferSize && pos < Counter;pos++) { 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 = vdupq_n_f32(DrySend); @@ -131,21 +132,22 @@ void MixSend_Neon(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; for(;pos < BufferSize && pos < Counter;pos++) { 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 = vdupq_n_f32(WetGain); |