From 0263367639c29b3b9e569e96dbcac3cd3697dedc 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];