diff options
author | Chris Robinson <[email protected]> | 2023-02-11 02:03:03 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2023-02-11 02:03:03 -0800 |
commit | 38a4f3a45d6416a7992644f317094d3a2e933fe6 (patch) | |
tree | 4f04379d10d2d98abca04c26fae51c4a07203090 /core/voice.cpp | |
parent | 74d7d60a6c78893d0e05e40b6a55f7d8642bac19 (diff) |
Check for the voice being beyond the loop end point earlier
Diffstat (limited to 'core/voice.cpp')
-rw-r--r-- | core/voice.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/core/voice.cpp b/core/voice.cpp index 972628a5..b7e1c67d 100644 --- a/core/voice.cpp +++ b/core/voice.cpp @@ -260,7 +260,7 @@ void LoadSamples(const al::span<float*> dstSamples, const size_t dstOffset, cons #undef HANDLE_FMT } -void LoadBufferStatic(VoiceBufferItem *buffer, VoiceBufferItem *&bufferLoopItem, +void LoadBufferStatic(VoiceBufferItem *buffer, VoiceBufferItem *bufferLoopItem, const size_t dataPosInt, const FmtType sampleType, const FmtChannels sampleChannels, const size_t srcStep, size_t samplesLoaded, const size_t samplesToLoad, const al::span<float*> voiceSamples) @@ -268,11 +268,8 @@ void LoadBufferStatic(VoiceBufferItem *buffer, VoiceBufferItem *&bufferLoopItem, const size_t loopStart{buffer->mLoopStart}; const size_t loopEnd{buffer->mLoopEnd}; - /* If current pos is beyond the loop range, do not loop */ - if(!bufferLoopItem || dataPosInt >= loopEnd) + if(!bufferLoopItem) { - bufferLoopItem = nullptr; - /* Load what's left to play from the buffer */ const size_t remaining{minz(samplesToLoad-samplesLoaded, buffer->mSampleLen-dataPosInt)}; LoadSamples(voiceSamples, samplesLoaded, buffer->mSamples, dataPosInt, sampleType, @@ -525,6 +522,15 @@ void Voice::mix(const State vstate, ContextBase *Context, const nanoseconds devi OutPos = static_cast<uint>(sampleOffset); } + /* If the static voice's current position is beyond the buffer loop end + * position, disable looping. + */ + if(mFlags.test(VoiceIsStatic) && BufferLoopItem) + { + if(DataPosInt >= 0 && static_cast<uint>(DataPosInt) >= BufferListItem->mLoopEnd) + BufferLoopItem = nullptr; + } + if(!Counter) { /* No fading, just overwrite the old/current params. */ |