summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/util/cdrom.c182
-rw-r--r--src/lib/util/cdrom.h13
-rw-r--r--src/lib/util/chd.h4
3 files changed, 156 insertions, 43 deletions
diff --git a/src/lib/util/cdrom.c b/src/lib/util/cdrom.c
index 0ad16a88286..c48eedc5996 100644
--- a/src/lib/util/cdrom.c
+++ b/src/lib/util/cdrom.c
@@ -414,55 +414,111 @@ const cdrom_toc *cdrom_get_toc(cdrom_file *file)
***************************************************************************/
/*-------------------------------------------------
- cdrom_convert_type_string_to_track_info -
+ cdrom_get_info_from_type_string
take a string and convert it into track type
and track data size
-------------------------------------------------*/
-void cdrom_convert_type_string_to_track_info(const char *typestring, cdrom_track_info *info)
+void cdrom_get_info_from_type_string(const char *typestring, UINT32 *trktype, UINT32 *datasize)
{
if (!strcmp(typestring, "MODE1"))
{
- info->trktype = CD_TRACK_MODE1;
- info->datasize = 2048;
+ *trktype = CD_TRACK_MODE1;
+ *datasize = 2048;
+ }
+ else if (!strcmp(typestring, "MODE1/2048"))
+ {
+ *trktype = CD_TRACK_MODE1;
+ *datasize = 2048;
}
else if (!strcmp(typestring, "MODE1_RAW"))
{
- info->trktype = CD_TRACK_MODE1_RAW;
- info->datasize = 2352;
+ *trktype = CD_TRACK_MODE1_RAW;
+ *datasize = 2352;
+ }
+ else if (!strcmp(typestring, "MODE1/2352"))
+ {
+ *trktype = CD_TRACK_MODE1_RAW;
+ *datasize = 2352;
}
else if (!strcmp(typestring, "MODE2"))
{
- info->trktype = CD_TRACK_MODE2;
- info->datasize = 2336;
+ *trktype = CD_TRACK_MODE2;
+ *datasize = 2336;
+ }
+ else if (!strcmp(typestring, "MODE2/2336"))
+ {
+ *trktype = CD_TRACK_MODE2;
+ *datasize = 2336;
}
else if (!strcmp(typestring, "MODE2_FORM1"))
{
- info->trktype = CD_TRACK_MODE2_FORM1;
- info->datasize = 2048;
+ *trktype = CD_TRACK_MODE2_FORM1;
+ *datasize = 2048;
+ }
+ else if (!strcmp(typestring, "MODE2/2048"))
+ {
+ *trktype = CD_TRACK_MODE2_FORM1;
+ *datasize = 2048;
}
else if (!strcmp(typestring, "MODE2_FORM2"))
{
- info->trktype = CD_TRACK_MODE2_FORM2;
- info->datasize = 2324;
+ *trktype = CD_TRACK_MODE2_FORM2;
+ *datasize = 2324;
+ }
+ else if (!strcmp(typestring, "MODE2/2324"))
+ {
+ *trktype = CD_TRACK_MODE2_FORM2;
+ *datasize = 2324;
}
else if (!strcmp(typestring, "MODE2_FORM_MIX"))
{
- info->trktype = CD_TRACK_MODE2_FORM_MIX;
- info->datasize = 2336;
+ *trktype = CD_TRACK_MODE2_FORM_MIX;
+ *datasize = 2336;
+ }
+ else if (!strcmp(typestring, "MODE2/2336"))
+ {
+ *trktype = CD_TRACK_MODE2_FORM_MIX;
+ *datasize = 2336;
}
else if (!strcmp(typestring, "MODE2_RAW"))
{
- info->trktype = CD_TRACK_MODE2_RAW;
- info->datasize = 2352;
+ *trktype = CD_TRACK_MODE2_RAW;
+ *datasize = 2352;
+ }
+ else if (!strcmp(typestring, "MODE2/2352"))
+ {
+ *trktype = CD_TRACK_MODE2_RAW;
+ *datasize = 2352;
}
else if (!strcmp(typestring, "AUDIO"))
{
- info->trktype = CD_TRACK_AUDIO;
- info->datasize = 2352;
+ *trktype = CD_TRACK_AUDIO;
+ *datasize = 2352;
}
}
+/*-------------------------------------------------
+ cdrom_convert_type_string_to_track_info -
+ take a string and convert it into track type
+ and track data size
+-------------------------------------------------*/
+
+void cdrom_convert_type_string_to_track_info(const char *typestring, cdrom_track_info *info)
+{
+ cdrom_get_info_from_type_string(typestring, &info->trktype, &info->datasize);
+}
+
+/*-------------------------------------------------
+ cdrom_convert_type_string_to_pregap_info -
+ take a string and convert it into pregap type
+ and pregap data size
+-------------------------------------------------*/
+
+void cdrom_convert_type_string_to_pregap_info(const char *typestring, cdrom_track_info *info)
+{
+ cdrom_get_info_from_type_string(typestring, &info->pgtype, &info->pgdatasize);
+}
/*-------------------------------------------------
cdrom_convert_subtype_string_to_track_info -
@@ -484,17 +540,36 @@ void cdrom_convert_subtype_string_to_track_info(const char *typestring, cdrom_tr
}
}
+/*-------------------------------------------------
+ cdrom_convert_subtype_string_to_pregap_info -
+ take a string and convert it into track subtype
+ and track subcode data size
+-------------------------------------------------*/
+
+void cdrom_convert_subtype_string_to_pregap_info(const char *typestring, cdrom_track_info *info)
+{
+ if (!strcmp(typestring, "RW"))
+ {
+ info->pgsub = CD_SUB_NORMAL;
+ info->pgsubsize = 96;
+ }
+ else if (!strcmp(typestring, "RW_RAW"))
+ {
+ info->pgsub = CD_SUB_RAW;
+ info->pgsubsize = 96;
+ }
+}
/*-------------------------------------------------
cdrom_get_type_string - get the string
associated with the given type
-------------------------------------------------*/
-const char *cdrom_get_type_string(const cdrom_track_info *info)
+const char *cdrom_get_type_string(UINT32 trktype)
{
- switch (info->trktype)
+ switch (trktype)
{
- case CD_TRACK_MODE1: return "MODE1";
+ case CD_TRACK_MODE1: return "MODE1";
case CD_TRACK_MODE1_RAW: return "MODE1_RAW";
case CD_TRACK_MODE2: return "MODE2";
case CD_TRACK_MODE2_FORM1: return "MODE2_FORM1";
@@ -512,9 +587,9 @@ const char *cdrom_get_type_string(const cdrom_track_info *info)
associated with the given subcode type
-------------------------------------------------*/
-const char *cdrom_get_subtype_string(const cdrom_track_info *info)
+const char *cdrom_get_subtype_string(UINT32 subtype)
{
- switch (info->subtype)
+ switch (subtype)
{
case CD_SUB_NORMAL: return "RW";
case CD_SUB_RAW: return "RW_RAW";
@@ -566,29 +641,45 @@ chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
static UINT32 oldmetadata[CD_METADATA_WORDS], *mrp;
const chd_header *header = chd_get_header(chd);
UINT32 hunksectors = header->hunkbytes / CD_FRAME_SIZE;
- char metadata[256];
+ char metadata[512];
chd_error err;
int i;
/* start with no tracks */
for (toc->numtrks = 0; toc->numtrks < CD_MAX_TRACKS; toc->numtrks++)
{
- int tracknum = -1, frames = 0, hunks;
- char type[16], subtype[16];
+ int tracknum = -1, frames = 0, hunks, pregap, postgap;
+ char type[16], subtype[16], pgtype[16], pgsub[16];
cdrom_track_info *track;
+ pregap = postgap = 0;
+
/* fetch the metadata for this track */
err = chd_get_metadata(chd, CDROM_TRACK_METADATA_TAG, toc->numtrks, metadata, sizeof(metadata), NULL, NULL, NULL);
- if (err != CHDERR_NONE)
- break;
-
- /* parse the metadata */
- type[0] = subtype[0] = 0;
- if (sscanf(metadata, CDROM_TRACK_METADATA_FORMAT, &tracknum, type, subtype, &frames) != 4)
- return CHDERR_INVALID_DATA;
- if (tracknum == 0 || tracknum > CD_MAX_TRACKS)
- return CHDERR_INVALID_DATA;
- track = &toc->tracks[tracknum - 1];
+ if (err == CHDERR_NONE)
+ {
+ /* parse the metadata */
+ type[0] = subtype[0] = 0;
+ if (sscanf(metadata, CDROM_TRACK_METADATA_FORMAT, &tracknum, type, subtype, &frames) != 4)
+ return CHDERR_INVALID_DATA;
+ if (tracknum == 0 || tracknum > CD_MAX_TRACKS)
+ return CHDERR_INVALID_DATA;
+ track = &toc->tracks[tracknum - 1];
+ }
+ else
+ {
+ err = chd_get_metadata(chd, CDROM_TRACK_METADATA2_TAG, toc->numtrks, metadata, sizeof(metadata), NULL, NULL, NULL);
+ if (err != CHDERR_NONE)
+ break;
+ /* parse the metadata */
+ type[0] = subtype[0] = 0;
+ pregap = postgap = 0;
+ if (sscanf(metadata, CDROM_TRACK_METADATA2_FORMAT, &tracknum, type, subtype, &frames, &pregap, pgtype, pgsub, &postgap) != 8)
+ return CHDERR_INVALID_DATA;
+ if (tracknum == 0 || tracknum > CD_MAX_TRACKS)
+ return CHDERR_INVALID_DATA;
+ track = &toc->tracks[tracknum - 1];
+ }
/* extract the track type and determine the data size */
track->trktype = CD_TRACK_MODE1;
@@ -606,6 +697,15 @@ chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc)
track->frames = frames;
hunks = (frames + hunksectors - 1) / hunksectors;
track->extraframes = hunks * hunksectors - frames;
+
+ /* set the pregap info */
+ track->pregap = pregap;
+ track->pgtype = CD_TRACK_MODE1;
+ track->pgsub = CD_SUB_NONE;
+ track->pgdatasize = 0;
+ track->pgsubsize = 0;
+ cdrom_convert_type_string_to_pregap_info(pgtype, track);
+ cdrom_convert_subtype_string_to_pregap_info(pgsub, track);
}
/* if we got any tracks this way, we're done */
@@ -662,11 +762,13 @@ chd_error cdrom_write_metadata(chd_file *chd, const cdrom_toc *toc)
/* write the metadata */
for (i = 0; i < toc->numtrks; i++)
{
- char metadata[256];
- sprintf(metadata, CDROM_TRACK_METADATA_FORMAT, i + 1, cdrom_get_type_string(&toc->tracks[i]),
- cdrom_get_subtype_string(&toc->tracks[i]), toc->tracks[i].frames);
+ char metadata[512];
+ sprintf(metadata, CDROM_TRACK_METADATA2_FORMAT, i + 1, cdrom_get_type_string(toc->tracks[i].trktype),
+ cdrom_get_subtype_string(toc->tracks[i].subtype), toc->tracks[i].frames, toc->tracks[i].pregap,
+ cdrom_get_type_string(toc->tracks[i].pgtype), cdrom_get_subtype_string(toc->tracks[i].pgsub),
+ toc->tracks[i].postgap);
- err = chd_set_metadata(chd, CDROM_TRACK_METADATA_TAG, i, metadata, strlen(metadata) + 1, CHD_MDFLAGS_CHECKSUM);
+ err = chd_set_metadata(chd, CDROM_TRACK_METADATA2_TAG, i, metadata, strlen(metadata) + 1, CHD_MDFLAGS_CHECKSUM);
if (err != CHDERR_NONE)
return err;
}
diff --git a/src/lib/util/cdrom.h b/src/lib/util/cdrom.h
index d8a37c0b7a6..226f190f17a 100644
--- a/src/lib/util/cdrom.h
+++ b/src/lib/util/cdrom.h
@@ -59,6 +59,7 @@
#define CD_FRAMES_PER_HUNK (4)
#define CD_METADATA_WORDS (1+(CD_MAX_TRACKS * 6))
+
enum
{
CD_TRACK_MODE1 = 0, /* mode 1 2048 bytes/sector */
@@ -99,6 +100,12 @@ struct _cdrom_track_info
UINT32 subsize; /* size of subchannel data in each sector of this track */
UINT32 frames; /* number of frames in this track */
UINT32 extraframes; /* number of "spillage" frames in this track */
+ UINT32 pregap; /* number of pregap frames */
+ UINT32 postgap; /* number of postgap frames */
+ UINT32 pgtype; /* type of sectors in pregap */
+ UINT32 pgsub; /* type of subchannel data in pregap */
+ UINT32 pgdatasize; /* size of data in each sector of the pregap */
+ UINT32 pgsubsize; /* size of subchannel data in each sector of the pregap */
/* fields used in MAME only */
UINT32 physframeofs; /* frame number on the real CD this track starts at */
@@ -139,9 +146,11 @@ const cdrom_toc *cdrom_get_toc(cdrom_file *file);
/* extra utilities */
void cdrom_convert_type_string_to_track_info(const char *typestring, cdrom_track_info *info);
+void cdrom_convert_type_string_to_pregap_info(const char *typestring, cdrom_track_info *info);
void cdrom_convert_subtype_string_to_track_info(const char *typestring, cdrom_track_info *info);
-const char *cdrom_get_type_string(const cdrom_track_info *info);
-const char *cdrom_get_subtype_string(const cdrom_track_info *info);
+void cdrom_convert_subtype_string_to_pregap_info(const char *typestring, cdrom_track_info *info);
+const char *cdrom_get_type_string(UINT32 trktype);
+const char *cdrom_get_subtype_string(UINT32 subtype);
chd_error cdrom_parse_metadata(chd_file *chd, cdrom_toc *toc);
chd_error cdrom_write_metadata(chd_file *chd, const cdrom_toc *toc);
diff --git a/src/lib/util/chd.h b/src/lib/util/chd.h
index c090c04ac81..fa3291baa79 100644
--- a/src/lib/util/chd.h
+++ b/src/lib/util/chd.h
@@ -182,7 +182,9 @@
#define CDROM_OLD_METADATA_TAG 0x43484344 /* 'CHCD' */
#define CDROM_TRACK_METADATA_TAG 0x43485452 /* 'CHTR' */
#define CDROM_TRACK_METADATA_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d"
-
+#define CDROM_TRACK_METADATA2_TAG 0x43485432 /* 'CHT2' */
+#define CDROM_TRACK_METADATA2_FORMAT "TRACK:%d TYPE:%s SUBTYPE:%s FRAMES:%d PREGAP:%d PGTYPE:%s PGSUB:%s POSTGAP:%d"
+
/* standard A/V metadata */
#define AV_METADATA_TAG 0x41564156 /* 'AVAV' */
#define AV_METADATA_FORMAT "FPS:%d.%06d WIDTH:%d HEIGHT:%d INTERLACED:%d CHANNELS:%d SAMPLERATE:%d"