diff options
| author | 2022-04-01 11:36:41 +0200 | |
|---|---|---|
| committer | 2022-04-01 11:36:55 +0200 | |
| commit | e4564eb99a5513e4044eecc070cbb09cb689a657 (patch) | |
| tree | add3668153b17485e30ba415f0ba8b7feef25acc /src/tools/chdman.cpp | |
| parent | e818533b167a24207e1cbfcee04524b215d001ef (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.cpp | 150 |
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 ¶ms) static void do_create_cd(parameters_map ¶ms) { // 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 ¶ms) 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 ¶ms) 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 ¶ms) 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 ¶ms) 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 ¶ms) // 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 ¶ms) 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 ¶ms) // 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 ¶ms) 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 ¶ms) } // 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 ¶ms) // 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 ¶ms) 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 ¶ms) 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; } |
