diff options
Diffstat (limited to 'src/tools/chdman.cpp')
-rw-r--r-- | src/tools/chdman.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/tools/chdman.cpp b/src/tools/chdman.cpp index 06f2373f5ca..516e2f5b057 100644 --- a/src/tools/chdman.cpp +++ b/src/tools/chdman.cpp @@ -395,10 +395,27 @@ public: uint64_t src_track_start = m_info.track[tracknum].offset; uint64_t src_track_end = src_track_start + bytesperframe * (uint64_t)trackinfo.frames; uint64_t pad_track_start = src_track_end - ((uint64_t)m_toc.tracks[tracknum].padframes * bytesperframe); + uint64_t split_track_start = pad_track_start - ((uint64_t)m_toc.tracks[tracknum].splitframes * bytesperframe); + + // dont split when split-bin read not required + if ((uint64_t)m_toc.tracks[tracknum].splitframes == 0L) + split_track_start = UINT64_MAX; + 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; + + // 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) + { + m_file.reset(); + m_lastfile = m_info.track[tracknum+1].fname; + osd_file::error filerr = util::core_file::open(m_lastfile, OPEN_FLAG_READ, m_file); + if (filerr != osd_file::error::NONE) + report_error(1, "Error opening input file (%s)'", m_lastfile.c_str()); + } + if (src_frame_start < src_track_end) { // read it in, or pad if we're into the padframes @@ -408,7 +425,9 @@ public: } else { - m_file->seek(src_frame_start, SEEK_SET); + m_file->seek((src_frame_start >= split_track_start) + ? src_frame_start - split_track_start + : src_frame_start, SEEK_SET); uint32_t count = m_file->read(dest, bytesperframe); if (count != bytesperframe) report_error(1, "Error reading input file (%s)'", m_lastfile.c_str()); |