summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/chdcd.c
diff options
context:
space:
mode:
author R. Belmont <rb6502@users.noreply.github.com>2012-03-04 02:17:35 +0000
committer R. Belmont <rb6502@users.noreply.github.com>2012-03-04 02:17:35 +0000
commitbb993d1174a63b09b040251dec236a0a2c60aeb2 (patch)
tree76497c6e90eb4f2d0fb92d69f1a6c15e81a84e1f /src/lib/util/chdcd.c
parentb89d7c94c7a2000cb896eb7fd0efa5cc012c672f (diff)
chdman: Correct processing of GDI files, add ability to extractcd to .gdi, verified perfect checksum round-tripping on .GDI files. [R. Belmont]
Diffstat (limited to 'src/lib/util/chdcd.c')
-rw-r--r--src/lib/util/chdcd.c50
1 files changed, 20 insertions, 30 deletions
diff --git a/src/lib/util/chdcd.c b/src/lib/util/chdcd.c
index 49eed70fce6..360258c9ea4 100644
--- a/src/lib/util/chdcd.c
+++ b/src/lib/util/chdcd.c
@@ -1,7 +1,7 @@
/***************************************************************************
TOC parser for CHD compression frontend
- Handles CDRDAO .toc, CDRWIN .cue, and Sega GDROM .gdi
+ Handles CDRDAO .toc, CDRWIN .cue, Nero .nrg, and Sega GDROM .gdi
Copyright Nicola Salmoria and the MAME Team.
Visit http://mamedev.org for licensing and usage restrictions.
@@ -301,7 +301,7 @@ UINT64 read_uint64(FILE *infile)
}
/*-------------------------------------------------
- chdcd_parse_nero - parse a Nero format image file
+ chdcd_parse_nero - parse a Nero .NRG file
-------------------------------------------------*/
chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
@@ -427,6 +427,7 @@ chd_error chdcd_parse_nero(const char *tocfname, cdrom_toc &outtoc, chdcd_track_
outtoc.tracks[track-1].pgsub = CD_SUB_NONE;
outtoc.tracks[track-1].pgdatasize = 0;
outtoc.tracks[track-1].pgsubsize = 0;
+ outtoc.tracks[track-1].padframes = 0;
offset += (UINT32)index2-index1;
}
@@ -455,7 +456,6 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
{
FILE *infile;
int i, numtracks;
- //int chdpos=0;
astring path = astring(tocfname);
@@ -471,6 +471,7 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
memset(&outtoc, 0, sizeof(outtoc));
outinfo.reset();
+ outtoc.flags = CD_FLAG_GDROM;
fgets(linebuffer,511,infile);
numtracks=atoi(linebuffer);
@@ -481,8 +482,6 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
int trknum;
int trksize,trktype;
int sz;
- int hunks;
-
fgets(linebuffer,511,infile);
@@ -493,8 +492,7 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
outinfo.track[trknum].swap=false;
outinfo.track[trknum].offset=0;
- //outtoc.tracks[trknum].trktype = CD_TRACK_MODE1;
- outtoc.tracks[trknum].datasize = 0;
+ outtoc.tracks[trknum].datasize = 0;
outtoc.tracks[trknum].subtype = CD_SUB_NONE;
outtoc.tracks[trknum].subsize = 0;
@@ -519,7 +517,6 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
}
if(trktype==0)
{
- //assert(trksize==2352);
outtoc.tracks[trknum].trktype=CD_TRACK_AUDIO;
outtoc.tracks[trknum].datasize=2352;
}
@@ -540,35 +537,26 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
}
outinfo.track[trknum].fname.cpy(path).cat(name);
- sz=get_file_size(outinfo.track[trknum].fname);
+ sz = get_file_size(outinfo.track[trknum].fname);
- outtoc.tracks[trknum].frames=sz/trksize;
- outtoc.tracks[trknum].extraframes=0;
+ outtoc.tracks[trknum].frames = sz/trksize;
+ outtoc.tracks[trknum].padframes = 0;
- if(trknum!=0)
+ if (trknum != 0)
{
int dif=outtoc.tracks[trknum].physframeofs-(outtoc.tracks[trknum-1].frames+outtoc.tracks[trknum-1].physframeofs);
- outtoc.tracks[trknum-1].frames+=dif;
+ outtoc.tracks[trknum-1].frames += dif;
+ outtoc.tracks[trknum-1].padframes = dif;
}
-
-/*
- if(trknum!=0)
- {
- outtoc.tracks[trknum-1].extraframes=outtoc.tracks[trknum].physframeofs-(outtoc.tracks[trknum-1].frames+outtoc.tracks[trknum-1].physframeofs);
- }
-*/
- hunks = (outtoc.tracks[trknum].frames+CD_FRAMES_PER_HUNK - 1) / CD_FRAMES_PER_HUNK;
- outtoc.tracks[trknum].extraframes = hunks * CD_FRAMES_PER_HUNK - outtoc.tracks[trknum].frames;
-
- //chdpos+=outtoc.tracks[trknum].frames+outtoc.tracks[trknum].extraframes;
-
}
- /*
- for(i=0;i<numtracks;++i)
+
+ #if 0
+ for(i=0; i < numtracks; i++)
{
- printf("%s %d %d %d\n",outinfo.track[i].fname,outtoc.tracks[i].frames,outtoc.tracks[i].extraframes,outtoc.tracks[i].physframeofs);
+ printf("%s %d %d %d (true %d)\n", outinfo.track[i].fname.cstr(), outtoc.tracks[i].frames, outtoc.tracks[i].padframes, outtoc.tracks[i].physframeofs, outtoc.tracks[i].frames - outtoc.tracks[i].padframes);
}
- */
+ #endif
+
/* close the input TOC */
fclose(infile);
@@ -579,7 +567,7 @@ static chd_error chdcd_parse_gdi(const char *tocfname, cdrom_toc &outtoc, chdcd_
}
/*-------------------------------------------------
- chdcd_parse_cue - parse a CDRWin format CUE file
+ chdcd_parse_toc - parse a CDRWin format CUE file
-------------------------------------------------*/
chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_input_info &outinfo)
@@ -683,6 +671,7 @@ chd_error chdcd_parse_cue(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
outtoc.tracks[trknum].subtype = CD_SUB_NONE;
outtoc.tracks[trknum].subsize = 0;
outtoc.tracks[trknum].pregap = 0;
+ outtoc.tracks[trknum].padframes = 0;
outinfo.track[trknum].idx0offs = -1;
outinfo.track[trknum].idx1offs = 0;
@@ -988,6 +977,7 @@ chd_error chdcd_parse_toc(const char *tocfname, cdrom_toc &outtoc, chdcd_track_i
outtoc.tracks[trknum].datasize = 0;
outtoc.tracks[trknum].subtype = CD_SUB_NONE;
outtoc.tracks[trknum].subsize = 0;
+ outtoc.tracks[trknum].padframes = 0;
cdrom_convert_type_string_to_track_info(token, &outtoc.tracks[trknum]);
if (outtoc.tracks[trknum].datasize == 0)