From 07892dbe28071fa836b540a9ae55420c69dc6ca6 Mon Sep 17 00:00:00 2001 From: PJB3005 Date: Sun, 15 Mar 2026 20:35:06 +0100 Subject: [PATCH] Allow decoding less PCM samples than a full frame --- src/dusk/audio/Adpcm.cpp | 5 +++-- src/dusk/audio/DuskDsp.cpp | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/dusk/audio/Adpcm.cpp b/src/dusk/audio/Adpcm.cpp index f4318d5d59..67b9ac9fd3 100644 --- a/src/dusk/audio/Adpcm.cpp +++ b/src/dusk/audio/Adpcm.cpp @@ -33,8 +33,7 @@ static s16 Clamp16(s32 value) { void dusk::audio::Adpcm4ToPcm16(const u8* adpcm, size_t adpcmLength, s16* pcm, size_t pcmLength, s16& hist2, s16& hist1) { assert (adpcmLength % AdpcmFrameSize == 0 && "ADPCM must be divisible by frame size"); - const auto expectedPcmLength = (adpcmLength / AdpcmFrameSize) * 16; - assert (expectedPcmLength <= pcmLength && "PCM output buffer is too small!"); + auto endPtr = pcm + pcmLength; for (int i = 0; i < adpcmLength; i += AdpcmFrameSize) { u8 header = adpcm[i]; @@ -55,6 +54,8 @@ void dusk::audio::Adpcm4ToPcm16(const u8* adpcm, size_t adpcmLength, s16* pcm, s hist1 = sample; *pcm++ = sample; + if (endPtr == pcm) + return; } } } diff --git a/src/dusk/audio/DuskDsp.cpp b/src/dusk/audio/DuskDsp.cpp index 80e7ffe028..a1fe8545dd 100644 --- a/src/dusk/audio/DuskDsp.cpp +++ b/src/dusk/audio/DuskDsp.cpp @@ -46,7 +46,9 @@ static u32 ConvertDataLengthToSamples(const JASDsp::TChannel& channel, u32 dataL static u32 ConvertSamplesToDataLength(const JASDsp::TChannel& channel, u32 samples) { if (samples % channel.mSamplesPerBlock != 0) { - CRASH("Indivisible sample count: %d\n", samples); + // Ensure we round up. + samples += channel.mSamplesPerBlock; + //CRASH("Indivisible sample count: %d\n", samples); } return (samples / channel.mSamplesPerBlock) * channel.mBytesPerBlock;