From 71644ff3e64d00dd6e5a6efdff9d579e7a839662 Mon Sep 17 00:00:00 2001 From: Matiq Date: Sat, 22 Aug 2026 10:59:26 +0300 Subject: [PATCH] =?UTF-8?q?fix(render48k):=20chunk-scan=20WAV=20loader=20?= =?UTF-8?q?=E2=80=94=20hdr[40]=20is=20not=20data=20size=20when=20bext/junk?= =?UTF-8?q?=20present?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dsp/render48k.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dsp/render48k.cpp b/dsp/render48k.cpp index 0351525..559a7c0 100644 --- a/dsp/render48k.cpp +++ b/dsp/render48k.cpp @@ -26,7 +26,21 @@ static bool load_wav(const char* path, std::vector& out, int& sr) { sr = *(int*)(hdr + 24); int ch = *(short*)(hdr + 22); int bits = *(short*)(hdr + 34); - int data = *(int*)(hdr + 40); + // scan chunks to find data chunk size (hdr[40] may be bext/junk size) + int data = 0; + int64_t pos = 12; + fseek(f, 12, SEEK_SET); + while (pos < 32 * 1024 * 1024) { + char cid[4]; int csize; + if (fread(cid, 1, 4, f) < 4 || fread(&csize, 4, 1, f) < 1) break; + pos += 8; + if (memcmp(cid, "data", 4) == 0) { data = csize; break; } + pos += csize; + int skip = csize; + if (csize % 2) skip++; // odd chunk size padded + fseek(f, skip, SEEK_CUR); + } + if (!data) { fclose(f); return false; } int n = data / (ch * (bits / 8)); g_in_ch = ch; out.resize(n);