if a locate brings us within a heuristic-specified distance of the current position in a DiskReader, pay attention to loop status
If the last read was not looped, but the new one should be, we need to ignore the heuristic. Ditto for vice-versa. This isomorphic with the read-reversed case
This commit is contained in:
parent
370f7bb30f
commit
88e84067f2
@ -190,6 +190,7 @@ private:
|
||||
sampleoffset_t _declick_offs;
|
||||
MidiStateTracker _tracker;
|
||||
boost::optional<bool> _last_read_reversed;
|
||||
boost::optional<bool> _last_read_loop;
|
||||
|
||||
static samplecnt_t _chunk_samples;
|
||||
static gint _no_disk_output;
|
||||
|
@ -743,19 +743,20 @@ DiskReader::seek (samplepos_t sample, bool complete_refill)
|
||||
ChannelList::iterator chan;
|
||||
boost::shared_ptr<ChannelList> c = channels.reader();
|
||||
const bool read_reversed = !_session.transport_will_roll_forwards ();
|
||||
const bool read_loop = (bool) _loop_location;
|
||||
|
||||
if (c->empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (_last_read_reversed && (_last_read_reversed == read_reversed)) {
|
||||
if ((!_last_read_reversed && (_last_read_reversed != read_reversed)) ||
|
||||
(!_last_read_loop && (_last_read_loop != read_loop))) {
|
||||
|
||||
/* We do these things only if we're still reading in the same
|
||||
* direction we did last time.
|
||||
*/
|
||||
|
||||
if (sample == playback_sample && !complete_refill) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1023,6 +1024,8 @@ DiskReader::audio_read (Sample* sum_buffer,
|
||||
}
|
||||
|
||||
_last_read_reversed = reversed;
|
||||
_last_read_loop = (bool) loc;
|
||||
|
||||
return rcnt;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user