changeset 2288:efc75ea79164

Support WAVE files in CUE sheets
author Michael Pavone <pavone@retrodev.com>
date Wed, 18 Jan 2023 23:31:44 -0800
parents 8a918eb95ba8
children 92449b47cce8
files cdimage.c wave.c wave.h
diffstat 3 files changed, 47 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/cdimage.c	Sat Jan 14 09:23:50 2023 -0800
+++ b/cdimage.c	Wed Jan 18 23:31:44 2023 -0800
@@ -4,6 +4,7 @@
 
 #include "system.h"
 #include "util.h"
+#include "wave.h"
 
 static char* cmd_start(char *cur)
 {
@@ -199,6 +200,7 @@
 	FILE *f = NULL;
 	int track_of_file = -1;
 	uint8_t has_index_0 = 0;
+	uint32_t extra_offset = 0;
 	do {
 		char *cmd = cmd_start(line);
 		if (*cmd) {
@@ -266,10 +268,21 @@
 						for (end++; *end && *end != '\n' && *end != '\r'; end++)
 						{
 							if (!isspace(*end)) {
+								extra_offset = 0;
 								if (startswith(end, "BINARY")) {
 									audio_byte_swap = 0;
 								} else if (startswith(end, "MOTOROLA")) {
 									audio_byte_swap = 1;
+								} else if (startswith(end, "WAVE")) {
+									audio_byte_swap = 0;
+									wave_header wave;
+									if (!wave_read_header(f, &wave)) {
+										fatal_error("Wave file %s specified by cute sheet %s.%s is not valid\n", fname, media->name, media->extension);
+									}
+									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);
 								} else {
 									warning("Unsupported FILE type in CUE sheet. Only BINARY and MOTOROLA are supported\n");
 								}
@@ -310,7 +323,7 @@
 								tracks[track].file_offset -= tracks[track-2].end_lba * tracks[track-1].sector_bytes;
 							}
 						} else {
-							tracks[track].file_offset = 0;
+							tracks[track].file_offset = extra_offset;
 						}
 					}
 				}
--- 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);
--- a/wave.h	Sat Jan 14 09:23:50 2023 -0800
+++ b/wave.h	Wed Jan 18 23:31:44 2023 -0800
@@ -1,6 +1,6 @@
 /*
  Copyright 2013 Michael Pavone
- This file is part of BlastEm. 
+ This file is part of BlastEm.
  BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
 */
 #ifndef WAVE_H_
@@ -37,6 +37,7 @@
 #pragma pack(pop)
 
 int wave_init(FILE * f, uint32_t sample_rate, uint16_t bits_per_sample, uint16_t num_channels);
+uint8_t wave_read_header(FILE *f, wave_header *header);
 int wave_finalize(FILE * f);
 
 #endif //WAVE_H_