aboutsummaryrefslogtreecommitdiffstats
path: root/Alc
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2019-02-19 22:55:43 -0800
committerChris Robinson <[email protected]>2019-02-19 22:55:43 -0800
commit77ba61ecb3973dab4fff5fdc8bc237a6f4cd0056 (patch)
tree1f9a9d223b25c3418fce2185b5729203190a05e2 /Alc
parent87902fa3b21b5bba22a9d8cddabb9ce3e1303c94 (diff)
Partially handle non-periphonic reverb input
Diffstat (limited to 'Alc')
-rw-r--r--Alc/effects/reverb.cpp29
1 files changed, 26 insertions, 3 deletions
diff --git a/Alc/effects/reverb.cpp b/Alc/effects/reverb.cpp
index 11e3e56c..764fd376 100644
--- a/Alc/effects/reverb.cpp
+++ b/Alc/effects/reverb.cpp
@@ -297,6 +297,9 @@ struct ReverbState final : public EffectState {
ALfloat LFReference{AL_EAXREVERB_DEFAULT_LFREFERENCE};
} mParams;
+ ALsizei mNumInputs{0}; /* 3 or 4 */
+ ALfloat mInputConv[NUM_LINES][4/*NumInputs*/];
+
/* Master effect filters */
struct {
BiquadFilter Lp;
@@ -467,6 +470,28 @@ ALboolean ReverbState::deviceUpdate(const ALCdevice *Device)
EARLY_TAP_LENGTHS[NUM_LINES-1]*multiplier) *
frequency);
+ mNumInputs = 4;
+ if(mNumInputs == 3)
+ {
+ for(ALsizei i{0};i < NUM_LINES;++i)
+ {
+ mInputConv[i][0] = B2A[i][0];
+ mInputConv[i][1] = B2A[i][1];
+ mInputConv[i][2] = B2A[i][3];
+ mInputConv[i][3] = 0.0f;
+ }
+ }
+ else
+ {
+ for(ALsizei i{0};i < NUM_LINES;++i)
+ {
+ mInputConv[i][0] = B2A[i][0];
+ mInputConv[i][1] = B2A[i][1];
+ mInputConv[i][2] = B2A[i][2];
+ mInputConv[i][3] = B2A[i][3];
+ }
+ }
+
/* Clear filters and gain coefficients since the delay lines were all just
* cleared (if not reallocated).
*/
@@ -1321,9 +1346,7 @@ void ReverbState::process(ALsizei SamplesToDo, const ALfloat (*RESTRICT SamplesI
for(ALsizei c{0};c < NUM_LINES;c++)
{
std::fill(std::begin(afmt[c]), std::end(afmt[c]), 0.0f);
- MixRowSamples(afmt[c], B2A[c].data(),
- SamplesIn, MAX_EFFECT_CHANNELS, base, todo
- );
+ MixRowSamples(afmt[c], mInputConv[c], SamplesIn, mNumInputs, base, todo);
}
/* Process the samples for reverb. */