diff options
-rw-r--r-- | al/source.cpp | 1 | ||||
-rw-r--r-- | core/voice.cpp | 13 | ||||
-rw-r--r-- | core/voice.h | 1 |
3 files changed, 7 insertions, 8 deletions
diff --git a/al/source.cpp b/al/source.cpp index 7db175ef..d3468628 100644 --- a/al/source.cpp +++ b/al/source.cpp @@ -539,6 +539,7 @@ void InitVoice(Voice *voice, ALsource *source, ALbufferQueueItem *BufferList, AL if(buffer->mCallback) voice->mFlags.set(VoiceIsCallback); else if(source->SourceType == AL_STATIC) voice->mFlags.set(VoiceIsStatic); voice->mNumCallbackBlocks = 0; + voice->mCallbackBlockBase = 0; voice->prepare(device); diff --git a/core/voice.cpp b/core/voice.cpp index b390df49..40f3c6b2 100644 --- a/core/voice.cpp +++ b/core/voice.cpp @@ -779,12 +779,6 @@ void Voice::mix(const State vstate, ContextBase *Context, const nanoseconds devi const al::span<float> dst) { std::copy_n(src, dst.size(), dst.begin()); }} : mResampler}; - /* For callback buffers, this is the sample offset for the start of the - * buffer data. This is needed with compressed formats to track how many - * samples into a block we're starting from. - */ - const uint callbackBase{RoundDown(static_cast<uint>(maxi(DataPosInt, 0)), mSamplesPerBlock)}; - /* UHJ2 and SuperStereo only have 2 buffer channels, but 3 mixing channels * (3rd channel is generated from decoding). */ @@ -894,6 +888,7 @@ void Voice::mix(const State vstate, ContextBase *Context, const nanoseconds devi mFrameStep, srcSampleDelay, srcBufferSize, al::to_address(resampleBuffer)); else if(mFlags.test(VoiceIsCallback)) { + const uint callbackBase{mCallbackBlockBase * mSamplesPerBlock}; const size_t bufferOffset{uintPos - callbackBase}; const size_t needSamples{bufferOffset + srcBufferSize - srcSampleDelay}; const size_t needBlocks{(needSamples + mSamplesPerBlock-1) / mSamplesPerBlock}; @@ -1091,8 +1086,8 @@ void Voice::mix(const State vstate, ContextBase *Context, const nanoseconds devi else if(mFlags.test(VoiceIsCallback)) { /* Handle callback buffer source */ - const uint samplesDone{static_cast<uint>(DataPosInt) - callbackBase}; - const uint blocksDone{samplesDone / mSamplesPerBlock}; + const uint currentBlock{static_cast<uint>(DataPosInt) / mSamplesPerBlock}; + const uint blocksDone{currentBlock - mCallbackBlockBase}; if(blocksDone < mNumCallbackBlocks) { const size_t byteOffset{blocksDone*mBytesPerBlock}; @@ -1100,11 +1095,13 @@ void Voice::mix(const State vstate, ContextBase *Context, const nanoseconds devi al::byte *data{BufferListItem->mSamples}; std::copy(data+byteOffset, data+byteEnd, data); mNumCallbackBlocks -= blocksDone; + mCallbackBlockBase += blocksDone; } else { BufferListItem = nullptr; mNumCallbackBlocks = 0; + mCallbackBlockBase += blocksDone; } } else diff --git a/core/voice.h b/core/voice.h index f197e463..000174b6 100644 --- a/core/voice.h +++ b/core/voice.h @@ -238,6 +238,7 @@ struct Voice { std::bitset<VoiceFlagCount> mFlags{}; uint mNumCallbackBlocks{0}; + uint mCallbackBlockBase{0}; struct TargetData { int FilterType; |