diff --git a/src/guest/gdrom/cdi.c b/src/guest/gdrom/cdi.c index ddd7e43e..07cf2e16 100644 --- a/src/guest/gdrom/cdi.c +++ b/src/guest/gdrom/cdi.c @@ -44,9 +44,19 @@ static int cdi_read_sector(struct disc *disc, int fad, enum gd_secfmt fmt, CHECK(mask == MASK_DATA); /* read the user data portion of the sector */ - int offset = track->file_offset + fad * track->sector_size + 8; - int size = track->sector_size - 288; - CHECK_EQ(size, 2048); + int offset, size; + + if (track->sector_fmt == SECTOR_CDDA) { + offset = track->file_offset + fad * track->sector_size; + size = track->sector_size; + CHECK_EQ(size, 2352); + } else if (track->sector_fmt == SECTOR_M2F1) { + offset = track->file_offset + fad * track->sector_size + 8; + size = track->sector_size - 288; + CHECK_EQ(size, 2048); + } else { + CHECK(0); + } int res = fseek(cdi->fp, offset, SEEK_SET); CHECK_EQ(res, 0); @@ -157,11 +167,6 @@ static int cdi_parse_track(struct disc *disc, uint32_t version, r = fread(§or_type, 4, 1, fp); CHECK_EQ(r, 1); - if (pregap_length != GDROM_PREGAP) { - LOG_WARNING("cdi_parse non-standard pregap size %u", pregap_length); - return 0; - } - if (total_length != (pregap_length + track_length)) { LOG_WARNING("cdi_parse track length is invalid"); return 0; @@ -200,9 +205,6 @@ static int cdi_parse_session(struct disc *disc, uint32_t version, struct cdi *cdi = (struct cdi *)disc; FILE *fp = cdi->fp; - int first_track = cdi->num_tracks; - int leadout_fad = 0; - /* parse tracks for the session */ uint16_t num_tracks; size_t r = fread(&num_tracks, 2, 1, fp); @@ -213,6 +215,10 @@ static int cdi_parse_session(struct disc *disc, uint32_t version, return 0; } + int first_track_num = cdi->num_tracks; + int last_track_num = 0; + int leadout_fad = 0; + while (num_tracks--) { if (!cdi_parse_track(disc, version, track_offset, &leadout_fad)) { return 0; @@ -236,12 +242,15 @@ static int cdi_parse_session(struct disc *disc, uint32_t version, } } + last_track_num = cdi->num_tracks - 1; + /* add session */ + struct track *first_track = &cdi->tracks[first_track_num]; struct session *session = &cdi->sessions[cdi->num_sessions++]; - session->leadin_fad = 0x0; + session->leadin_fad = first_track->fad; session->leadout_fad = leadout_fad; - session->first_track = first_track; - session->last_track = cdi->num_tracks - 1; + session->first_track = first_track_num; + session->last_track = last_track_num; return 1; } diff --git a/src/guest/gdrom/disc.c b/src/guest/gdrom/disc.c index 87d354df..9948ada5 100644 --- a/src/guest/gdrom/disc.c +++ b/src/guest/gdrom/disc.c @@ -59,7 +59,6 @@ int disc_get_format(struct disc *disc) { void disc_get_meta(struct disc *disc, struct disc_meta *meta) { struct session *session = disc_get_session(disc, 1); - CHECK_EQ(session->leadin_fad, 45150); uint8_t tmp[DISC_MAX_SECTOR_SIZE]; disc_read_sector(disc, session->leadin_fad, SECTOR_ANY, MASK_DATA, tmp);