mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-13 08:34:32 +02:00
add clamp
This commit is contained in:
18
src/sound.h
18
src/sound.h
@@ -182,6 +182,7 @@ namespace Sound {
|
|||||||
#define R(x) int32(preset.##x)
|
#define R(x) int32(preset.##x)
|
||||||
#define V(x) value(R(x))
|
#define V(x) value(R(x))
|
||||||
#define D(a,b) value(preset.##a - preset.##b)
|
#define D(a,b) value(preset.##a - preset.##b)
|
||||||
|
#define C(a) clamp(a, -0x8000, 0x7FFF)
|
||||||
|
|
||||||
void process(FrameHI *frames, int count) {
|
void process(FrameHI *frames, int count) {
|
||||||
PROFILE_CPU_TIMING(stats.reverb);
|
PROFILE_CPU_TIMING(stats.reverb);
|
||||||
@@ -193,24 +194,24 @@ namespace Sound {
|
|||||||
int32 Rin = frame.R;
|
int32 Rin = frame.R;
|
||||||
|
|
||||||
// Same Side Reflection (left-to-left and right-to-right)
|
// Same Side Reflection (left-to-left and right-to-right)
|
||||||
V(mLSAME) = ((Lin + (V(dLSAME) * R(vWALL) >> 15) - V(mLSAME - 1)) * R(vIIR) >> 15) + V(mLSAME - 1);
|
V(mLSAME) = C(((Lin + (V(dLSAME) * R(vWALL) >> 15) - V(mLSAME - 1)) * R(vIIR) >> 15) + V(mLSAME - 1));
|
||||||
V(mRSAME) = ((Rin + (V(dRSAME) * R(vWALL) >> 15) - V(mRSAME - 1)) * R(vIIR) >> 15) + V(mRSAME - 1);
|
V(mRSAME) = C(((Rin + (V(dRSAME) * R(vWALL) >> 15) - V(mRSAME - 1)) * R(vIIR) >> 15) + V(mRSAME - 1));
|
||||||
|
|
||||||
// Different Side Reflection (left-to-right and right-to-left)
|
// Different Side Reflection (left-to-right and right-to-left)
|
||||||
V(mLDIFF) = ((Lin + (V(dRDIFF) * R(vWALL) >> 15) - V(mLDIFF - 1)) * R(vIIR) >> 15) + V(mLDIFF - 1);
|
V(mLDIFF) = C(((Lin + (V(dRDIFF) * R(vWALL) >> 15) - V(mLDIFF - 1)) * R(vIIR) >> 15) + V(mLDIFF - 1));
|
||||||
V(mRDIFF) = ((Rin + (V(dLDIFF) * R(vWALL) >> 15) - V(mRDIFF - 1)) * R(vIIR) >> 15) + V(mRDIFF - 1);
|
V(mRDIFF) = C(((Rin + (V(dLDIFF) * R(vWALL) >> 15) - V(mRDIFF - 1)) * R(vIIR) >> 15) + V(mRDIFF - 1));
|
||||||
|
|
||||||
// Early Echo (Comb Filter, with input from buffer)
|
// Early Echo (Comb Filter, with input from buffer)
|
||||||
int32 Lout = (R(vCOMB1) * V(mLCOMB1) + R(vCOMB2) * V(mLCOMB2) + R(vCOMB3) * V(mLCOMB3) + R(vCOMB4) * V(mLCOMB4)) >> 15;
|
int32 Lout = (R(vCOMB1) * V(mLCOMB1) + R(vCOMB2) * V(mLCOMB2) + R(vCOMB3) * V(mLCOMB3) + R(vCOMB4) * V(mLCOMB4)) >> 15;
|
||||||
int32 Rout = (R(vCOMB1) * V(mRCOMB1) + R(vCOMB2) * V(mRCOMB2) + R(vCOMB3) * V(mRCOMB3) + R(vCOMB4) * V(mRCOMB4)) >> 15;
|
int32 Rout = (R(vCOMB1) * V(mRCOMB1) + R(vCOMB2) * V(mRCOMB2) + R(vCOMB3) * V(mRCOMB3) + R(vCOMB4) * V(mRCOMB4)) >> 15;
|
||||||
|
|
||||||
// Late Reverb APF1 (All Pass Filter 1, with input from COMB)
|
// Late Reverb APF1 (All Pass Filter 1, with input from COMB)
|
||||||
Lout = Lout - (R(vAPF1) * D(mLAPF1, dAPF1) >> 15); V(mLAPF1) = Lout; Lout = (Lout * R(vAPF1) >> 15) + D(mLAPF1, dAPF1);
|
Lout = Lout - (R(vAPF1) * D(mLAPF1, dAPF1) >> 15); V(mLAPF1) = C(Lout); Lout = (Lout * R(vAPF1) >> 15) + D(mLAPF1, dAPF1);
|
||||||
Rout = Rout - (R(vAPF1) * D(mRAPF1, dAPF1) >> 15); V(mRAPF1) = Rout; Rout = (Rout * R(vAPF1) >> 15) + D(mRAPF1, dAPF1);
|
Rout = Rout - (R(vAPF1) * D(mRAPF1, dAPF1) >> 15); V(mRAPF1) = C(Rout); Rout = (Rout * R(vAPF1) >> 15) + D(mRAPF1, dAPF1);
|
||||||
|
|
||||||
// Late Reverb APF2 (All Pass Filter 2, with input from APF1)
|
// Late Reverb APF2 (All Pass Filter 2, with input from APF1)
|
||||||
Lout = Lout - (R(vAPF2) * D(mLAPF2, dAPF2) >> 15); V(mLAPF2) = Lout; Lout = (Lout * R(vAPF2) >> 15) + D(mLAPF2, dAPF2);
|
Lout = Lout - (R(vAPF2) * D(mLAPF2, dAPF2) >> 15); V(mLAPF2) = C(Lout); Lout = (Lout * R(vAPF2) >> 15) + D(mLAPF2, dAPF2);
|
||||||
Rout = Rout - (R(vAPF2) * D(mRAPF2, dAPF2) >> 15); V(mRAPF2) = Rout; Rout = (Rout * R(vAPF2) >> 15) + D(mRAPF2, dAPF2);
|
Rout = Rout - (R(vAPF2) * D(mRAPF2, dAPF2) >> 15); V(mRAPF2) = C(Rout); Rout = (Rout * R(vAPF2) >> 15) + D(mRAPF2, dAPF2);
|
||||||
|
|
||||||
// Output to Mixer (Output volume multiplied with input from APF2)
|
// Output to Mixer (Output volume multiplied with input from APF2)
|
||||||
frame.L = Lout;
|
frame.L = Lout;
|
||||||
@@ -226,6 +227,7 @@ namespace Sound {
|
|||||||
#undef R
|
#undef R
|
||||||
#undef V
|
#undef V
|
||||||
#undef D
|
#undef D
|
||||||
|
#undef C
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user