comparison 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
comparison
equal deleted inserted replaced
2079:5a2b759f6b2d 2080:bafb757e1cd2
41 seconds += minutes * 60; 41 seconds += minutes * 60;
42 return seconds * 75 + frames; 42 return seconds * 75 + frames;
43 43
44 } 44 }
45 45
46 static void bin_seek(system_media *media, uint32_t sector) 46 enum {
47 FAKE_DATA = 1,
48 FAKE_AUDIO,
49 };
50
51 static uint8_t bin_seek(system_media *media, uint32_t sector)
47 { 52 {
48 media->cur_sector = sector; 53 media->cur_sector = sector;
49 uint32_t lba = sector; 54 uint32_t lba = sector;
50 for (uint32_t i = 0; i < media->num_tracks; i++) 55 uint8_t track;
51 { 56 for (track = 0; track < media->num_tracks; track++)
52 if (lba < media->tracks[i].fake_pregap) { 57 {
53 media->in_fake_pregap = 1; 58 if (lba < media->tracks[track].fake_pregap) {
59 media->in_fake_pregap = media->tracks[track].type == TRACK_DATA ? FAKE_DATA : FAKE_AUDIO;
54 break; 60 break;
55 } 61 }
56 lba -= media->tracks[i].fake_pregap; 62 lba -= media->tracks[track].fake_pregap;
57 if (lba < media->tracks[i].start_lba) { 63 if (lba < media->tracks[track].start_lba) {
58 media->in_fake_pregap = 1; 64 media->in_fake_pregap = media->tracks[track].type == TRACK_DATA ? FAKE_DATA : FAKE_AUDIO;
59 break; 65 break;
60 } 66 }
61 if (lba < media->tracks[i].end_lba) { 67 if (lba < media->tracks[track].end_lba) {
62 media->in_fake_pregap = 0; 68 media->in_fake_pregap = 0;
63 break; 69 break;
64 } 70 }
65 } 71 }
66 if (!media->in_fake_pregap) { 72 if (!media->in_fake_pregap) {
67 fseek(media->f, lba * 2352, SEEK_SET); 73 fseek(media->f, lba * 2352, SEEK_SET);
68 } 74 }
75 return track;
69 } 76 }
70 77
71 static uint8_t fake_read(uint32_t sector, uint32_t offset) 78 static uint8_t fake_read(uint32_t sector, uint32_t offset)
72 { 79 {
73 if (!offset || (offset >= 16)) { 80 if (!offset || (offset >= 16)) {
89 } 96 }
90 } 97 }
91 98
92 static uint8_t bin_read(system_media *media, uint32_t offset) 99 static uint8_t bin_read(system_media *media, uint32_t offset)
93 { 100 {
94 if (media->in_fake_pregap) { 101 if (media->in_fake_pregap == FAKE_DATA) {
95 return fake_read(media->cur_sector, offset); 102 return fake_read(media->cur_sector, offset);
103 } else if (media->in_fake_pregap == FAKE_AUDIO) {
104 return 0;
96 } else { 105 } else {
97 return fgetc(media->f); 106 return fgetc(media->f);
98 } 107 }
99 } 108 }
100 109
101 static void iso_seek(system_media *media, uint32_t sector) 110 static uint8_t iso_seek(system_media *media, uint32_t sector)
102 { 111 {
103 media->cur_sector = sector; 112 media->cur_sector = sector;
104 if (sector < (2 * 75)) { 113 if (sector < (2 * 75)) {
105 media->in_fake_pregap = 1; 114 media->in_fake_pregap = FAKE_DATA;
106 } else { 115 } else {
107 media->in_fake_pregap = 0; 116 media->in_fake_pregap = 0;
108 fseek(media->f, (sector - 2 * 75) * 2048, SEEK_SET); 117 fseek(media->f, (sector - 2 * 75) * 2048, SEEK_SET);
109 } 118 }
119 return 0;
110 } 120 }
111 121
112 static uint8_t iso_read(system_media *media, uint32_t offset) 122 static uint8_t iso_read(system_media *media, uint32_t offset)
113 { 123 {
114 if (media->in_fake_pregap || offset < 16 || offset > (2048 + 16)) { 124 if (media->in_fake_pregap || offset < 16 || offset > (2048 + 16)) {