aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Alc/effects/reverb.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/Alc/effects/reverb.c b/Alc/effects/reverb.c
index 7911e43b..8ae10a9a 100644
--- a/Alc/effects/reverb.c
+++ b/Alc/effects/reverb.c
@@ -533,14 +533,13 @@ static ALvoid UpdateDelayLine(ALfloat earlyDelay, ALfloat lateDelay, ALuint freq
State->DelayTap[1] = fastf2u((earlyDelay + lateDelay) * frequency);
}
-// Update the early reflections gain and line coefficients.
-static ALvoid UpdateEarlyLines(ALfloat earlyGain, ALfloat lateDelay, ALreverbState *State)
+// Update the early reflections mix and line coefficients.
+static ALvoid UpdateEarlyLines(ALfloat lateDelay, ALreverbState *State)
{
ALuint index;
- // Calculate the early reflections gain (from the master effect gain, and
- // reflections gain parameters) with a constant attenuation of 0.5.
- State->Early.Gain = 0.5f * earlyGain;
+ // Calculate the early reflections with a constant attenuation of 0.5.
+ State->Early.Gain = 0.5f;
// Calculate the gain (coefficient) for each early delay line using the
// late delay time. This expands the early reflections to the start of
@@ -571,8 +570,8 @@ static ALvoid UpdateDecorrelator(ALfloat density, ALuint frequency, ALreverbStat
}
}
-// Update the late reverb gains, line lengths, and line coefficients.
-static ALvoid UpdateLateLines(ALfloat lateGain, ALfloat xMix, ALfloat density, ALfloat decayTime, ALfloat diffusion, ALfloat echoDepth, ALfloat hfRatio, ALfloat cw, ALuint frequency, ALreverbState *State)
+// Update the late reverb mix, line lengths, and line coefficients.
+static ALvoid UpdateLateLines(ALfloat xMix, ALfloat density, ALfloat decayTime, ALfloat diffusion, ALfloat echoDepth, ALfloat hfRatio, ALfloat cw, ALuint frequency, ALreverbState *State)
{
ALfloat length;
ALuint index;
@@ -585,7 +584,7 @@ static ALvoid UpdateLateLines(ALfloat lateGain, ALfloat xMix, ALfloat density, A
* echo is slightly stronger than the decorrelated echos in the reverb
* tail.
*/
- State->Late.Gain = lateGain * xMix * (1.0f - (echoDepth*0.5f*(1.0f - diffusion)));
+ State->Late.Gain = xMix * (1.0f - (echoDepth*0.5f*(1.0f - diffusion)));
/* To compensate for changes in modal density and decay time of the late
* reverb signal, the input is attenuated based on the maximal energy of
@@ -635,7 +634,7 @@ static ALvoid UpdateLateLines(ALfloat lateGain, ALfloat xMix, ALfloat density, A
// Update the echo gain, line offset, line coefficients, and mixing
// coefficients.
-static ALvoid UpdateEchoLine(ALfloat lateGain, ALfloat echoTime, ALfloat decayTime, ALfloat diffusion, ALfloat echoDepth, ALfloat hfRatio, ALfloat cw, ALuint frequency, ALreverbState *State)
+static ALvoid UpdateEchoLine(ALfloat echoTime, ALfloat decayTime, ALfloat diffusion, ALfloat echoDepth, ALfloat hfRatio, ALfloat cw, ALuint frequency, ALreverbState *State)
{
// Update the offset and coefficient for the echo delay line.
State->Echo.Offset = fastf2u(echoTime * frequency);
@@ -660,11 +659,11 @@ static ALvoid UpdateEchoLine(ALfloat lateGain, ALfloat echoTime, ALfloat decayTi
/* Calculate the echo mixing coefficient. This is applied to the output mix
* only, not the feedback.
*/
- State->Echo.MixCoeff = lateGain * echoDepth;
+ State->Echo.MixCoeff = echoDepth;
}
// Update the early and late 3D panning gains.
-static ALvoid UpdateDirectPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, ALfloat Gain, ALreverbState *State)
+static ALvoid UpdateDirectPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, ALfloat Gain, ALfloat EarlyGain, ALfloat LateGain, ALreverbState *State)
{
ALfloat AmbientGains[MAX_OUTPUT_CHANNELS];
ALfloat DirGains[MAX_OUTPUT_CHANNELS];
@@ -682,7 +681,7 @@ static ALvoid UpdateDirectPanning(const ALCdevice *Device, const ALfloat *Reflec
{
if(Device->ChannelName[i] == LFE)
continue;
- State->Early.PanGain[i&3][i] = AmbientGains[i];
+ State->Early.PanGain[i&3][i] = AmbientGains[i] * EarlyGain;
}
}
else
@@ -704,7 +703,7 @@ static ALvoid UpdateDirectPanning(const ALCdevice *Device, const ALfloat *Reflec
{
if(Device->ChannelName[i] == LFE)
continue;
- State->Early.PanGain[i&3][i] = lerp(AmbientGains[i], DirGains[i], length);
+ State->Early.PanGain[i&3][i] = lerp(AmbientGains[i], DirGains[i], length) * EarlyGain;
}
}
@@ -716,7 +715,7 @@ static ALvoid UpdateDirectPanning(const ALCdevice *Device, const ALfloat *Reflec
{
if(Device->ChannelName[i] == LFE)
continue;
- State->Late.PanGain[i&3][i] = AmbientGains[i];
+ State->Late.PanGain[i&3][i] = AmbientGains[i] * LateGain;
}
}
else
@@ -734,12 +733,12 @@ static ALvoid UpdateDirectPanning(const ALCdevice *Device, const ALfloat *Reflec
{
if(Device->ChannelName[i] == LFE)
continue;
- State->Late.PanGain[i&3][i] = lerp(AmbientGains[i], DirGains[i], length);
+ State->Late.PanGain[i&3][i] = lerp(AmbientGains[i], DirGains[i], length) * LateGain;
}
}
}
-static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, ALfloat Gain, ALreverbState *State)
+static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *ReflectionsPan, const ALfloat *LateReverbPan, ALfloat Gain, ALfloat EarlyGain, ALfloat LateGain, ALreverbState *State)
{
static const ALfloat PanDirs[4][3] = {
{ -0.707106781f, 0.0f, -0.707106781f }, /* Front left */
@@ -783,7 +782,8 @@ static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *Reflection
for(i = 0;i < 4;i++)
{
CalcDirectionCoeffs(PanDirs[i], coeffs);
- ComputePanningGains(Device->AmbiCoeffs, Device->NumChannels, coeffs, Gain*gain[i], State->Early.PanGain[i]);
+ ComputePanningGains(Device->AmbiCoeffs, Device->NumChannels, coeffs,
+ Gain*EarlyGain*gain[i], State->Early.PanGain[i]);
}
gain[0] = gain[1] = gain[2] = gain[3] = 0.5f;
@@ -814,7 +814,8 @@ static ALvoid Update3DPanning(const ALCdevice *Device, const ALfloat *Reflection
for(i = 0;i < 4;i++)
{
CalcDirectionCoeffs(PanDirs[i], coeffs);
- ComputePanningGains(Device->AmbiCoeffs, Device->NumChannels, coeffs, Gain*gain[i], State->Late.PanGain[i]);
+ ComputePanningGains(Device->AmbiCoeffs, Device->NumChannels, coeffs,
+ Gain*LateGain*gain[i], State->Late.PanGain[i]);
}
}
@@ -850,8 +851,7 @@ static ALvoid ALreverbState_update(ALreverbState *State, const ALCdevice *Device
frequency, State);
// Update the early lines.
- UpdateEarlyLines(props->Reverb.ReflectionsGain,
- props->Reverb.LateReverbDelay, State);
+ UpdateEarlyLines(props->Reverb.LateReverbDelay, State);
// Update the decorrelator.
UpdateDecorrelator(props->Reverb.Density, frequency, State);
@@ -870,14 +870,12 @@ static ALvoid ALreverbState_update(ALreverbState *State, const ALCdevice *Device
cw = cosf(F_TAU * hfscale);
// Update the late lines.
- UpdateLateLines(props->Reverb.LateReverbGain, x,
- props->Reverb.Density, props->Reverb.DecayTime,
+ UpdateLateLines(x, props->Reverb.Density, props->Reverb.DecayTime,
props->Reverb.Diffusion, props->Reverb.EchoDepth,
hfRatio, cw, frequency, State);
// Update the echo line.
- UpdateEchoLine(props->Reverb.LateReverbGain,
- props->Reverb.EchoTime, props->Reverb.DecayTime,
+ UpdateEchoLine(props->Reverb.EchoTime, props->Reverb.DecayTime,
props->Reverb.Diffusion, props->Reverb.EchoDepth,
hfRatio, cw, frequency, State);
@@ -885,10 +883,14 @@ static ALvoid ALreverbState_update(ALreverbState *State, const ALCdevice *Device
// Update early and late 3D panning.
if(Device->Hrtf || Device->FmtChans == DevFmtBFormat3D)
Update3DPanning(Device, props->Reverb.ReflectionsPan,
- props->Reverb.LateReverbPan, gain, State);
+ props->Reverb.LateReverbPan, gain,
+ props->Reverb.ReflectionsGain,
+ props->Reverb.LateReverbGain, State);
else
UpdateDirectPanning(Device, props->Reverb.ReflectionsPan,
- props->Reverb.LateReverbPan, gain, State);
+ props->Reverb.LateReverbPan, gain,
+ props->Reverb.ReflectionsGain,
+ props->Reverb.LateReverbGain, State);
}