Mercurial > repos > blastem
changeset 2613:1fdf7acc5165
Fix handling of wave files with additional RIFF chunks before the data chunk
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 16 Feb 2025 11:54:40 -0800 |
parents | 7e04620c9dc1 |
children | c5314c0779c2 |
files | cdimage.c wave.c wave.h |
diffstat | 3 files changed, 14 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/cdimage.c Sat Feb 15 23:29:51 2025 -0800 +++ b/cdimage.c Sun Feb 16 11:54:40 2025 -0800 @@ -340,7 +340,7 @@ if (wave.audio_format != 1 || wave.num_channels != 2 || wave.sample_rate != 44100 || wave.bits_per_sample != 16) { warning("BlastEm only suports WAVE tracks in 16-bit stereo PCM format at 44100 hz, file %s does not match\n", fname); } - extra_offset = wave.format_header.size + sizeof(wave.data_header) + sizeof(wave.chunk); + extra_offset = wave.data_offset; } else { fseek(f, 0, SEEK_SET); flac = flac_file_from_file(f);
--- a/wave.c Sat Feb 15 23:29:51 2025 -0800 +++ b/wave.c Sun Feb 16 11:54:40 2025 -0800 @@ -28,7 +28,7 @@ uint8_t wave_read_header(FILE *f, wave_header *header) { - size_t initial_read = sizeof(*header) - sizeof(header->data_header); + size_t initial_read = offsetof(wave_header, data_header); if (fread(header, 1, initial_read, f) != initial_read) { return 0; } @@ -44,17 +44,21 @@ if (memcmp(header->format_header.id, "fmt ", 4)) { return 0; } - if (header->format_header.size < sizeof(*header) - sizeof(header->chunk) - sizeof(header->format_header) - sizeof(header->data_header)) { + if (header->format_header.size < offsetof(wave_header, data_header) - sizeof(header->chunk) - sizeof(header->format_header)) { return 0; } fseek(f, header->format_header.size + sizeof(header->chunk) + sizeof(header->format_header), SEEK_SET); - if (fread(&header->data_header, 1, sizeof(header->data_header), f) != sizeof(header->data_header)) { - return 0; + for (;;) + { + if (fread(&header->data_header, 1, sizeof(header->data_header), f) != sizeof(header->data_header)) { + return 0; + } + if (!memcmp(header->data_header.id, "data", 4)) { + header->data_offset = ftell(f); + return 1; + } + fseek(f, header->data_header.size, SEEK_CUR); } - if (memcmp(header->data_header.id, "data", 4)) { - return 0; - } - return 1; } int wave_finalize(FILE * f)