fixed reading of NRG images / bail out on unsupported tracks in NRG images / cleanups (nw)

This commit is contained in:
Oliver Stöneberg 2013-01-05 22:03:02 +00:00
parent 7e7040d7a7
commit 13f070feea

View File

@ -313,7 +313,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
astring path = astring(tocfname); astring path = astring(tocfname);
infile = fopen(tocfname, "rt"); infile = fopen(tocfname, "rb");
path = get_file_path(path); path = get_file_path(path);
if (infile == (FILE *)NULL) if (infile == (FILE *)NULL)
@ -364,13 +364,13 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
if (!memcmp(buffer, "DAOX", 4)) if (!memcmp(buffer, "DAOX", 4))
{ {
// skip second chunk size and UPC code // skip second chunk size and UPC code
read_uint32(infile);
fseek(infile, 16, SEEK_CUR); fseek(infile, 16, SEEK_CUR);
read_uint32(infile);
fread(&start, 1, 1, infile); fread(&start, 1, 1, infile);
fread(&end, 1, 1, infile); fread(&end, 1, 1, infile);
// printf("TOC type: %08x. Start track %d End track: %d\n", toc_type, start, end); // printf("Start track %d End track: %d\n", start, end);
outtoc.numtrks = (end-start) + 1; outtoc.numtrks = (end-start) + 1;
@ -378,16 +378,16 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
for (track = start; track <= end; track++) for (track = start; track <= end; track++)
{ {
UINT32 size, mode; UINT32 size, mode;
UINT64 index0, index1, index2; UINT64 index0, index1, track_end;
fseek(infile, 12, SEEK_CUR); // skip ISRC code fseek(infile, 12, SEEK_CUR); // skip ISRC code
size = read_uint16(infile); size = read_uint16(infile);
mode = read_uint32(infile); mode = read_uint32(infile);
index0 = read_uint64(infile); index0 = read_uint64(infile);
index1 = read_uint64(infile); index1 = read_uint64(infile);
index2 = read_uint64(infile); track_end = read_uint64(infile);
// printf("Track %d: sector size %d mode %x index0 %llx index1 %llx index2 %llx (pregap %d sectors, length %d sectors)\n", track, size, mode, index0, index1, index2, (UINT32)(index1-index0)/size, (UINT32)(index2-index1)/size); // printf("Track %d: sector size %d mode %x index0 %llx index1 %llx track_end %llx (pregap %d sectors, length %d sectors)\n", track, size, mode, index0, index1, track_end, (UINT32)(index1-index0)/size, (UINT32)(track_end-index1)/size);
outinfo.track[track-1].fname.cpy(tocfname); outinfo.track[track-1].fname.cpy(tocfname);
outinfo.track[track-1].offset = offset + (UINT32)(index1-index0); outinfo.track[track-1].offset = offset + (UINT32)(index1-index0);
outinfo.track[track-1].idx0offs = 0; outinfo.track[track-1].idx0offs = 0;
@ -395,24 +395,50 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
switch (mode>>24) switch (mode>>24)
{ {
case 0x00: // 2048 byte data case 0x0000: // 2048 byte data
outtoc.tracks[track-1].trktype = CD_TRACK_MODE1; outtoc.tracks[track-1].trktype = CD_TRACK_MODE1;
outinfo.track[track-1].swap = false; outinfo.track[track-1].swap = false;
break; break;
case 0x0300: // Mode 2 Form 1
printf("ERROR: Mode 2 Form 1 tracks not supported, contant MAMEDEV!\n");
fclose(infile);
return CHDERR_NOT_SUPPORTED;
case 0x0500: // raw data
printf("ERROR: Raw data tracks not supported, contant MAMEDEV!\n");
fclose(infile);
return CHDERR_NOT_SUPPORTED;
case 0x06: // 2352 byte mode 2 raw case 0x06: // 2352 byte mode 2 raw
outtoc.tracks[track-1].trktype = CD_TRACK_MODE2_RAW; outtoc.tracks[track-1].trktype = CD_TRACK_MODE2_RAW;
outinfo.track[track-1].swap = false; outinfo.track[track-1].swap = false;
break; break;
case 0x07: // 2352 byte audio case 0x0700: // 2352 byte audio
outtoc.tracks[track-1].trktype = CD_TRACK_AUDIO; outtoc.tracks[track-1].trktype = CD_TRACK_AUDIO;
outinfo.track[track-1].swap = true; outinfo.track[track-1].swap = true;
break; break;
case 0x0f00: // raw data with sub-channel
printf("ERROR: Raw data tracks with sub-channel not supported, contant MAMEDEV!\n");
fclose(infile);
return CHDERR_NOT_SUPPORTED;
case 0x1000: // audio with sub-channel
printf("ERROR: Audio tracks with sub-channel not supported, contant MAMEDEV!\n");
fclose(infile);
return CHDERR_NOT_SUPPORTED;
case 0x1100: // raw Mode 2 Form 1 with sub-channel
printf("ERROR: Raw Mode 2 Form 1 tracks with sub-channel not supported, contant MAMEDEV!\n");
fclose(infile);
return CHDERR_NOT_SUPPORTED;
default: default:
printf("ERROR: Unknown track type %x, contact MAMEDEV!\n", mode>>24); printf("ERROR: Unknown track type %x, contact MAMEDEV!\n", mode);
break; fclose(infile);
return CHDERR_NOT_SUPPORTED;
} }
outtoc.tracks[track-1].datasize = size; outtoc.tracks[track-1].datasize = size;
@ -421,7 +447,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
outtoc.tracks[track-1].subsize = 0; outtoc.tracks[track-1].subsize = 0;
outtoc.tracks[track-1].pregap = (UINT32)(index1-index0)/size; outtoc.tracks[track-1].pregap = (UINT32)(index1-index0)/size;
outtoc.tracks[track-1].frames = (UINT32)(index2-index1)/size; outtoc.tracks[track-1].frames = (UINT32)(track_end-index1)/size;
outtoc.tracks[track-1].postgap = 0; outtoc.tracks[track-1].postgap = 0;
outtoc.tracks[track-1].pgtype = 0; outtoc.tracks[track-1].pgtype = 0;
outtoc.tracks[track-1].pgsub = CD_SUB_NONE; outtoc.tracks[track-1].pgsub = CD_SUB_NONE;
@ -429,7 +455,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
outtoc.tracks[track-1].pgsubsize = 0; outtoc.tracks[track-1].pgsubsize = 0;
outtoc.tracks[track-1].padframes = 0; outtoc.tracks[track-1].padframes = 0;
offset += (UINT32)index2-index1; offset += (UINT32)track_end-index1;
} }
} }
@ -888,7 +914,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
} }
} }
} }
printf("trk %d: %d frames @ offset %d\n", trknum+1, outtoc.tracks[trknum].frames, outinfo.track[trknum].offset); //printf("trk %d: %d frames @ offset %d\n", trknum+1, outtoc.tracks[trknum].frames, outinfo.track[trknum].offset);
} }
return CHDERR_NONE; return CHDERR_NONE;