From e38413a4fbb0b4f85950c929141856a767993f4f Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Wed, 4 Jan 2023 01:44:40 -0800 Subject: Handle negative offset starts for callback buffers --- core/voice.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/core/voice.cpp b/core/voice.cpp index 0199d948..fc3a38cc 100644 --- a/core/voice.cpp +++ b/core/voice.cpp @@ -297,14 +297,15 @@ void LoadBufferStatic(VoiceBufferItem *buffer, VoiceBufferItem *&bufferLoopItem, void LoadBufferCallback(VoiceBufferItem *buffer, const size_t numCallbackSamples, const FmtType sampleType, const FmtChannels sampleChannels, const size_t srcStep, - const size_t samplesToLoad, const al::span voiceSamples) + size_t samplesLoaded, const size_t samplesToLoad, const al::span voiceSamples) { /* Load what's left to play from the buffer */ - const size_t remaining{minz(samplesToLoad, numCallbackSamples)}; - LoadSamples(voiceSamples, 0, buffer->mSamples, 0, sampleType, sampleChannels, srcStep, - remaining); + const size_t remaining{minz(samplesToLoad-samplesLoaded, numCallbackSamples)}; + LoadSamples(voiceSamples, samplesLoaded, buffer->mSamples, 0, sampleType, sampleChannels, + srcStep, remaining); + samplesLoaded += remaining; - if(const size_t toFill{samplesToLoad - remaining}) + if(const size_t toFill{samplesToLoad - samplesLoaded}) { for(auto *chanbuffer : voiceSamples) { @@ -649,10 +650,11 @@ void Voice::mix(const State vstate, ContextBase *Context, const nanoseconds devi mFmtChannels, mFrameStep, samplesLoaded, SrcBufferSize, MixingSamples); else if(mFlags.test(VoiceIsCallback)) { - if(!mFlags.test(VoiceCallbackStopped) && SrcBufferSize > mNumCallbackSamples) + const size_t remaining{SrcBufferSize - samplesLoaded}; + if(!mFlags.test(VoiceCallbackStopped) && remaining > mNumCallbackSamples) { const size_t byteOffset{mNumCallbackSamples*mFrameSize}; - const size_t needBytes{SrcBufferSize*mFrameSize - byteOffset}; + const size_t needBytes{remaining*mFrameSize - byteOffset}; const int gotBytes{BufferListItem->mCallback(BufferListItem->mUserData, &BufferListItem->mSamples[byteOffset], static_cast(needBytes))}; @@ -664,10 +666,10 @@ void Voice::mix(const State vstate, ContextBase *Context, const nanoseconds devi mNumCallbackSamples += static_cast(gotBytes) / mFrameSize; } else - mNumCallbackSamples = SrcBufferSize; + mNumCallbackSamples = static_cast(remaining); } LoadBufferCallback(BufferListItem, mNumCallbackSamples, mFmtType, mFmtChannels, - mFrameStep, SrcBufferSize, MixingSamples); + mFrameStep, samplesLoaded, SrcBufferSize, MixingSamples); } else LoadBufferQueue(BufferListItem, BufferLoopItem, DataPosUInt, mFmtType, mFmtChannels, -- cgit v1.2.3