aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2019-01-08 18:34:45 -0800
committerChris Robinson <[email protected]>2019-01-08 18:34:45 -0800
commit0763dfa9544e6d1013641d3c76d321e7aab74b7d (patch)
treead4b4f4a45b469609859e19721494f0741fda4bf
parentedba7da8ab796df52c2963dd287c37eecc548aff (diff)
Apply the all-pass separately from the upsampling mix
-rw-r--r--Alc/bformatdec.cpp25
-rw-r--r--Alc/bformatdec.h4
2 files changed, 14 insertions, 15 deletions
diff --git a/Alc/bformatdec.cpp b/Alc/bformatdec.cpp
index 089d9465..db95e406 100644
--- a/Alc/bformatdec.cpp
+++ b/Alc/bformatdec.cpp
@@ -235,23 +235,23 @@ void BFormatDec::upSample(ALfloat (*OutBuffer)[BUFFERSIZE], const ALsizei OutCha
* subsequent higher-order decode generating the same response as a first-
* order decode.
*/
- for(ALsizei i{0};i < InChannels;i++)
- {
- /* NOTE: Because we can't treat the first-order signal as completely
- * decorrelated from the existing output (it may contain the reverb,
- * echo, etc, portion) phase interference is a possibility if not kept
- * coherent. As such, we need to apply an all-pass on the existing
- * output so that it stays aligned with the upsampled signal.
- */
+
+ /* NOTE: Because we can't treat the first-order signal as completely
+ * decorrelated from the existing output (it may contain the reverb, echo,
+ * etc, portion) phase interference is a possibility if not kept coherent.
+ * As such, we need to apply an all-pass on the existing output so that it
+ * stays aligned with the upsampled signal.
+ */
+ for(ALsizei i{0};i < OutChannels;i++)
mUpAllpass[i].process(OutBuffer[i], SamplesToDo);
+ for(ALsizei i{0};i < InChannels;i++)
+ {
mUpsampler[i].Splitter.process(mSamples[sHFBand].data(), mSamples[sLFBand].data(),
InSamples[i], SamplesToDo);
MixRowSamples(OutBuffer[i], mUpsampler[i].Gains,
&reinterpret_cast<ALfloat(&)[BUFFERSIZE]>(mSamples[0]), sNumBands, 0, SamplesToDo);
}
- for(ALsizei i{InChannels};i < OutChannels;i++)
- mUpAllpass[i].process(OutBuffer[i], SamplesToDo);
}
@@ -292,13 +292,12 @@ void AmbiUpsampler::process(ALfloat (*OutBuffer)[BUFFERSIZE], const ALsizei OutC
ASSUME(InChannels > 0);
ASSUME(OutChannels > InChannels);
+ for(ALsizei i{0};i < OutChannels;i++)
+ mAllpass[i].process(OutBuffer[i], SamplesToDo);
for(ALsizei i{0};i < InChannels;i++)
{
- mAllpass[i].process(OutBuffer[i], SamplesToDo);
mInput[i].Splitter.process(mSamples[sHFBand], mSamples[sLFBand], InSamples[i],
SamplesToDo);
MixRowSamples(OutBuffer[i], mInput[i].Gains, mSamples, sNumBands, 0, SamplesToDo);
}
- for(ALsizei i{InChannels};i < OutChannels;i++)
- mAllpass[i].process(OutBuffer[i], SamplesToDo);
}
diff --git a/Alc/bformatdec.h b/Alc/bformatdec.h
index f807808d..2f7ef612 100644
--- a/Alc/bformatdec.h
+++ b/Alc/bformatdec.h
@@ -32,11 +32,11 @@ class BFormatDec {
std::array<ALfloat,BUFFERSIZE> *mSamplesHF;
std::array<ALfloat,BUFFERSIZE> *mSamplesLF;
+ SplitterAllpass mUpAllpass[MAX_OUTPUT_CHANNELS];
struct {
BandSplitter Splitter;
ALfloat Gains[sNumBands];
} mUpsampler[4];
- SplitterAllpass mUpAllpass[MAX_OUTPUT_CHANNELS];
ALsizei mNumChannels;
ALboolean mDualBand;
@@ -64,12 +64,12 @@ class AmbiUpsampler {
static constexpr size_t sLFBand{1};
static constexpr size_t sNumBands{2};
+ SplitterAllpass mAllpass[MAX_OUTPUT_CHANNELS];
alignas(16) ALfloat mSamples[sNumBands][BUFFERSIZE];
struct {
BandSplitter Splitter;
ALfloat Gains[sNumBands];
} mInput[4];
- SplitterAllpass mAllpass[MAX_OUTPUT_CHANNELS];
public:
void reset(const ALsizei out_order, const ALfloat xover_norm);