Mercurial > repos > blastem
diff cue.c @ 2089:0db3af42dd72
Fix some byte order stuff for audio tracks
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Feb 2022 13:51:49 -0800 |
parents | bafb757e1cd2 |
children |
line wrap: on
line diff
--- a/cue.c Sun Feb 06 13:51:09 2022 -0800 +++ b/cue.c Sun Feb 06 13:51:49 2022 -0800 @@ -52,7 +52,7 @@ { media->cur_sector = sector; uint32_t lba = sector; - uint8_t track; + uint32_t track; for (track = 0; track < media->num_tracks; track++) { if (lba < media->tracks[track].fake_pregap) { @@ -69,6 +69,9 @@ break; } } + if (track < media->num_tracks) { + media->cur_track = track; + } if (!media->in_fake_pregap) { fseek(media->f, lba * 2352, SEEK_SET); } @@ -103,6 +106,12 @@ } else if (media->in_fake_pregap == FAKE_AUDIO) { return 0; } else { + if (media->tracks[media->cur_track].need_swap) { + if (offset & 1) { + return media->byte_storage; + } + media->byte_storage = fgetc(media->f); + } return fgetc(media->f); } } @@ -147,6 +156,7 @@ media->tracks = tracks; line = media->buffer; int track = -1; + uint8_t audio_byte_swap = 0; do { char *cmd = cmd_start(line); if (cmd) { @@ -161,6 +171,7 @@ cmd = cmd_start(end); if (cmd) { tracks[track].type = startswith(cmd, "AUDIO") ? TRACK_AUDIO : TRACK_DATA; + tracks[track].need_swap = tracks[track].type == TRACK_AUDIO && audio_byte_swap; } } else if (startswith(cmd, "FILE ")) { if (media->f) { @@ -191,6 +202,19 @@ fatal_error("Failed to open %s specified by FILE command in CUE sheet %s.%s\n", fname, media->name, media->extension); } free(fname); + for (end++; *end && *end != '\n' && *end != '\r'; end++) + { + if (!isspace(*end)) { + if (startswith(end, "BINARY")) { + audio_byte_swap = 0; + } else if (startswith(end, "MOTOROLA")) { + audio_byte_swap = 1; + } else { + warning("Unsupported FILE type in CUE sheet. Only BINARY and MOTOROLA are supported\n"); + } + break; + } + } } } } @@ -227,13 +251,15 @@ //replace cue sheet with first sector free(media->buffer); media->buffer = calloc(2048, 1); - if (tracks[0].type = TRACK_DATA) { + if (tracks[0].type == TRACK_DATA) { // if the first track is a data track, don't trust the CUE sheet and look at the MM:SS:FF from first sector uint8_t msf[3]; fseek(media->f, 12, SEEK_SET); if (sizeof(msf) == fread(msf, 1, sizeof(msf), media->f)) { tracks[0].fake_pregap = msf[2] + (msf[0] * 60 + msf[1]) * 75; } + } else if (!tracks[0].start_lba && !tracks[0].fake_pregap) { + tracks[0].fake_pregap = 2 * 75; } fseek(media->f, 16, SEEK_SET);