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)
--- a/wave.h	Sat Feb 15 23:29:51 2025 -0800
+++ b/wave.h	Sun Feb 16 11:54:40 2025 -0800
@@ -32,6 +32,7 @@
 	uint16_t       block_align;
 	uint16_t       bits_per_sample;
 	riff_sub_chunk data_header;
+	long           data_offset;
 } wave_header;
 
 #pragma pack(pop)