Skip to content

Commit 6ceefd8

Browse files
authored
Merge pull request #4 from rabbitholecomputing/fix/cd-audio-offset
Fix TOC offset reporting
2 parents 34c66f4 + d932286 commit 6ceefd8

File tree

3 files changed

+21
-10
lines changed

3 files changed

+21
-10
lines changed

src/CUEParser.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ const CUETrackInfo *CUEParser::next_track(uint64_t prev_file_size)
6363
{
6464
// Previous track info is needed to track file offset
6565
uint32_t prev_track_start = m_track_info.track_start;
66+
m_track_info.cumulative_offset += m_track_info.unstored_pregap_length;
6667
uint32_t prev_sector_length = get_sector_length(m_track_info.file_mode, m_track_info.track_mode); // Defaults to 2352 before first track
6768

6869
bool got_file = false;
@@ -123,13 +124,13 @@ const CUETrackInfo *CUEParser::next_track(uint64_t prev_file_size)
123124
if (index == 0)
124125
{
125126
// Stored pregap that is present both on CD and in data file
126-
m_track_info.track_start = m_track_info.file_start + time;
127+
m_track_info.track_start = m_track_info.file_start + time + m_track_info.cumulative_offset;
127128
got_pause = true;
128129
}
129130
else if (index == 1)
130131
{
131132
// Data content of the track
132-
m_track_info.data_start = m_track_info.file_start + time;
133+
m_track_info.data_start = m_track_info.file_start + time + m_track_info.cumulative_offset;
133134
got_data = true;
134135
}
135136
}
@@ -148,7 +149,7 @@ const CUETrackInfo *CUEParser::next_track(uint64_t prev_file_size)
148149
if (!got_file)
149150
{
150151
// Advance file position by the length of previous track
151-
m_track_info.file_offset += (uint64_t)(m_track_info.track_start - prev_track_start) * prev_sector_length;
152+
m_track_info.file_offset += (uint64_t)(m_track_info.track_start - (prev_track_start + m_track_info.cumulative_offset)) * prev_sector_length;
152153
}
153154

154155
// Advance file position by any stored pregap

src/CUEParser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ struct CUETrackInfo
6868
// These frames of silence are not stored in the underlying data file.
6969
uint32_t unstored_pregap_length;
7070

71+
// The cumulative lba offset of unstored data
72+
uint32_t cumulative_offset;
73+
7174
// LBA start position of this file
7275
uint32_t file_start;
7376

test/CUEParser_test.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ FILE "Sound.wav" WAVE
5353
track = parser.next_track();
5454
TEST(track != NULL);
5555
uint32_t start2 = ((2 * 60) + 47) * 75 + 20;
56+
uint32_t pregap_offset = 2 * 75;
5657
if (track)
5758
{
5859
TEST(strcmp(track->filename, "Image Name.bin") == 0);
@@ -61,8 +62,8 @@ FILE "Sound.wav" WAVE
6162
TEST(track->track_number == 2);
6263
TEST(track->track_mode == CUETrack_AUDIO);
6364
TEST(track->sector_length == 2352);
64-
TEST(track->unstored_pregap_length == 2 * 75);
65-
TEST(track->data_start == start2 + 2 * 75);
65+
TEST(track->unstored_pregap_length == pregap_offset);
66+
TEST(track->data_start == start2 + pregap_offset);
6667
}
6768

6869
COMMENT("Test TRACK 03 (audio with index 0)");
@@ -78,13 +79,19 @@ FILE "Sound.wav" WAVE
7879
TEST(track->track_number == 3);
7980
TEST(track->track_mode == CUETrack_AUDIO);
8081
TEST(track->sector_length == 2352);
81-
TEST(track->track_start == start3_i0);
82-
TEST(track->data_start == start3_i1);
82+
TEST(track->track_start == start3_i0 + pregap_offset);
83+
TEST(track->data_start == start3_i1 + pregap_offset);
8384
}
8485

8586
COMMENT("Test TRACK 11 (audio from wav)");
86-
track = parser.next_track(track->file_offset + 75 * 4 * 2352);
87+
uint32_t track03_lba_length = 4 * 75;
88+
uint32_t prev_data_start = track->data_start;
89+
// Because the FILE restarts MSF locations we need the lba offset it starts at
90+
uint32_t zeroed_lba_offset = prev_data_start + track03_lba_length;
91+
track = parser.next_track(track->file_offset + track03_lba_length * 2352);
8792
TEST(track != NULL);
93+
uint32_t start11_i0 = zeroed_lba_offset + 0;
94+
uint32_t start11_i1 = zeroed_lba_offset + (2 * 75);
8895
if (track)
8996
{
9097
TEST(strcmp(track->filename, "Sound.wav") == 0);
@@ -93,8 +100,8 @@ FILE "Sound.wav" WAVE
93100
TEST(track->track_number == 11);
94101
TEST(track->track_mode == CUETrack_AUDIO);
95102
TEST(track->sector_length == 0);
96-
TEST(track->track_start == start3_i1 + 75 * 4);
97-
TEST(track->data_start == start3_i1 + 75 * 6);
103+
TEST(track->track_start == start11_i0 + pregap_offset);
104+
TEST(track->data_start == start11_i1 + pregap_offset);
98105
}
99106

100107
COMMENT("Test end of file");

0 commit comments

Comments
 (0)