From e8a7eaf9543b9e7c408e8033c85413e35ad4c364 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Tue, 15 Jul 2025 06:32:27 -0700 Subject: [PATCH] libvgm: Fix track ending without glitches Track rendering returns the number of bytes rendered, which also cuts short when the track ends. So properly react to this count when running the player, so we don't keep trying to render, or pick up uninitialized data from the buffer. Signed-off-by: Christopher Snowhill --- Plugins/libvgmPlayer/libvgmDecoder.mm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Plugins/libvgmPlayer/libvgmDecoder.mm b/Plugins/libvgmPlayer/libvgmDecoder.mm index 36c86045d..e9391a3b3 100644 --- a/Plugins/libvgmPlayer/libvgmDecoder.mm +++ b/Plugins/libvgmPlayer/libvgmDecoder.mm @@ -242,11 +242,16 @@ const int masterVol = 0x10000; // Fixed point 16.16 int numSamples = framesToDo * numChannels * (numBitsPerSample / 8); - mainPlr->Render(numSamples, buf); + UINT32 numRendered = mainPlr->Render(numSamples, buf); - buf = (void*)(((uint8_t*)buf) + numSamples); + buf = (void*)(((uint8_t*)buf) + numRendered); - framesDone += framesToDo; + UINT32 framesRendered = numRendered / (numChannels * (numBitsPerSample / 8)); + + framesDone += framesRendered; + + if(framesRendered < framesToDo) + break; } [chunk setStreamTimestamp:streamTimestamp];