aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2016-08-27 06:28:04 -0700
committerChris Robinson <[email protected]>2016-08-27 06:28:04 -0700
commit3d59021702c2f6ea4dbdf5d2f6231fd945370e27 (patch)
tree670a7c60b98e2babacf1bee060aaeba89e314b63
parent4b153dade82b0558c96d54828bd2f9f86dc808fd (diff)
Clamp the maximum mixing gain boost to 16
The combined source and listener gains now can't exceed a multiplier of 16 (~24dB). This is to avoid mixes getting out of control with large volume boosts, which reduces the effective precision given by floating-point.
-rw-r--r--Alc/ALu.c21
-rw-r--r--OpenAL32/Include/alu.h2
2 files changed, 13 insertions, 10 deletions
diff --git a/Alc/ALu.c b/Alc/ALu.c
index eafb082c..fc49c60f 100644
--- a/Alc/ALu.c
+++ b/Alc/ALu.c
@@ -452,13 +452,15 @@ static void CalcNonAttnSourceParams(ALvoice *voice, const struct ALsourceProps *
/* Calculate gains */
DryGain = clampf(SourceVolume, MinVolume, MaxVolume);
- DryGain *= ATOMIC_LOAD(&props->Direct.Gain, almemory_order_relaxed) * ListenerGain;
+ DryGain *= ATOMIC_LOAD(&props->Direct.Gain, almemory_order_relaxed) * ListenerGain;
+ DryGain = minf(DryGain, GAIN_MIX_MAX);
DryGainHF = ATOMIC_LOAD(&props->Direct.GainHF, almemory_order_relaxed);
DryGainLF = ATOMIC_LOAD(&props->Direct.GainLF, almemory_order_relaxed);
for(i = 0;i < NumSends;i++)
{
- WetGain[i] = clampf(SourceVolume, MinVolume, MaxVolume);
- WetGain[i] *= ATOMIC_LOAD(&props->Send[i].Gain, almemory_order_relaxed) * ListenerGain;
+ WetGain[i] = clampf(SourceVolume, MinVolume, MaxVolume);
+ WetGain[i] *= ATOMIC_LOAD(&props->Send[i].Gain, almemory_order_relaxed) * ListenerGain;
+ WetGain[i] = minf(WetGain[i], GAIN_MIX_MAX);
WetGainHF[i] = ATOMIC_LOAD(&props->Send[i].GainHF, almemory_order_relaxed);
WetGainLF[i] = ATOMIC_LOAD(&props->Send[i].GainLF, almemory_order_relaxed);
}
@@ -1086,18 +1088,17 @@ static void CalcAttnSourceParams(ALvoice *voice, const struct ALsourceProps *pro
}
}
- /* Clamp to Min/Max Gain */
- DryGain = clampf(DryGain, MinVolume, MaxVolume);
- for(i = 0;i < NumSends;i++)
- WetGain[i] = clampf(WetGain[i], MinVolume, MaxVolume);
-
/* Apply gain and frequency filters */
- DryGain *= ATOMIC_LOAD(&props->Direct.Gain, almemory_order_relaxed) * ListenerGain;
+ DryGain = clampf(DryGain, MinVolume, MaxVolume);
+ DryGain *= ATOMIC_LOAD(&props->Direct.Gain, almemory_order_relaxed) * ListenerGain;
+ DryGain = minf(DryGain, GAIN_MIX_MAX);
DryGainHF *= ATOMIC_LOAD(&props->Direct.GainHF, almemory_order_relaxed);
DryGainLF *= ATOMIC_LOAD(&props->Direct.GainLF, almemory_order_relaxed);
for(i = 0;i < NumSends;i++)
{
- WetGain[i] *= ATOMIC_LOAD(&props->Send[i].Gain, almemory_order_relaxed) * ListenerGain;
+ WetGain[i] = clampf(WetGain[i], MinVolume, MaxVolume);
+ WetGain[i] *= ATOMIC_LOAD(&props->Send[i].Gain, almemory_order_relaxed) * ListenerGain;
+ WetGain[i] = minf(WetGain[i], GAIN_MIX_MAX);
WetGainHF[i] *= ATOMIC_LOAD(&props->Send[i].GainHF, almemory_order_relaxed);
WetGainLF[i] *= ATOMIC_LOAD(&props->Send[i].GainLF, almemory_order_relaxed);
}
diff --git a/OpenAL32/Include/alu.h b/OpenAL32/Include/alu.h
index 1d922881..70ce7059 100644
--- a/OpenAL32/Include/alu.h
+++ b/OpenAL32/Include/alu.h
@@ -173,6 +173,8 @@ typedef void (*HrtfDirectMixerFunc)(ALfloat (*restrict OutBuffer)[BUFFERSIZE],
ALfloat (*restrict Values)[2], ALuint BufferSize);
+#define GAIN_MIX_MAX (16.0f) /* +24dB */
+
#define GAIN_SILENCE_THRESHOLD (0.00001f) /* -100dB */
#define SPEEDOFSOUNDMETRESPERSEC (343.3f)