@@ -89,40 +89,42 @@ std::shared_ptr<const TrackDataFlux> AbstractDecoder::decodeToSectors(
89
89
90
90
/* Read the sector record. */
91
91
92
- Fluxmap::Position before = fmr.tell ();
92
+ Fluxmap::Position before_sector = fmr.tell ();
93
93
decodeSectorRecord ();
94
- Fluxmap::Position after = fmr.tell ();
95
- pushRecord (before, after );
94
+ Fluxmap::Position after_sector = fmr.tell ();
95
+ pushRecord (before_sector, after_sector );
96
96
97
97
if (_sector->status != Sector::DATA_MISSING)
98
98
{
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 ();
102
102
}
103
103
else
104
104
{
105
105
/* The data is in a separate record. */
106
+ Fluxmap::Position before_data = before_sector;
107
+ Fluxmap::Position after_data = after_sector;
106
108
107
109
for (;;)
108
110
{
109
- _sector->headerStartTime = before .ns ();
110
- _sector->headerEndTime = after .ns ();
111
+ _sector->headerStartTime = before_data .ns ();
112
+ _sector->headerEndTime = after_data .ns ();
111
113
112
114
_sector->clock = advanceToNextRecord ();
113
115
if (fmr.eof () || !_sector->clock )
114
116
break ;
115
117
116
- before = fmr.tell ();
118
+ before_data = fmr.tell ();
117
119
decodeDataRecord ();
118
- after = fmr.tell ();
120
+ after_data = fmr.tell ();
119
121
120
122
if (_sector->status != Sector::DATA_MISSING)
121
123
{
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 );
126
128
break ;
127
129
}
128
130
@@ -131,6 +133,13 @@ std::shared_ptr<const TrackDataFlux> AbstractDecoder::decodeToSectors(
131
133
}
132
134
}
133
135
136
+ /* Allow decode of overlapping records.
137
+ * Note that this seeks to after the sector record, but before
138
+ * the data record, so it relies on a lone data record being
139
+ * ignored. */
140
+ if (this ->recordsSeekable ())
141
+ fmr.seek (after_sector);
142
+
134
143
if (_sector->status != Sector::MISSING)
135
144
_trackdata->sectors .push_back (_sector);
136
145
}
0 commit comments