fix(bridge): WAV header data_size for IEEE float32 (was 16-bit byte count)

- finishWav call sites accumulated n*4 (stereo 16-bit) but float32 writer
  emits n*8 bytes -> RIFF/data chunk sizes half the real value; players and
  soundfile truncated renders to half length
- gate test now asserts file size == 44 + data_size to catch this
This commit is contained in:
2026-08-18 17:35:54 +07:00
parent 351ee56080
commit ba9ceeea90
3 changed files with 4 additions and 2 deletions
+1 -1
View File
@@ -881,7 +881,7 @@ int run_render_fx_job(const std::string& jobPath, const std::string& inPath,
for (uint64_t pos = 0; pos < in.L.size(); pos += chunk) {
const uint32_t n = (uint32_t)std::min<uint64_t>(chunk, in.L.size() - pos);
writeFrames(wav, in.L.data() + pos, in.R.data() + pos, n);
dataBytes += (uint64_t)n * 4;
dataBytes += (uint64_t)n * 8; // stereo float32: 2ch * 4B
}
finishWav(wav, dataBytes);
wav.close();
+1 -1
View File
@@ -388,7 +388,7 @@ int run_render_job(const std::string& jobPath, const std::string& outPath) {
const uint32_t n = (uint32_t)(to - from);
mgr.renderAll(L.data(), R.data(), n);
writeFrames(wav, L.data(), R.data(), n);
dataBytes += (uint64_t)n * 4;
dataBytes += (uint64_t)n * 8; // stereo float32: 2ch * 4B
};
while (pos < totalNeeded) {
const uint64_t chunkEnd = std::min(pos + chunk, (uint64_t)totalNeeded);
+2
View File
@@ -43,6 +43,8 @@ def wav_format_info(path):
with open(path, "rb") as f:
b = f.read(44)
assert b[:4] == b"RIFF" and b[8:12] == b"WAVE", "not RIFF/WAVE"
data_size = struct.unpack_from("<I", b, 40)[0]
assert os.path.getsize(path) == 44 + data_size, "data chunk size mismatch"
return {
"fmt_tag": struct.unpack_from("<H", b, 20)[0],
"channels": struct.unpack_from("<H", b, 22)[0],