Mercurial > repos > blastem
diff cue.c @ 2080:bafb757e1cd2
Implement CD audio
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 02 Feb 2022 01:10:07 -0800 |
parents | 5a2b759f6b2d |
children | 0db3af42dd72 |
line wrap: on
line diff
--- a/cue.c Tue Feb 01 01:14:27 2022 -0800 +++ b/cue.c Wed Feb 02 01:10:07 2022 -0800 @@ -43,22 +43,28 @@ } -static void bin_seek(system_media *media, uint32_t sector) +enum { + FAKE_DATA = 1, + FAKE_AUDIO, +}; + +static uint8_t bin_seek(system_media *media, uint32_t sector) { media->cur_sector = sector; uint32_t lba = sector; - for (uint32_t i = 0; i < media->num_tracks; i++) + uint8_t track; + for (track = 0; track < media->num_tracks; track++) { - if (lba < media->tracks[i].fake_pregap) { - media->in_fake_pregap = 1; + if (lba < media->tracks[track].fake_pregap) { + media->in_fake_pregap = media->tracks[track].type == TRACK_DATA ? FAKE_DATA : FAKE_AUDIO; break; } - lba -= media->tracks[i].fake_pregap; - if (lba < media->tracks[i].start_lba) { - media->in_fake_pregap = 1; + lba -= media->tracks[track].fake_pregap; + if (lba < media->tracks[track].start_lba) { + media->in_fake_pregap = media->tracks[track].type == TRACK_DATA ? FAKE_DATA : FAKE_AUDIO; break; } - if (lba < media->tracks[i].end_lba) { + if (lba < media->tracks[track].end_lba) { media->in_fake_pregap = 0; break; } @@ -66,6 +72,7 @@ if (!media->in_fake_pregap) { fseek(media->f, lba * 2352, SEEK_SET); } + return track; } static uint8_t fake_read(uint32_t sector, uint32_t offset) @@ -91,22 +98,25 @@ static uint8_t bin_read(system_media *media, uint32_t offset) { - if (media->in_fake_pregap) { + if (media->in_fake_pregap == FAKE_DATA) { return fake_read(media->cur_sector, offset); + } else if (media->in_fake_pregap == FAKE_AUDIO) { + return 0; } else { return fgetc(media->f); } } -static void iso_seek(system_media *media, uint32_t sector) +static uint8_t iso_seek(system_media *media, uint32_t sector) { media->cur_sector = sector; if (sector < (2 * 75)) { - media->in_fake_pregap = 1; + media->in_fake_pregap = FAKE_DATA; } else { media->in_fake_pregap = 0; fseek(media->f, (sector - 2 * 75) * 2048, SEEK_SET); } + return 0; } static uint8_t iso_read(system_media *media, uint32_t offset)