diff wave.c @ 2288:efc75ea79164

Support WAVE files in CUE sheets
author Michael Pavone <pavone@retrodev.com>
date Wed, 18 Jan 2023 23:31:44 -0800
parents 6e9d1a8c1b08
children
line wrap: on
line diff
--- a/wave.c	Sat Jan 14 09:23:50 2023 -0800
+++ b/wave.c	Wed Jan 18 23:31:44 2023 -0800
@@ -26,6 +26,37 @@
 	return fwrite(&header, 1, sizeof(header), f) == sizeof(header);
 }
 
+uint8_t wave_read_header(FILE *f, wave_header *header)
+{
+	size_t initial_read = sizeof(*header) - sizeof(header->data_header);
+	if (fread(header, 1, initial_read, f) != initial_read) {
+		return 0;
+	}
+	if (memcmp(header->chunk.id, "RIFF", 4)) {
+		return 0;
+	}
+	if (memcmp(header->chunk.format, "WAVE", 4)) {
+		return 0;
+	}
+	if (header->chunk.size < sizeof(*header) - 8) {
+		return 0;
+	}
+	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)) {
+		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;
+	}
+	if (memcmp(header->data_header.id, "data", 4)) {
+		return 0;
+	}
+	return 1;
+}
+
 int wave_finalize(FILE * f)
 {
 	uint32_t size = ftell(f);