diff --git a/src/sfizz/Voice.cpp b/src/sfizz/Voice.cpp index f305dbdb..eb97c57e 100644 --- a/src/sfizz/Voice.cpp +++ b/src/sfizz/Voice.cpp @@ -402,7 +402,8 @@ void sfz::Voice::fillWithData(AudioSpan buffer) noexcept const auto sampleEnd = min( static_cast(region->trueSampleEnd(currentPromise->oversamplingFactor)), static_cast(source.getNumFrames()) - ) - 1; + ) - 2; + if (region->shouldLoop() && region->loopEnd(currentPromise->oversamplingFactor) <= source.getNumFrames()) { const auto offset = sampleEnd - static_cast(region->loopStart(currentPromise->oversamplingFactor)); for (auto* index = indices.begin(); index < indices.end(); ++index) { @@ -415,6 +416,9 @@ void sfz::Voice::fillWithData(AudioSpan buffer) noexcept for (auto* index = indices.begin(); index < indices.end(); ++index) { if (*index > sampleEnd) { const auto remainingElements = static_cast(std::distance(index, indices.end())); + if (*index >= static_cast(source.getNumFrames()) && source.getNumFrames() != region->trueSampleEnd(currentPromise->oversamplingFactor)) { + DBG("[sfizz] Underflow: source available samples " << source.getNumFrames() << "/" << region->trueSampleEnd(currentPromise->oversamplingFactor) << " for sample " << region->sample); + } fill(indices.last(remainingElements), sampleEnd); fill(leftCoeffs.last(remainingElements), 0.0f); fill(rightCoeffs.last(remainingElements), 1.0f);