changeset 2143:67f20f9188b0

Fix support for CUE sheets that refer to multiple files
author Michael Pavone <pavone@retrodev.com>
date Fri, 25 Mar 2022 21:41:33 -0700
parents d9151d0894c7
children 10e4439d8f13
files cdimage.c
diffstat 1 files changed, 17 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/cdimage.c	Thu Mar 24 23:43:43 2022 -0700
+++ b/cdimage.c	Fri Mar 25 21:41:33 2022 -0700
@@ -318,10 +318,23 @@
 		}
 	} while (line);
 	if (media->num_tracks > 0 && media->tracks[0].f) {
-		//end of last track is implicitly defined by file size
-		if (tracks[media->num_tracks-1].f) {
-			uint32_t start_lba =tracks[media->num_tracks-1].pregap_lba ? tracks[media->num_tracks-1].pregap_lba : tracks[media->num_tracks-1].start_lba;
-			tracks[media->num_tracks-1].end_lba = start_lba + (file_size(tracks[media->num_tracks-1].f) - tracks[media->num_tracks-1].file_offset)/ tracks[media->num_tracks-1].sector_bytes;
+		//end of last track in a file is implictly based on the size
+		f = tracks[0].f;
+		uint32_t offset = 0;
+		for (int track = 0; track < media->num_tracks; track++) {
+			if (track == media->num_tracks - 1 && tracks[track].f) {
+				uint32_t start_lba =tracks[track].fake_pregap ? tracks[track].start_lba : tracks[track].pregap_lba;
+				tracks[track].end_lba = start_lba + (file_size(tracks[track].f) - tracks[track].file_offset)/ tracks[track].sector_bytes;
+			} else if (tracks[track].f != f) {
+				uint32_t start_lba =tracks[track-1].fake_pregap ? tracks[track-1].start_lba : tracks[track-1].pregap_lba;
+				tracks[track-1].end_lba = start_lba + (file_size(tracks[track-1].f) - tracks[track-1].file_offset)/ tracks[track-1].sector_bytes;
+				offset = tracks[track-1].end_lba;
+			}
+			if (!tracks[track].fake_pregap) {
+				tracks[track].pregap_lba += offset;
+			}
+			tracks[track].start_lba += offset;
+			tracks[track].end_lba += offset;
 		}
 		//replace cue sheet with first sector
 		free(media->buffer);