summaryrefslogtreecommitdiffstatshomepage
path: root/src/tools/chdman.cpp
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2022-04-01 11:36:41 +0200
committer Olivier Galibert <galibert@pobox.com>2022-04-01 11:36:55 +0200
commite4564eb99a5513e4044eecc070cbb09cb689a657 (patch)
treeadd3668153b17485e30ba415f0ba8b7feef25acc /src/tools/chdman.cpp
parente818533b167a24207e1cbfcee04524b215d001ef (diff)
cdrom_file: classify. Could use more internal work, but it's a step
Diffstat (limited to 'src/tools/chdman.cpp')
-rw-r--r--src/tools/chdman.cpp150
1 files changed, 73 insertions, 77 deletions
diff --git a/src/tools/chdman.cpp b/src/tools/chdman.cpp
index b2922720969..a0aebb0fb83 100644
--- a/src/tools/chdman.cpp
+++ b/src/tools/chdman.cpp
@@ -11,7 +11,7 @@
#include "avhuff.h"
#include "aviio.h"
#include "bitmap.h"
-#include "chdcd.h"
+#include "cdrom.h"
#include "corefile.h"
#include "hashing.h"
#include "md5.h"
@@ -309,11 +309,11 @@ public:
// if we have TOC - detect audio sectors and swap data
if (m_toc)
{
- assert(offset % CD_FRAME_SIZE == 0);
- assert(length % CD_FRAME_SIZE == 0);
+ assert(offset % cdrom_file::FRAME_SIZE == 0);
+ assert(length % cdrom_file::FRAME_SIZE == 0);
- int startlba = offset / CD_FRAME_SIZE;
- int lenlba = length / CD_FRAME_SIZE;
+ int startlba = offset / cdrom_file::FRAME_SIZE;
+ int lenlba = length / cdrom_file::FRAME_SIZE;
uint8_t *_dest = reinterpret_cast<uint8_t *>(dest);
for (int chdlba = 0; chdlba < lenlba; chdlba++)
@@ -327,11 +327,11 @@ public:
break;
}
// is it audio ?
- if (m_toc->tracks[tracknum].trktype != CD_TRACK_AUDIO)
+ if (m_toc->tracks[tracknum].trktype != cdrom_file::CD_TRACK_AUDIO)
continue;
// byteswap if yes
- int dataoffset = chdlba * CD_FRAME_SIZE;
- for (uint32_t swapindex = dataoffset; swapindex < (dataoffset + CD_MAX_SECTOR_DATA); swapindex += 2)
+ int dataoffset = chdlba * cdrom_file::FRAME_SIZE;
+ for (uint32_t swapindex = dataoffset; swapindex < (dataoffset + cdrom_file::MAX_SECTOR_DATA); swapindex += 2)
{
uint8_t temp = _dest[swapindex];
_dest[swapindex] = _dest[swapindex + 1];
@@ -343,7 +343,7 @@ public:
return length;
}
-const cdrom_toc * m_toc;
+const cdrom_file::toc * m_toc;
private:
// internal state
@@ -359,7 +359,7 @@ class chd_cd_compressor : public chd_file_compressor
{
public:
// construction/destruction
- chd_cd_compressor(cdrom_toc &toc, chdcd_track_input_info &info)
+ chd_cd_compressor(cdrom_file::toc &toc, cdrom_file::track_input_info &info)
: m_file(),
m_toc(toc),
m_info(info) { }
@@ -372,8 +372,8 @@ public:
virtual uint32_t read_data(void *_dest, uint64_t offset, uint32_t length)
{
// verify assumptions made below
- assert(offset % CD_FRAME_SIZE == 0);
- assert(length % CD_FRAME_SIZE == 0);
+ assert(offset % cdrom_file::FRAME_SIZE == 0);
+ assert(length % cdrom_file::FRAME_SIZE == 0);
// initialize destination to 0 so that unused areas are filled
uint8_t *dest = reinterpret_cast<uint8_t *>(_dest);
@@ -384,8 +384,8 @@ public:
uint32_t length_remaining = length;
for (int tracknum = 0; tracknum < m_toc.numtrks; tracknum++)
{
- const cdrom_track_info &trackinfo = m_toc.tracks[tracknum];
- uint64_t endoffs = startoffs + (uint64_t)(trackinfo.frames + trackinfo.extraframes) * CD_FRAME_SIZE;
+ const cdrom_file::track_info &trackinfo = m_toc.tracks[tracknum];
+ uint64_t endoffs = startoffs + (uint64_t)(trackinfo.frames + trackinfo.extraframes) * cdrom_file::FRAME_SIZE;
if (offset >= startoffs && offset < endoffs)
{
// if we don't already have this file open, open it now
@@ -412,7 +412,7 @@ public:
while (length_remaining != 0 && offset < endoffs)
{
// determine start of current frame
- uint64_t src_frame_start = src_track_start + ((offset - startoffs) / CD_FRAME_SIZE) * bytesperframe;
+ uint64_t src_frame_start = src_track_start + ((offset - startoffs) / cdrom_file::FRAME_SIZE) * bytesperframe;
// auto-advance next track for split-bin read
if (src_frame_start == split_track_start && m_lastfile.compare(m_info.track[tracknum+1].fname)!=0)
@@ -456,9 +456,9 @@ public:
}
// advance
- offset += CD_FRAME_SIZE;
- dest += CD_FRAME_SIZE;
- length_remaining -= CD_FRAME_SIZE;
+ offset += cdrom_file::FRAME_SIZE;
+ dest += cdrom_file::FRAME_SIZE;
+ length_remaining -= cdrom_file::FRAME_SIZE;
if (length_remaining == 0)
break;
}
@@ -472,10 +472,10 @@ public:
private:
// internal state
- std::string m_lastfile;
- util::core_file::ptr m_file;
- cdrom_toc & m_toc;
- chdcd_track_input_info & m_info;
+ std::string m_lastfile;
+ util::core_file::ptr m_file;
+ cdrom_file::toc & m_toc;
+ cdrom_file::track_input_info &m_info;
};
@@ -1290,7 +1290,7 @@ static void compress_common(chd_file_compressor &chd)
// to a CUE file
//-------------------------------------------------
-void output_track_metadata(int mode, util::core_file &file, int tracknum, const cdrom_track_info &info, const std::string &filename, uint32_t frameoffs, uint64_t discoffs)
+void output_track_metadata(int mode, util::core_file &file, int tracknum, const cdrom_file::track_info &info, const std::string &filename, uint32_t frameoffs, uint64_t discoffs)
{
if (mode == MODE_GDI)
{
@@ -1298,42 +1298,42 @@ void output_track_metadata(int mode, util::core_file &file, int tracknum, const
switch (info.trktype)
{
- case CD_TRACK_MODE1:
+ case cdrom_file::CD_TRACK_MODE1:
mode = 4;
size = 2048;
break;
- case CD_TRACK_MODE1_RAW:
+ case cdrom_file::CD_TRACK_MODE1_RAW:
mode = 4;
size = 2352;
break;
- case CD_TRACK_MODE2:
+ case cdrom_file::CD_TRACK_MODE2:
mode = 4;
size = 2336;
break;
- case CD_TRACK_MODE2_FORM1:
+ case cdrom_file::CD_TRACK_MODE2_FORM1:
mode = 4;
size = 2048;
break;
- case CD_TRACK_MODE2_FORM2:
+ case cdrom_file::CD_TRACK_MODE2_FORM2:
mode = 4;
size = 2324;
break;
- case CD_TRACK_MODE2_FORM_MIX:
+ case cdrom_file::CD_TRACK_MODE2_FORM_MIX:
mode = 4;
size = 2336;
break;
- case CD_TRACK_MODE2_RAW:
+ case cdrom_file::CD_TRACK_MODE2_RAW:
mode = 4;
size = 2352;
break;
- case CD_TRACK_AUDIO:
+ case cdrom_file::CD_TRACK_AUDIO:
mode = 0;
size = 2352;
break;
@@ -1352,20 +1352,20 @@ void output_track_metadata(int mode, util::core_file &file, int tracknum, const
std::string tempstr;
switch (info.trktype)
{
- case CD_TRACK_MODE1:
- case CD_TRACK_MODE1_RAW:
+ case cdrom_file::CD_TRACK_MODE1:
+ case cdrom_file::CD_TRACK_MODE1_RAW:
tempstr = string_format("MODE1/%04d", info.datasize);
break;
- case CD_TRACK_MODE2:
- case CD_TRACK_MODE2_FORM1:
- case CD_TRACK_MODE2_FORM2:
- case CD_TRACK_MODE2_FORM_MIX:
- case CD_TRACK_MODE2_RAW:
+ case cdrom_file::CD_TRACK_MODE2:
+ case cdrom_file::CD_TRACK_MODE2_FORM1:
+ case cdrom_file::CD_TRACK_MODE2_FORM2:
+ case cdrom_file::CD_TRACK_MODE2_FORM_MIX:
+ case cdrom_file::CD_TRACK_MODE2_RAW:
tempstr = string_format("MODE2/%04d", info.datasize);
break;
- case CD_TRACK_AUDIO:
+ case cdrom_file::CD_TRACK_AUDIO:
tempstr.assign("AUDIO");
break;
}
@@ -1405,15 +1405,15 @@ void output_track_metadata(int mode, util::core_file &file, int tracknum, const
// write out the track type
std::string modesubmode;
- if (info.subtype != CD_SUB_NONE)
- modesubmode = string_format("%s %s", cdrom_get_type_string(info.trktype), cdrom_get_subtype_string(info.subtype));
+ if (info.subtype != cdrom_file::CD_SUB_NONE)
+ modesubmode = string_format("%s %s", cdrom_file::get_type_string(info.trktype), cdrom_file::get_subtype_string(info.subtype));
else
- modesubmode = string_format("%s", cdrom_get_type_string(info.trktype));
+ modesubmode = string_format("%s", cdrom_file::get_type_string(info.trktype));
file.printf("TRACK %s\n", modesubmode);
// write out the attributes
file.printf("NO COPY\n");
- if (info.trktype == CD_TRACK_AUDIO)
+ if (info.trktype == cdrom_file::CD_TRACK_AUDIO)
{
file.printf("NO PRE_EMPHASIS\n");
file.printf("TWO_CHANNEL_AUDIO\n");
@@ -1982,12 +1982,12 @@ static void do_create_hd(parameters_map &params)
static void do_create_cd(parameters_map &params)
{
// process input file
- chdcd_track_input_info track_info;
- cdrom_toc toc = { 0 };
+ cdrom_file::track_input_info track_info;
+ cdrom_file::toc toc = { 0 };
auto input_file_str = params.find(OPTION_INPUT);
if (input_file_str != params.end())
{
- std::error_condition err = chdcd_parse_toc(input_file_str->second->c_str(), toc, track_info);
+ std::error_condition err = cdrom_file::parse_toc(input_file_str->second->c_str(), toc, track_info);
if (err)
report_error(1, "Error parsing input file (%s: %s)\n", *input_file_str->second, err.message());
}
@@ -1997,8 +1997,8 @@ static void do_create_cd(parameters_map &params)
std::string *output_chd_str = parse_output_chd_parameters(params, output_parent);
// process hunk size
- uint32_t hunk_size = output_parent.opened() ? output_parent.hunk_bytes() : CD_FRAMES_PER_HUNK * CD_FRAME_SIZE;
- parse_hunk_size(params, CD_FRAME_SIZE, hunk_size);
+ uint32_t hunk_size = output_parent.opened() ? output_parent.hunk_bytes() : cdrom_file::FRAMES_PER_HUNK * cdrom_file::FRAME_SIZE;
+ parse_hunk_size(params, cdrom_file::FRAME_SIZE, hunk_size);
// process compression
chd_codec_type compression[4];
@@ -2013,9 +2013,9 @@ static void do_create_cd(parameters_map &params)
uint32_t totalsectors = 0;
for (int tracknum = 0; tracknum < toc.numtrks; tracknum++)
{
- cdrom_track_info &trackinfo = toc.tracks[tracknum];
- int padded = (trackinfo.frames + CD_TRACK_PADDING - 1) / CD_TRACK_PADDING;
- trackinfo.extraframes = padded * CD_TRACK_PADDING - trackinfo.frames;
+ cdrom_file::track_info &trackinfo = toc.tracks[tracknum];
+ int padded = (trackinfo.frames + cdrom_file::TRACK_PADDING - 1) / cdrom_file::TRACK_PADDING;
+ trackinfo.extraframes = padded * cdrom_file::TRACK_PADDING - trackinfo.frames;
origtotalsectors += trackinfo.frames;
totalsectors += trackinfo.frames + trackinfo.extraframes;
}
@@ -2028,7 +2028,7 @@ static void do_create_cd(parameters_map &params)
printf("Input tracks: %d\n", toc.numtrks);
printf("Input length: %s\n", msf_string_from_frames(origtotalsectors).c_str());
printf("Compression: %s\n", compression_string(compression).c_str());
- printf("Logical size: %s\n", big_int_string(uint64_t(totalsectors) * CD_FRAME_SIZE).c_str());
+ printf("Logical size: %s\n", big_int_string(uint64_t(totalsectors) * cdrom_file::FRAME_SIZE).c_str());
// catch errors so we can close & delete the output file
chd_cd_compressor *chd = nullptr;
@@ -2038,14 +2038,14 @@ static void do_create_cd(parameters_map &params)
chd = new chd_cd_compressor(toc, track_info);
std::error_condition err;
if (output_parent.opened())
- err = chd->create(output_chd_str->c_str(), uint64_t(totalsectors) * uint64_t(CD_FRAME_SIZE), hunk_size, compression, output_parent);
+ err = chd->create(output_chd_str->c_str(), uint64_t(totalsectors) * uint64_t(cdrom_file::FRAME_SIZE), hunk_size, compression, output_parent);
else
- err = chd->create(output_chd_str->c_str(), uint64_t(totalsectors) * uint64_t(CD_FRAME_SIZE), hunk_size, CD_FRAME_SIZE, compression);
+ err = chd->create(output_chd_str->c_str(), uint64_t(totalsectors) * uint64_t(cdrom_file::FRAME_SIZE), hunk_size, cdrom_file::FRAME_SIZE, compression);
if (err)
report_error(1, "Error creating CHD file (%s): %s", *output_chd_str, err.message());
// add the standard CD metadata; we do this even if we have a parent because it might be different
- err = cdrom_write_metadata(chd, &toc);
+ err = cdrom_file::write_metadata(chd, toc);
if (err)
report_error(1, "Error adding CD metadata: %s", err.message());
@@ -2299,15 +2299,13 @@ static void do_copy(parameters_map &params)
// if we need to re-do the CD metadata, do it now
if (redo_cd)
{
- cdrom_file *cdrom = cdrom_open(&input_chd);
- if (cdrom == nullptr)
- report_error(1, "Error upgrading CD metadata");
- const cdrom_toc *toc = cdrom_get_toc(cdrom);
- err = cdrom_write_metadata(chd, toc);
+ cdrom_file *cdrom = new cdrom_file(&input_chd);
+ const cdrom_file::toc &toc = cdrom->get_toc();
+ err = cdrom_file::write_metadata(chd, toc);
if (err)
report_error(1, "Error writing upgraded CD metadata: %s", err.message());
if (cdda_swap)
- chd->m_toc = toc;
+ chd->m_toc = &toc;
}
// compress it generically
@@ -2418,10 +2416,8 @@ static void do_extract_cd(parameters_map &params)
parse_input_chd_parameters(params, input_chd, input_parent_chd);
// further process input file
- cdrom_file *cdrom = cdrom_open(&input_chd);
- if (cdrom == nullptr)
- report_error(1, "Unable to recognize CHD file as a CD");
- const cdrom_toc *toc = cdrom_get_toc(cdrom);
+ cdrom_file *cdrom = new cdrom_file(&input_chd);
+ const cdrom_file::toc &toc = cdrom->get_toc();
// verify output file doesn't exist
auto output_file_str = params.find(OPTION_OUTPUT);
@@ -2481,20 +2477,20 @@ static void do_extract_cd(parameters_map &params)
// determine total frames
uint64_t total_bytes = 0;
- for (int tracknum = 0; tracknum < toc->numtrks; tracknum++)
- total_bytes += toc->tracks[tracknum].frames * (toc->tracks[tracknum].datasize + toc->tracks[tracknum].subsize);
+ for (int tracknum = 0; tracknum < toc.numtrks; tracknum++)
+ total_bytes += toc.tracks[tracknum].frames * (toc.tracks[tracknum].datasize + toc.tracks[tracknum].subsize);
// GDI must start with the # of tracks
if (mode == MODE_GDI)
{
- output_toc_file->printf("%d\n", toc->numtrks);
+ output_toc_file->printf("%d\n", toc.numtrks);
}
// iterate over tracks and copy all data
uint64_t outputoffs = 0;
uint32_t discoffs = 0;
std::vector<uint8_t> buffer;
- for (int tracknum = 0; tracknum < toc->numtrks; tracknum++)
+ for (int tracknum = 0; tracknum < toc.numtrks; tracknum++)
{
std::string trackbin_name(basename);
@@ -2503,7 +2499,7 @@ static void do_extract_cd(parameters_map &params)
char temp[11];
sprintf(temp, "%02d", tracknum+1);
trackbin_name.append(temp);
- if (toc->tracks[tracknum].trktype == CD_TRACK_AUDIO)
+ if (toc.tracks[tracknum].trktype == cdrom_file::CD_TRACK_AUDIO)
trackbin_name.append(".raw");
else
trackbin_name.append(".bin");
@@ -2518,7 +2514,7 @@ static void do_extract_cd(parameters_map &params)
}
// output the metadata about the track to the TOC file
- const cdrom_track_info &trackinfo = toc->tracks[tracknum];
+ const cdrom_file::track_info &trackinfo = toc.tracks[tracknum];
if (mode == MODE_GDI)
{
output_track_metadata(mode, *output_toc_file, tracknum, trackinfo, std::string(core_filename_extract_base(trackbin_name)), discoffs, outputoffs);
@@ -2530,8 +2526,8 @@ static void do_extract_cd(parameters_map &params)
// If this is bin/cue output and the CHD contains subdata, warn the user and don't include
// the subdata size in the buffer calculation.
- uint32_t output_frame_size = trackinfo.datasize + ((trackinfo.subtype != CD_SUB_NONE) ? trackinfo.subsize : 0);
- if (trackinfo.subtype != CD_SUB_NONE && ((mode == MODE_CUEBIN) || (mode == MODE_GDI)))
+ uint32_t output_frame_size = trackinfo.datasize + ((trackinfo.subtype != cdrom_file::CD_SUB_NONE) ? trackinfo.subsize : 0);
+ if (trackinfo.subtype != cdrom_file::CD_SUB_NONE && ((mode == MODE_CUEBIN) || (mode == MODE_GDI)))
{
printf("Warning: Track %d has subcode data. bin/cue and gdi formats cannot contain subcode data and it will be omitted.\n", tracknum+1);
printf(" : This may affect usage of the output image. Use bin/toc output to keep all data.\n");
@@ -2549,11 +2545,11 @@ static void do_extract_cd(parameters_map &params)
progress(false, "Extracting, %.1f%% complete... \r", 100.0 * double(outputoffs) / double(total_bytes));
// read the data
- cdrom_read_data(cdrom, cdrom_get_track_start_phys(cdrom, tracknum) + frame, &buffer[bufferoffs], trackinfo.trktype, true);
+ cdrom->read_data(cdrom->get_track_start_phys(tracknum) + frame, &buffer[bufferoffs], trackinfo.trktype, true);
// for CDRWin and GDI audio tracks must be reversed
// in the case of GDI and CHD version < 5 we assuming source CHD image is GDROM so audio tracks is already reversed
- if (((mode == MODE_GDI && input_chd.version() > 4) || (mode == MODE_CUEBIN)) && (trackinfo.trktype == CD_TRACK_AUDIO))
+ if (((mode == MODE_GDI && input_chd.version() > 4) || (mode == MODE_CUEBIN)) && (trackinfo.trktype == cdrom_file::CD_TRACK_AUDIO))
for (int swapindex = 0; swapindex < trackinfo.datasize; swapindex += 2)
{
uint8_t swaptemp = buffer[bufferoffs + swapindex];
@@ -2564,9 +2560,9 @@ static void do_extract_cd(parameters_map &params)
discoffs++;
// read the subcode data
- if (trackinfo.subtype != CD_SUB_NONE && (mode == MODE_NORMAL))
+ if (trackinfo.subtype != cdrom_file::CD_SUB_NONE && (mode == MODE_NORMAL))
{
- cdrom_read_subcode(cdrom, cdrom_get_track_start_phys(cdrom, tracknum) + frame, &buffer[bufferoffs], true);
+ cdrom->read_subcode(cdrom->get_track_start_phys(tracknum) + frame, &buffer[bufferoffs], true);
bufferoffs += trackinfo.subsize;
}