diff options
author | Chris Robinson <[email protected]> | 2019-10-14 20:45:23 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2019-10-14 20:45:23 -0700 |
commit | f58167e72dbc2844a06358ccd78d579feb17532a (patch) | |
tree | bb96812bcf53ebb5b3a7472ea4ca6cb263522dac | |
parent | 33fd1f9efd46c056cd4348e76cd9048b37721c8b (diff) |
More sanely handle the voice state when mixing
-rw-r--r-- | alc/voice.cpp | 30 | ||||
-rw-r--r-- | alc/voice.h | 2 |
2 files changed, 13 insertions, 19 deletions
diff --git a/alc/voice.cpp b/alc/voice.cpp index 7eb791d5..0aac0258 100644 --- a/alc/voice.cpp +++ b/alc/voice.cpp @@ -546,7 +546,7 @@ void DoNfcMix(ALvoice::TargetData &Direct, const float *TargetGains, DirectParam } // namespace -void ALvoice::mix(State vstate, ALCcontext *Context, const ALuint SamplesToDo) +void ALvoice::mix(const State vstate, ALCcontext *Context, const ALuint SamplesToDo) { static constexpr std::array<float,MAX_OUTPUT_CHANNELS> SilentTarget{}; @@ -778,30 +778,24 @@ void ALvoice::mix(State vstate, ALCcontext *Context, const ALuint SamplesToDo) /* Handle non-looping static source */ if(DataPosInt >= BufferListItem->mSampleLen) { - if LIKELY(vstate == ALvoice::Playing) - vstate = ALvoice::Stopped; BufferListItem = nullptr; break; } } } - else while(1) + else { /* Handle streaming source */ - if(BufferListItem->mSampleLen > DataPosInt) - break; + do { + if(BufferListItem->mSampleLen > DataPosInt) + break; - DataPosInt -= BufferListItem->mSampleLen; + DataPosInt -= BufferListItem->mSampleLen; - ++buffers_done; - BufferListItem = BufferListItem->mNext.load(std::memory_order_relaxed); - if(!BufferListItem) BufferListItem = BufferLoopItem; - if(!BufferListItem) - { - if LIKELY(vstate == ALvoice::Playing) - vstate = ALvoice::Stopped; - break; - } + ++buffers_done; + BufferListItem = BufferListItem->mNext.load(std::memory_order_relaxed); + if(!BufferListItem) BufferListItem = BufferLoopItem; + } while(BufferListItem); } } while(OutPos < SamplesToDo); @@ -821,7 +815,7 @@ void ALvoice::mix(State vstate, ALCcontext *Context, const ALuint SamplesToDo) mPosition.store(DataPosInt, std::memory_order_relaxed); mPositionFrac.store(DataPosFrac, std::memory_order_relaxed); mCurrentBuffer.store(BufferListItem, std::memory_order_relaxed); - if(vstate == ALvoice::Stopped) + if(!BufferListItem) { mLoopBuffer.store(nullptr, std::memory_order_relaxed); mSourceID.store(0u, std::memory_order_relaxed); @@ -844,7 +838,7 @@ void ALvoice::mix(State vstate, ALCcontext *Context, const ALuint SamplesToDo) } } - if(vstate == ALvoice::Stopped) + if(!BufferListItem) { /* If the voice just ended, set it to Stopping so the next render * ensures any residual noise fades to 0 amplitude. diff --git a/alc/voice.h b/alc/voice.h index 206e2e6b..d6b624f9 100644 --- a/alc/voice.h +++ b/alc/voice.h @@ -287,7 +287,7 @@ struct ALvoice { return *this; } - void mix(State vstate, ALCcontext *Context, const ALuint SamplesToDo); + void mix(const State vstate, ALCcontext *Context, const ALuint SamplesToDo); }; #endif /* VOICE_H */ |