if looping, squish DiskReader::playback_sample into loop range
[ardour.git] / libs / ardour / disk_reader.cc
index 083704d3d75d2a06a5b0910fe4f9f456bbc54cd7..76afb6b00f852ff59aeabfb44c0b904b39194c6f 100644 (file)
@@ -404,6 +404,12 @@ DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
                        playback_sample += disk_samples_to_consume;
                }
 
+               Location* loc = _loop_location;
+               if (loc) {
+                       Evoral::Range<samplepos_t> loop_range (loc->start(), loc->end() - 1);
+                       playback_sample = loop_range.squish (playback_sample);
+               }
+
                if (_playlists[DataType::AUDIO]) {
                        if (!c->empty()) {
                                if (_slaved) {
@@ -598,10 +604,13 @@ DiskReader::seek (samplepos_t sample, bool complete_refill)
 
        g_atomic_int_set (&_pending_overwrite, 0);
 
-       //sample = std::max ((samplecnt_t)0, sample -_session.worst_output_latency ());
+       DEBUG_TRACE (DEBUG::DiskIO, string_compose ("DiskReader::seek %s %ld -> %ld refill=%d\n", owner()->name().c_str(), playback_sample, sample, complete_refill));
 
-       //printf ("DiskReader::seek %s %ld -> %ld refill=%d\n", owner()->name().c_str(), playback_sample, sample, complete_refill);
-       // TODO: check if we can micro-locate
+       const samplecnt_t distance = sample - playback_sample;
+       if (can_internal_playback_seek (distance)) {
+               internal_playback_seek (distance);
+               return 0;
+       }
 
        for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
                (*chan)->rbuf->reset ();