CD-ROM: Fix multi-session cue sheets with each track in its own file, fixes #6050.
This commit is contained in:
@@ -941,6 +941,13 @@ image_process(cd_image_t *img)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((ci->type == INDEX_NORMAL) && (((int64_t) ci->file_start) < 0LL)) {
|
||||||
|
ci->type = INDEX_ZERO;
|
||||||
|
ci->length = 150;
|
||||||
|
ci->file_start = 0ULL;
|
||||||
|
ci->file_length = 0ULL;
|
||||||
|
}
|
||||||
|
|
||||||
if ((ci->type < INDEX_SPECIAL) || (ci->type > INDEX_NORMAL)) {
|
if ((ci->type < INDEX_SPECIAL) || (ci->type > INDEX_NORMAL)) {
|
||||||
image_log(img->log, " [TRACK ] %02X, INDEX %02X, ATTR %02X,\n",
|
image_log(img->log, " [TRACK ] %02X, INDEX %02X, ATTR %02X,\n",
|
||||||
ci->type, j,
|
ci->type, j,
|
||||||
@@ -1470,6 +1477,7 @@ image_load_cue(cd_image_t *img, const char *cuefile)
|
|||||||
uint8_t session = 1;
|
uint8_t session = 1;
|
||||||
int last_t = -1;
|
int last_t = -1;
|
||||||
int is_viso = 0;
|
int is_viso = 0;
|
||||||
|
int lo_cmd = 0;
|
||||||
int lead[3] = { 0 };
|
int lead[3] = { 0 };
|
||||||
int error;
|
int error;
|
||||||
char pathname[MAX_FILENAME_LENGTH];
|
char pathname[MAX_FILENAME_LENGTH];
|
||||||
@@ -1604,6 +1612,9 @@ image_load_cue(cd_image_t *img, const char *cuefile)
|
|||||||
last_t = t;
|
last_t = t;
|
||||||
ct = image_insert_track(img, session, t);
|
ct = image_insert_track(img, session, t);
|
||||||
|
|
||||||
|
for (int i = 2; i >= 0; i--)
|
||||||
|
ct->idx[i].type = INDEX_NONE;
|
||||||
|
|
||||||
ct->form = 0;
|
ct->form = 0;
|
||||||
ct->mode = 0;
|
ct->mode = 0;
|
||||||
|
|
||||||
@@ -1707,6 +1718,7 @@ image_load_cue(cd_image_t *img, const char *cuefile)
|
|||||||
if (space < (line + strlen(line))) {
|
if (space < (line + strlen(line))) {
|
||||||
(void) image_cue_get_keyword(&command, &space);
|
(void) image_cue_get_keyword(&command, &space);
|
||||||
if (!strcmp(command, "LEAD-OUT")) {
|
if (!strcmp(command, "LEAD-OUT")) {
|
||||||
|
lo_cmd = 1;
|
||||||
ct = &(img->tracks[lead[2]]);
|
ct = &(img->tracks[lead[2]]);
|
||||||
/*
|
/*
|
||||||
Mark it this way so file pointers on it are not
|
Mark it this way so file pointers on it are not
|
||||||
@@ -1723,6 +1735,25 @@ image_load_cue(cd_image_t *img, const char *cuefile)
|
|||||||
image_log(img->log, " [LEAD-OUT] Initialization %s\n",
|
image_log(img->log, " [LEAD-OUT] Initialization %s\n",
|
||||||
success ? "successful" : "failed");
|
success ? "successful" : "failed");
|
||||||
} else if (!strcmp(command, "SESSION")) {
|
} else if (!strcmp(command, "SESSION")) {
|
||||||
|
if (!lo_cmd) {
|
||||||
|
ct = &(img->tracks[lead[2]]);
|
||||||
|
/*
|
||||||
|
Mark it this way so file pointers on it are not
|
||||||
|
going to be adjusted.
|
||||||
|
*/
|
||||||
|
last_t = -1;
|
||||||
|
ct->sector_size = last;
|
||||||
|
ci = &(ct->idx[1]);
|
||||||
|
ci->type = INDEX_ZERO;
|
||||||
|
ci->file = tf;
|
||||||
|
ci->file_start = 0;
|
||||||
|
ci->file_length = 0;
|
||||||
|
ci->length = (2 * 60 * 75) + (30 * 75);
|
||||||
|
|
||||||
|
image_log(img->log, " [LEAD-OUT] Initialization successful\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
lo_cmd = 0;
|
||||||
session = image_cue_get_number(&space);
|
session = image_cue_get_number(&space);
|
||||||
|
|
||||||
if (session > 1) {
|
if (session > 1) {
|
||||||
@@ -2412,10 +2443,10 @@ image_read_sector(const void *local, uint8_t *buffer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (idx->type >= INDEX_NORMAL) {
|
if (idx->type >= INDEX_NORMAL)
|
||||||
/* Read the data from the file. */
|
/* Read the data from the file. */
|
||||||
ret = idx->file->read(idx->file, buffer, seek, trk->sector_size);
|
ret = idx->file->read(idx->file, buffer, seek, trk->sector_size);
|
||||||
} else
|
else
|
||||||
/* Index is not in the file, no read to fail here. */
|
/* Index is not in the file, no read to fail here. */
|
||||||
ret = 1;
|
ret = 1;
|
||||||
|
|
||||||
@@ -2472,8 +2503,16 @@ image_read_sector(const void *local, uint8_t *buffer,
|
|||||||
for (int j = 0; j < 8; j++)
|
for (int j = 0; j < 8; j++)
|
||||||
buffer[2352 + (i << 3) + j] = ((q[i] >> (7 - j)) & 0x01) << 6;
|
buffer[2352 + (i << 3) + j] = ((q[i] >> (7 - j)) & 0x01) << 6;
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
}
|
image_log(img->log, "[BAD] cdrom_read_sector(%08X): track %02X, index %02X, %016"
|
||||||
|
PRIX64 ", %i, %i, %i, %i\n",
|
||||||
|
lba, track, index, idx->start, trk->sector_size, track_is_raw,
|
||||||
|
trk->mode, trk->form);
|
||||||
|
} else
|
||||||
|
image_log(img->log, "[N/A] cdrom_read_sector(%08X): track %02X, index %02X, %016"
|
||||||
|
PRIX64 ", %i, %i, %i, %i\n",
|
||||||
|
lba, track, index, idx->start, trk->sector_size, track_is_raw,
|
||||||
|
trk->mode, trk->form);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user