Skip to content

Commit 755e2a1

Browse files
committed
Allow new sectors to start in the data region of existing sectors.
Fixes #551. This is important for some copy protection schemes.
1 parent 4cfa071 commit 755e2a1

File tree

1 file changed

+19
-14
lines changed

1 file changed

+19
-14
lines changed

lib/decoders/decoders.cc

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -89,40 +89,42 @@ std::shared_ptr<const TrackDataFlux> AbstractDecoder::decodeToSectors(
8989

9090
/* Read the sector record. */
9191

92-
Fluxmap::Position before = fmr.tell();
92+
Fluxmap::Position before_sector = fmr.tell();
9393
decodeSectorRecord();
94-
Fluxmap::Position after = fmr.tell();
95-
pushRecord(before, after);
94+
Fluxmap::Position after_sector = fmr.tell();
95+
pushRecord(before_sector, after_sector);
9696

9797
if (_sector->status != Sector::DATA_MISSING)
9898
{
99-
_sector->position = before.bytes;
100-
_sector->dataStartTime = before.ns();
101-
_sector->dataEndTime = after.ns();
99+
_sector->position = before_sector.bytes;
100+
_sector->dataStartTime = before_sector.ns();
101+
_sector->dataEndTime = after_sector.ns();
102102
}
103103
else
104104
{
105105
/* The data is in a separate record. */
106+
Fluxmap::Position before_data = before_sector;
107+
Fluxmap::Position after_data = after_sector;
106108

107109
for (;;)
108110
{
109-
_sector->headerStartTime = before.ns();
110-
_sector->headerEndTime = after.ns();
111+
_sector->headerStartTime = before_data.ns();
112+
_sector->headerEndTime = after_data.ns();
111113

112114
_sector->clock = advanceToNextRecord();
113115
if (fmr.eof() || !_sector->clock)
114116
break;
115117

116-
before = fmr.tell();
118+
before_data = fmr.tell();
117119
decodeDataRecord();
118-
after = fmr.tell();
120+
after_data = fmr.tell();
119121

120122
if (_sector->status != Sector::DATA_MISSING)
121123
{
122-
_sector->position = before.bytes;
123-
_sector->dataStartTime = before.ns();
124-
_sector->dataEndTime = after.ns();
125-
pushRecord(before, after);
124+
_sector->position = before_data.bytes;
125+
_sector->dataStartTime = before_data.ns();
126+
_sector->dataEndTime = after_data.ns();
127+
pushRecord(before_data, after_data);
126128
break;
127129
}
128130

@@ -131,6 +133,9 @@ std::shared_ptr<const TrackDataFlux> AbstractDecoder::decodeToSectors(
131133
}
132134
}
133135

136+
/* Allow decode of overlapping records. */
137+
fmr.seek(after_sector);
138+
134139
if (_sector->status != Sector::MISSING)
135140
_trackdata->sectors.push_back(_sector);
136141
}

0 commit comments

Comments
 (0)