aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/effects/reverb.c
diff options
context:
space:
mode:
Diffstat (limited to 'Alc/effects/reverb.c')
-rw-r--r--Alc/effects/reverb.c42
1 files changed, 14 insertions, 28 deletions
diff --git a/Alc/effects/reverb.c b/Alc/effects/reverb.c
index acf0360a..6f8edafd 100644
--- a/Alc/effects/reverb.c
+++ b/Alc/effects/reverb.c
@@ -1162,7 +1162,7 @@ static ALvoid UpdateLateLines(const ALfloat density, const ALfloat diffusion, co
length = lerp(LATE_LINE_LENGTHS[i] * multiplier, echoTime, echoDepth);
/* Calculate the delay offset for each delay line. */
- State->Late.Offset[i][1] = fastf2i(length*frequency*FRACTIONONE + 0.5f);
+ State->Late.Offset[i][1] = fastf2i(length*frequency + 0.5f);
/* Approximate the absorption that the vector all-pass would exhibit
* given the current diffusion so we don't have to process a full T60
@@ -1438,6 +1438,8 @@ static void CalcModulationDelays(ALreverbState *State,
for(c = 0;c < 4;c++)
{
+ ALsizei offset0 = offsets[c][0] << FRACTIONBITS;
+ ALsizei offset1 = offsets[c][1] << FRACTIONBITS;
index = State->Mod.Index + phase_offset*c;
for(i = 0;i < todo;i++)
{
@@ -1448,8 +1450,8 @@ static void CalcModulationDelays(ALreverbState *State,
index = (index+1) % State->Mod.Range;
/* Calculate the read offset. */
- delays[c][i][0] = fastf2i(sinus*State->Mod.Depth[0]) + offsets[c][0];
- delays[c][i][1] = fastf2i(sinus*State->Mod.Depth[1]) + offsets[c][1];
+ delays[c][i][0] = fastf2i(sinus*State->Mod.Depth[0]) + offset0;
+ delays[c][i][1] = fastf2i(sinus*State->Mod.Depth[1]) + offset1;
}
}
State->Mod.Index = (State->Mod.Index+todo) % State->Mod.Range;
@@ -1680,22 +1682,9 @@ static ALvoid LateReverb_Faded(ALreverbState *State, const ALsizei todo, ALfloat
) * State->Late.DensityGain;
for(j = 0;j < 4;j++)
- {
- ALsizei delay0 = offset - (moddelay[j][i][0]>>FRACTIONBITS);
- ALfloat modmu0 = (moddelay[j][i][0]&FRACTIONBITS) * (1.0f/FRACTIONONE);
- ALsizei delay1 = offset - (moddelay[j][i][1]>>FRACTIONBITS);
- ALfloat modmu1 = (moddelay[j][i][1]&FRACTIONBITS) * (1.0f/FRACTIONONE);
- ALfloat r = DelayLineOut(&State->Late.Delay, delay0 , j)*(1.0f-modmu0)*(1.0f-fade) +
- DelayLineOut(&State->Late.Delay, delay0-1, j)*( modmu0)*(1.0f-fade) +
- DelayLineOut(&State->Late.Delay, delay1 , j)*(1.0f-modmu1)*( fade) +
- DelayLineOut(&State->Late.Delay, delay1-1, j)*( modmu1)*( fade);
- out[j][i] = f[j] + r;
- }
-
- for(j = 0;j < 4;j++)
f[j] += FadedDelayLineOut(&State->Late.Delay,
- offset - (State->Late.Offset[j][0]>>FRACTIONBITS),
- offset - (State->Late.Offset[j][1]>>FRACTIONBITS), j, fade
+ offset - State->Late.Offset[j][0],
+ offset - State->Late.Offset[j][1], j, fade
);
for(j = 0;j < 4;j++)
@@ -1704,6 +1693,9 @@ static ALvoid LateReverb_Faded(ALreverbState *State, const ALsizei todo, ALfloat
VectorAllpass_Faded(f, offset, apFeedCoeff, mixX, mixY, fade,
&State->Late.VecAp);
+ for(j = 0;j < 4;j++)
+ out[j][i] = f[j];
+
VectorReverse(f);
VectorPartialScatter(f, mixX, mixY);
@@ -1736,17 +1728,8 @@ static ALvoid LateReverb_Unfaded(ALreverbState *State, const ALsizei todo, ALflo
State->Late.DensityGain;
for(j = 0;j < 4;j++)
- {
- ALsizei delay = offset - (moddelay[j][i][0]>>FRACTIONBITS);
- ALfloat modmu = (moddelay[j][i][0]&FRACTIONBITS) * (1.0f/FRACTIONONE);
- ALfloat r = DelayLineOut(&State->Late.Delay, delay, j)*(1.0f-modmu) +
- DelayLineOut(&State->Late.Delay, delay-1, j)*( modmu);
- out[j][i] = f[j] + r;
- }
-
- for(j = 0;j < 4;j++)
f[j] += DelayLineOut(&State->Late.Delay,
- offset - (State->Late.Offset[j][0]>>FRACTIONBITS), j);
+ offset - State->Late.Offset[j][0], j);
for(j = 0;j < 4;j++)
f[j] = LateT60Filter(j, f[j], State);
@@ -1754,6 +1737,9 @@ static ALvoid LateReverb_Unfaded(ALreverbState *State, const ALsizei todo, ALflo
VectorAllpass_Unfaded(f, offset, apFeedCoeff, mixX, mixY, fade,
&State->Late.VecAp);
+ for(j = 0;j < 4;j++)
+ out[j][i] = f[j];
+
VectorReverse(f);
VectorPartialScatter(f, mixX, mixY);