Mercurial > repos > blastem
comparison 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 |
comparison
equal
deleted
inserted
replaced
2088:c716af3f8980 | 2089:0db3af42dd72 |
---|---|
50 | 50 |
51 static uint8_t bin_seek(system_media *media, uint32_t sector) | 51 static uint8_t bin_seek(system_media *media, uint32_t sector) |
52 { | 52 { |
53 media->cur_sector = sector; | 53 media->cur_sector = sector; |
54 uint32_t lba = sector; | 54 uint32_t lba = sector; |
55 uint8_t track; | 55 uint32_t track; |
56 for (track = 0; track < media->num_tracks; track++) | 56 for (track = 0; track < media->num_tracks; track++) |
57 { | 57 { |
58 if (lba < media->tracks[track].fake_pregap) { | 58 if (lba < media->tracks[track].fake_pregap) { |
59 media->in_fake_pregap = media->tracks[track].type == TRACK_DATA ? FAKE_DATA : FAKE_AUDIO; | 59 media->in_fake_pregap = media->tracks[track].type == TRACK_DATA ? FAKE_DATA : FAKE_AUDIO; |
60 break; | 60 break; |
66 } | 66 } |
67 if (lba < media->tracks[track].end_lba) { | 67 if (lba < media->tracks[track].end_lba) { |
68 media->in_fake_pregap = 0; | 68 media->in_fake_pregap = 0; |
69 break; | 69 break; |
70 } | 70 } |
71 } | |
72 if (track < media->num_tracks) { | |
73 media->cur_track = track; | |
71 } | 74 } |
72 if (!media->in_fake_pregap) { | 75 if (!media->in_fake_pregap) { |
73 fseek(media->f, lba * 2352, SEEK_SET); | 76 fseek(media->f, lba * 2352, SEEK_SET); |
74 } | 77 } |
75 return track; | 78 return track; |
101 if (media->in_fake_pregap == FAKE_DATA) { | 104 if (media->in_fake_pregap == FAKE_DATA) { |
102 return fake_read(media->cur_sector, offset); | 105 return fake_read(media->cur_sector, offset); |
103 } else if (media->in_fake_pregap == FAKE_AUDIO) { | 106 } else if (media->in_fake_pregap == FAKE_AUDIO) { |
104 return 0; | 107 return 0; |
105 } else { | 108 } else { |
109 if (media->tracks[media->cur_track].need_swap) { | |
110 if (offset & 1) { | |
111 return media->byte_storage; | |
112 } | |
113 media->byte_storage = fgetc(media->f); | |
114 } | |
106 return fgetc(media->f); | 115 return fgetc(media->f); |
107 } | 116 } |
108 } | 117 } |
109 | 118 |
110 static uint8_t iso_seek(system_media *media, uint32_t sector) | 119 static uint8_t iso_seek(system_media *media, uint32_t sector) |
145 } while (line); | 154 } while (line); |
146 track_info *tracks = calloc(sizeof(track_info), media->num_tracks); | 155 track_info *tracks = calloc(sizeof(track_info), media->num_tracks); |
147 media->tracks = tracks; | 156 media->tracks = tracks; |
148 line = media->buffer; | 157 line = media->buffer; |
149 int track = -1; | 158 int track = -1; |
159 uint8_t audio_byte_swap = 0; | |
150 do { | 160 do { |
151 char *cmd = cmd_start(line); | 161 char *cmd = cmd_start(line); |
152 if (cmd) { | 162 if (cmd) { |
153 if (startswith(cmd, "TRACK ")) { | 163 if (startswith(cmd, "TRACK ")) { |
154 track++; | 164 track++; |
159 warning("Expected track %d, but found track %d in CUE sheet\n", track + 1, file_track); | 169 warning("Expected track %d, but found track %d in CUE sheet\n", track + 1, file_track); |
160 } | 170 } |
161 cmd = cmd_start(end); | 171 cmd = cmd_start(end); |
162 if (cmd) { | 172 if (cmd) { |
163 tracks[track].type = startswith(cmd, "AUDIO") ? TRACK_AUDIO : TRACK_DATA; | 173 tracks[track].type = startswith(cmd, "AUDIO") ? TRACK_AUDIO : TRACK_DATA; |
174 tracks[track].need_swap = tracks[track].type == TRACK_AUDIO && audio_byte_swap; | |
164 } | 175 } |
165 } else if (startswith(cmd, "FILE ")) { | 176 } else if (startswith(cmd, "FILE ")) { |
166 if (media->f) { | 177 if (media->f) { |
167 warning("CUE sheets with multiple FILE commands are not supported\n"); | 178 warning("CUE sheets with multiple FILE commands are not supported\n"); |
168 } else { | 179 } else { |
189 media->f = fopen(fname, "rb"); | 200 media->f = fopen(fname, "rb"); |
190 if (!media->f) { | 201 if (!media->f) { |
191 fatal_error("Failed to open %s specified by FILE command in CUE sheet %s.%s\n", fname, media->name, media->extension); | 202 fatal_error("Failed to open %s specified by FILE command in CUE sheet %s.%s\n", fname, media->name, media->extension); |
192 } | 203 } |
193 free(fname); | 204 free(fname); |
205 for (end++; *end && *end != '\n' && *end != '\r'; end++) | |
206 { | |
207 if (!isspace(*end)) { | |
208 if (startswith(end, "BINARY")) { | |
209 audio_byte_swap = 0; | |
210 } else if (startswith(end, "MOTOROLA")) { | |
211 audio_byte_swap = 1; | |
212 } else { | |
213 warning("Unsupported FILE type in CUE sheet. Only BINARY and MOTOROLA are supported\n"); | |
214 } | |
215 break; | |
216 } | |
217 } | |
194 } | 218 } |
195 } | 219 } |
196 } | 220 } |
197 } else if (track >= 0) { | 221 } else if (track >= 0) { |
198 if (startswith(cmd, "PREGAP ")) { | 222 if (startswith(cmd, "PREGAP ")) { |
225 //end of last track is implicitly defined by file size | 249 //end of last track is implicitly defined by file size |
226 tracks[media->num_tracks-1].end_lba = file_size(media->f) / 2352; | 250 tracks[media->num_tracks-1].end_lba = file_size(media->f) / 2352; |
227 //replace cue sheet with first sector | 251 //replace cue sheet with first sector |
228 free(media->buffer); | 252 free(media->buffer); |
229 media->buffer = calloc(2048, 1); | 253 media->buffer = calloc(2048, 1); |
230 if (tracks[0].type = TRACK_DATA) { | 254 if (tracks[0].type == TRACK_DATA) { |
231 // if the first track is a data track, don't trust the CUE sheet and look at the MM:SS:FF from first sector | 255 // if the first track is a data track, don't trust the CUE sheet and look at the MM:SS:FF from first sector |
232 uint8_t msf[3]; | 256 uint8_t msf[3]; |
233 fseek(media->f, 12, SEEK_SET); | 257 fseek(media->f, 12, SEEK_SET); |
234 if (sizeof(msf) == fread(msf, 1, sizeof(msf), media->f)) { | 258 if (sizeof(msf) == fread(msf, 1, sizeof(msf), media->f)) { |
235 tracks[0].fake_pregap = msf[2] + (msf[0] * 60 + msf[1]) * 75; | 259 tracks[0].fake_pregap = msf[2] + (msf[0] * 60 + msf[1]) * 75; |
236 } | 260 } |
261 } else if (!tracks[0].start_lba && !tracks[0].fake_pregap) { | |
262 tracks[0].fake_pregap = 2 * 75; | |
237 } | 263 } |
238 | 264 |
239 fseek(media->f, 16, SEEK_SET); | 265 fseek(media->f, 16, SEEK_SET); |
240 media->size = fread(media->buffer, 1, 2048, media->f); | 266 media->size = fread(media->buffer, 1, 2048, media->f); |
241 media->seek = bin_seek; | 267 media->seek = bin_seek; |