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;