# HG changeset patch # User Michael Pavone # Date 1674113504 28800 # Node ID efc75ea791640696112a02bb0d01f9b76e4cb2cb # Parent 8a918eb95ba8d458cb5737b963842cf1ed127df2 Support WAVE files in CUE sheets diff -r 8a918eb95ba8 -r efc75ea79164 cdimage.c --- 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; } } } diff -r 8a918eb95ba8 -r efc75ea79164 wave.c --- 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); diff -r 8a918eb95ba8 -r efc75ea79164 wave.h --- 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_