aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
Diffstat (limited to 'Alc')
-rw-r--r--Alc/mixer_c.c10
-rw-r--r--Alc/mixer_neon.c14
-rw-r--r--Alc/mixer_sse.c15
3 files changed, 22 insertions, 17 deletions
diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c
index efbbf9cb..2b8325ae 100644
--- a/Alc/mixer_c.c
+++ b/Alc/mixer_c.c
@@ -93,19 +93,20 @@ void MixDirect_C(DirectParams *params, const ALfloat *restrict data, ALuint srcc
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;
}
- DrySend = params->Mix.Gains.Target[srcchan][c];
if(!(DrySend > GAIN_SILENCE_THRESHOLD))
continue;
for(;pos < BufferSize;pos++)
@@ -123,19 +124,20 @@ void MixSend_C(SendParams *params, const ALfloat *restrict data,
{
ALuint pos = 0;
+ WetSend = params->Gain.Current;
Step = params->Gain.Step;
if(Step != 1.0f && Counter > 0)
{
- WetSend = params->Gain.Current;
for(;pos < BufferSize && pos < Counter;pos++)
{
OutBuffer[0][OutPos+pos] += data[pos]*WetSend;
WetSend *= Step;
}
+ if(pos == Counter)
+ WetSend = params->Gain.Target;
params->Gain.Current = WetSend;
}
- WetSend = params->Gain.Target;
if(!(WetSend > GAIN_SILENCE_THRESHOLD))
return;
for(;pos < BufferSize;pos++)
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);
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);