aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2018-12-22 10:00:06 -0800
committerChris Robinson <[email protected]>2018-12-22 10:00:06 -0800
commitb955c5cf5dbdc0814daa349e90907229774574aa (patch)
tree00b38458c9af86fce44799d685f303fa4f62cc25 /Alc
parent87724db6e3f60ec9866b01a50e4e1e163efda28f (diff)
A bit of cleanup for CalcPanningAndFilters
Diffstat (limited to 'Alc')
-rw-r--r--Alc/alu.cpp54
1 files changed, 30 insertions, 24 deletions
diff --git a/Alc/alu.cpp b/Alc/alu.cpp
index 419334d5..be0bafbf 100644
--- a/Alc/alu.cpp
+++ b/Alc/alu.cpp
@@ -585,15 +585,13 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev
if(Device->AvgSpeakerDist > 0.0f)
{
- const ALfloat mdist{Distance * Listener.Params.MetersPerUnit};
- const ALfloat w1{SPEEDOFSOUNDMETRESPERSEC /
- (Device->AvgSpeakerDist * (ALfloat)Device->Frequency)};
- ALfloat w0{SPEEDOFSOUNDMETRESPERSEC /
- (mdist * (ALfloat)Device->Frequency)};
- /* Clamp w0 for really close distances, to prevent excessive
- * bass.
+ /* Clamp the distance for really close sources, to prevent
+ * excessive bass.
*/
- w0 = minf(w0, w1*4.0f);
+ const ALfloat mdist{maxf(Distance*Listener.Params.MetersPerUnit,
+ Device->AvgSpeakerDist/4.0f)};
+ const ALfloat w0{SPEEDOFSOUNDMETRESPERSEC /
+ (mdist * (ALfloat)Device->Frequency)};
/* Only need to adjust the first channel of a B-Format source. */
voice->Direct.Params[0].NFCtrlFilter.adjust(w0);
@@ -604,6 +602,12 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev
voice->Flags |= VOICE_HAS_NFC;
}
+ /* Always render B-Format sources to the FOA output, to ensure
+ * smooth changes if it switches between panned and unpanned.
+ */
+ voice->Direct.Buffer = Device->FOAOut.Buffer;
+ voice->Direct.Channels = Device->FOAOut.NumChannels;
+
/* A scalar of 1.5 for plain stereo results in +/-60 degrees being
* moved to +/-90 degrees for direct right and left speaker
* responses.
@@ -612,14 +616,14 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev
CalcAngleCoeffs((Device->Render_Mode==StereoPair) ? ScaleAzimuthFront(Azi, 1.5f) : Azi,
Elev, Spread, coeffs);
- /* NOTE: W needs to be scaled by sqrt(2) due to FuMa normalization. */
- ComputePanGains(&Device->Dry, coeffs, DryGain*SQRTF_2,
+ /* NOTE: W needs to be scaled due to FuMa normalization. */
+ ComputePanGains(&Device->FOAOut, coeffs, DryGain*AmbiScale::FromFuMa[0],
voice->Direct.Params[0].Gains.Target);
for(ALsizei i{0};i < NumSends;i++)
{
if(const ALeffectslot *Slot{SendSlots[i]})
ComputePanningGainsBF(Slot->ChanMap, Slot->NumChannels, coeffs,
- WetGain[i]*SQRTF_2, voice->Send[i].Params[0].Gains.Target
+ WetGain[i]*AmbiScale::FromFuMa[0], voice->Send[i].Params[0].Gains.Target
);
}
}
@@ -663,12 +667,16 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev
* matrix is transposed, for the inputs to align on the rows and
* outputs on the columns.
*/
+ static constexpr ALfloat scale0{AmbiScale::FromFuMa[0]};
+ static constexpr ALfloat scale1{AmbiScale::FromFuMa[1]};
+ static constexpr ALfloat scale2{AmbiScale::FromFuMa[2]};
+ static constexpr ALfloat scale3{AmbiScale::FromFuMa[3]};
const alu::Matrix matrix{
- // ACN0 ACN1 ACN2 ACN3
- SQRTF_2, 0.0f, 0.0f, 0.0f, // Ambi W
- 0.0f, -N[0]*SQRTF_3, N[1]*SQRTF_3, -N[2]*SQRTF_3, // Ambi X
- 0.0f, U[0]*SQRTF_3, -U[1]*SQRTF_3, U[2]*SQRTF_3, // Ambi Y
- 0.0f, -V[0]*SQRTF_3, V[1]*SQRTF_3, -V[2]*SQRTF_3 // Ambi Z
+ // ACN0 ACN1 ACN2 ACN3
+ scale0, 0.0f, 0.0f, 0.0f, // Ambi W
+ 0.0f, -N[0]*scale1, N[1]*scale2, -N[2]*scale3, // Ambi X
+ 0.0f, U[0]*scale1, -U[1]*scale2, U[2]*scale3, // Ambi Y
+ 0.0f, -V[0]*scale1, V[1]*scale2, -V[2]*scale3 // Ambi Z
};
voice->Direct.Buffer = Device->FOAOut.Buffer;
@@ -808,15 +816,13 @@ void CalcPanningAndFilters(ALvoice *voice, const ALfloat Azi, const ALfloat Elev
/* Calculate NFC filter coefficient if needed. */
if(Device->AvgSpeakerDist > 0.0f)
{
- const ALfloat mdist{Distance * Listener.Params.MetersPerUnit};
- const ALfloat w1{SPEEDOFSOUNDMETRESPERSEC /
- (Device->AvgSpeakerDist * (ALfloat)Device->Frequency)};
- ALfloat w0{SPEEDOFSOUNDMETRESPERSEC /
- (mdist * (ALfloat)Device->Frequency)};
- /* Clamp w0 for really close distances, to prevent excessive
- * bass.
+ /* Clamp the distance for really close sources, to prevent
+ * excessive bass.
*/
- w0 = minf(w0, w1*4.0f);
+ const ALfloat mdist{maxf(Distance*Listener.Params.MetersPerUnit,
+ Device->AvgSpeakerDist/4.0f)};
+ const ALfloat w0{SPEEDOFSOUNDMETRESPERSEC /
+ (mdist * (ALfloat)Device->Frequency)};
/* Adjust NFC filters. */
for(ALsizei c{0};c < num_channels;c++)