aboutsummaryrefslogtreecommitdiffstats
path: root/alc/alc.cpp
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2019-12-05 00:18:59 -0800
committerChris Robinson <[email protected]>2019-12-05 00:18:59 -0800
commit200b07b288dff4aab686bfec9f2719e01cf6246c (patch)
tree7d5f148982b2a6fec786acc51bf7680969cf2b89 /alc/alc.cpp
parent863171efc9ed02b902111e15f7a63bcca83e407c (diff)
Fully reset the voice when updating the device
Diffstat (limited to 'alc/alc.cpp')
-rw-r--r--alc/alc.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/alc/alc.cpp b/alc/alc.cpp
index 05f90d38..06f8ce59 100644
--- a/alc/alc.cpp
+++ b/alc/alc.cpp
@@ -2194,6 +2194,58 @@ static ALCenum UpdateDeviceParams(ALCdevice *device, const ALCint *attrList)
if(voice.mSourceID.load(std::memory_order_relaxed) == 0u)
return;
+ voice.mStep = 0;
+ voice.mFlags |= VOICE_IS_FADING;
+
+ if((voice.mFmtChannels == FmtBFormat2D || voice.mFmtChannels == FmtBFormat3D)
+ && device->mAmbiOrder > voice.mAmbiOrder)
+ {
+ const ALuint *OrderFromChan;
+ if(voice.mFmtChannels == FmtBFormat2D)
+ {
+ static const ALuint Order2DFromChan[MAX_AMBI2D_CHANNELS]{
+ 0, 1,1, 2,2, 3,3,};
+ OrderFromChan = Order2DFromChan;
+ }
+ else
+ {
+ static const ALuint Order3DFromChan[MAX_AMBI_CHANNELS]{
+ 0, 1,1,1, 2,2,2,2,2, 3,3,3,3,3,3,3,};
+ OrderFromChan = Order3DFromChan;
+ }
+
+ const BandSplitter splitter{400.0f / static_cast<float>(device->Frequency)};
+
+ const auto scales = BFormatDec::GetHFOrderScales(voice.mAmbiOrder,
+ device->mAmbiOrder);
+ auto init_ambi = [device,&scales,&OrderFromChan,splitter](ALvoice::ChannelData &chandata) -> void
+ {
+ chandata.mPrevSamples.fill(0.0f);
+ chandata.mAmbiScale = scales[*(OrderFromChan++)];
+ chandata.mAmbiSplitter = splitter;
+ chandata.mDryParams = DirectParams{};
+ std::fill_n(chandata.mWetParams.begin(), device->NumAuxSends, SendParams{});
+ };
+ std::for_each(voice.mChans.begin(), voice.mChans.begin()+voice.mNumChannels,
+ init_ambi);
+
+ voice.mFlags |= VOICE_IS_AMBISONIC;
+ }
+ else
+ {
+ /* Clear previous samples. */
+ auto clear_prevs = [device](ALvoice::ChannelData &chandata) -> void
+ {
+ chandata.mPrevSamples.fill(0.0f);
+ chandata.mDryParams = DirectParams{};
+ std::fill_n(chandata.mWetParams.begin(), device->NumAuxSends, SendParams{});
+ };
+ std::for_each(voice.mChans.begin(), voice.mChans.begin()+voice.mNumChannels,
+ clear_prevs);
+
+ voice.mFlags &= ~VOICE_IS_AMBISONIC;
+ }
+
if(device->AvgSpeakerDist > 0.0f)
{
/* Reinitialize the NFC filters for new parameters. */