diff options
Diffstat (limited to 'alc/effects/convolution.cpp')
-rw-r--r-- | alc/effects/convolution.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/alc/effects/convolution.cpp b/alc/effects/convolution.cpp index f72695bd..90220a50 100644 --- a/alc/effects/convolution.cpp +++ b/alc/effects/convolution.cpp @@ -194,6 +194,8 @@ struct ConvolutionState final : public EffectState { struct ChannelData { alignas(16) FloatBufferLine mBuffer{}; + float mHfScale{}; + BandSplitter mFilter{}; float Current[MAX_OUTPUT_CHANNELS]{}; float Target[MAX_OUTPUT_CHANNELS]{}; }; @@ -233,6 +235,7 @@ void ConvolutionState::UpsampleMix(const al::span<FloatBufferLine> samplesOut, for(auto &chan : *mChans) { const al::span<float> src{chan.mBuffer.data(), samplesToDo}; + chan.mFilter.processHfScale(src, chan.mHfScale); MixSamples(src, samplesOut, chan.Current, chan.Target, samplesToDo, 0); } } @@ -277,6 +280,10 @@ void ConvolutionState::deviceUpdate(const DeviceBase *device, const Buffer &buff (uint64_t{buffer.storage->mSampleLen}*device->Frequency+(buffer.storage->mSampleRate-1)) / buffer.storage->mSampleRate); + const BandSplitter splitter{device->mXOverFreq / static_cast<float>(device->Frequency)}; + for(auto &e : *mChans) + e.mFilter = splitter; + mFilter.resize(numChannels, {}); mOutput.resize(numChannels, {}); @@ -411,7 +418,13 @@ void ConvolutionState::update(const ContextBase *context, const EffectSlot *slot { DeviceBase *device{context->mDevice}; if(device->mAmbiOrder > mAmbiOrder) + { mMix = &ConvolutionState::UpsampleMix; + const auto scales = AmbiScale::GetHFOrderScales(mAmbiOrder, true); + (*mChans)[0].mHfScale = scales[0]; + for(size_t i{1};i < mChans->size();++i) + (*mChans)[i].mHfScale = scales[1]; + } mOutTarget = target.Main->Buffer; auto&& scales = GetAmbiScales(mAmbiScaling); |