Mercurial > repos > blastem
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)) { |