diff options
author | Chris Robinson <chris.kcat@gmail.com> | 2021-12-18 03:44:31 -0800 |
---|---|---|
committer | Chris Robinson <chris.kcat@gmail.com> | 2021-12-18 03:45:19 -0800 |
commit | 5bfa7c22fd8693060a809a9e5c3d55b78dae08b1 (patch) | |
tree | 73344e5f92f244e6ff530e8bdc5761ce96260e9a | |
parent | d5740589e52784d12d5592a2853066ae188f2379 (diff) |
Don't update voice sample histories when stopping/pausing
Since a voice pausing is on a fade-out, and will replay the same samples again
when restarting and fading in.
-rw-r--r-- | core/voice.cpp | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/core/voice.cpp b/core/voice.cpp index 4cda0c30..12df996a 100644 --- a/core/voice.cpp +++ b/core/voice.cpp @@ -348,7 +348,8 @@ void LoadBufferQueue(VoiceBufferItem *buffer, VoiceBufferItem *bufferLoopItem, void DoHrtfMix(const float *samples, const uint DstBufferSize, DirectParams &parms, - const float TargetGain, const uint Counter, uint OutPos, DeviceBase *Device) + const float TargetGain, const uint Counter, uint OutPos, const bool IsPlaying, + DeviceBase *Device) { const uint IrSize{Device->mIrSize}; auto &HrtfSamples = Device->HrtfSourceData; @@ -362,8 +363,9 @@ void DoHrtfMix(const float *samples, const uint DstBufferSize, DirectParams &par std::begin(HrtfSamples)); std::copy_n(samples, DstBufferSize, src_iter); /* Copy the last used samples back into the history buffer for later. */ - std::copy_n(std::begin(HrtfSamples) + DstBufferSize, parms.Hrtf.History.size(), - parms.Hrtf.History.begin()); + if(likely(IsPlaying)) + std::copy_n(std::begin(HrtfSamples) + DstBufferSize, parms.Hrtf.History.size(), + parms.Hrtf.History.begin()); /* If fading and this is the first mixing pass, fade between the IRs. */ uint fademix{0u}; @@ -628,7 +630,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo const size_t srcOffset{(increment*DstBufferSize + DataPosFrac)>>MixerFracBits}; SrcBufferSize = SrcBufferSize - PostPadding + MaxResamplerEdge; ((*mDecoder).*mDecoderFunc)(MixingSamples, MaxResamplerEdge, SrcBufferSize, - srcOffset); + srcOffset * likely(vstate == Playing)); } } @@ -638,7 +640,9 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo for(auto &chandata : mChans) { /* Store the last source samples used for next time. */ - std::copy_n(voiceSamples->data()+srcOffset, MaxResamplerPadding, prevSamples->data()); + if(likely(vstate == Playing)) + std::copy_n(voiceSamples->data()+srcOffset, MaxResamplerPadding, + prevSamples->data()); ++prevSamples; /* Resample, then apply ambisonic upsampling as needed. */ @@ -659,23 +663,20 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo if((mFlags&VoiceHasHrtf)) { - const float TargetGain{UNLIKELY(vstate == Stopping) ? 0.0f : - parms.Hrtf.Target.Gain}; - DoHrtfMix(samples, DstBufferSize, parms, TargetGain, Counter, OutPos, Device); - } - else if((mFlags&VoiceHasNfc)) - { - const float *TargetGains{UNLIKELY(vstate == Stopping) ? SilentTarget.data() - : parms.Gains.Target.data()}; - DoNfcMix({samples, DstBufferSize}, mDirect.Buffer.data(), parms, TargetGains, - Counter, OutPos, Device); + const float TargetGain{parms.Hrtf.Target.Gain * likely(vstate == Playing)}; + DoHrtfMix(samples, DstBufferSize, parms, TargetGain, Counter, OutPos, + (vstate == Playing), Device); } else { - const float *TargetGains{UNLIKELY(vstate == Stopping) ? SilentTarget.data() - : parms.Gains.Target.data()}; - MixSamples({samples, DstBufferSize}, mDirect.Buffer, - parms.Gains.Current.data(), TargetGains, Counter, OutPos); + const float *TargetGains{likely(vstate == Playing) ? parms.Gains.Target.data() + : SilentTarget.data()}; + if((mFlags&VoiceHasNfc)) + DoNfcMix({samples, DstBufferSize}, mDirect.Buffer.data(), parms, + TargetGains, Counter, OutPos, Device); + else + MixSamples({samples, DstBufferSize}, mDirect.Buffer, + parms.Gains.Current.data(), TargetGains, Counter, OutPos); } } @@ -688,8 +689,8 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo const float *samples{DoFilters(parms.LowPass, parms.HighPass, FilterBuf.data(), {ResampledData, DstBufferSize}, mSend[send].FilterType)}; - const float *TargetGains{UNLIKELY(vstate == Stopping) ? SilentTarget.data() - : parms.Gains.Target.data()}; + const float *TargetGains{likely(vstate == Playing) ? parms.Gains.Target.data() + : SilentTarget.data()}; MixSamples({samples, DstBufferSize}, mSend[send].Buffer, parms.Gains.Current.data(), TargetGains, Counter, OutPos); } @@ -703,7 +704,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo OutPos += DstBufferSize; Counter = maxu(DstBufferSize, Counter) - DstBufferSize; - if UNLIKELY(!BufferListItem) + if(unlikely(!BufferListItem)) { /* Do nothing extra when there's no buffers. */ } @@ -760,12 +761,12 @@ void Voice::mix(const State vstate, ContextBase *Context, const uint SamplesToDo if(!BufferListItem) BufferListItem = BufferLoopItem; } while(BufferListItem); } - } while(OutPos < SamplesToDo); + } while(OutPos < SamplesToDo && likely(vstate == Playing)); mFlags |= VoiceIsFading; /* Don't update positions and buffers if we were stopping. */ - if UNLIKELY(vstate == Stopping) + if(unlikely(vstate == Stopping)) { mPlayState.store(Stopped, std::memory_order_release); return; |