From 7e19b4cb10c841cbfd54fa59b65ffba62d916163 Mon Sep 17 00:00:00 2001 From: jz5 Date: Sat, 27 Aug 2022 19:50:53 +0900 Subject: [PATCH] patterns: Fixed chunk size issues in WAV pattern. (#44) --- patterns/wav.hexpat | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/patterns/wav.hexpat b/patterns/wav.hexpat index 156ada2..ca53a80 100644 --- a/patterns/wav.hexpat +++ b/patterns/wav.hexpat @@ -169,7 +169,7 @@ struct WaveListItem : WaveChunk { } else if (chunkId == "note") { WaveNote note; } else { - padding[chunkSize]; + padding[(chunkSize + 1) >> 1 << 1]; } }; @@ -181,36 +181,48 @@ struct WaveList { WaveListItem item[while ($ < listEnd)]; }; +u32 paddedChunkSize; + struct WavData { WaveChunk chunk; + paddedChunkSize = (chunk.chunkSize + 1) >> 1 << 1; if (chunk.chunkId == "fmt ") { WaveFormat fmt; if (fmt.formatTag == WaveFormatType::PCM) { WaveFormatPCM pcmExtraData; + padding[paddedChunkSize - sizeof(fmt) - sizeof(pcmExtraData)]; } else if (fmt.formatTag == WaveFormatType::MS_ADPCM) { WaveFormatMSADPCM msAdpcmExtraData; + padding[paddedChunkSize - sizeof(fmt) - sizeof(msAdpcmExtraData)]; } else if (fmt.formatTag == WaveFormatType::MPEG) { WaveFormatMPEG mpegExtraData; + padding[paddedChunkSize - sizeof(fmt) - sizeof(mpegExtraData)]; } else if (fmt.formatTag == WaveFormatType::MPEGLAYER3) { WaveFormatMPEGLayer3 mpegLayer3ExtraData; + padding[paddedChunkSize - sizeof(fmt) - sizeof(mpegLayer3ExtraData)]; } else { WaveFormatExDummy unknown; + padding[paddedChunkSize - sizeof(fmt) - sizeof(unknown)]; } } else if (chunk.chunkId == "data") { - padding[chunk.chunkSize]; + padding[paddedChunkSize]; } else if (chunk.chunkId == "fact") { WaveFact fact; + padding[paddedChunkSize - sizeof(fact)]; } else if (chunk.chunkId == "smpl") { WaveSample smpl; + padding[paddedChunkSize - sizeof(smpl)]; } else if (chunk.chunkId == "cue ") { WaveCue cue; + padding[paddedChunkSize - sizeof(cue)]; } else if (chunk.chunkId == "LIST") { listEnd = $ + chunk.chunkSize; WaveList list; + padding[paddedChunkSize % 1]; } else { - padding[chunk.chunkSize]; + padding[paddedChunkSize]; } };