summaryrefslogtreecommitdiffstatshomepage
path: root/src/tools/chdman.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/chdman.cpp')
-rw-r--r--src/tools/chdman.cpp21
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());