a grab bag of changes correcting and improving the way MIDI note on/off tracking...
[ardour.git] / libs / ardour / midi_diskstream.cc
index 093d77f19d966e01a7f5825eda70e7a9b0b911c8..e3d7014457a01ffe2ff0c98889c8f00cdc552054 100644 (file)
@@ -737,16 +737,16 @@ MidiDiskstream::read (framepos_t& start, framecnt_t dur, bool reversed)
                        start = loop_start + ((start - loop_start) % loop_length);
                        //cerr << "to " << start << endl;
                }
-               //cerr << "start is " << start << "  loopstart: " << loop_start << "  loopend: " << loop_end << endl;
+               // cerr << "start is " << start << "  loopstart: " << loop_start << "  loopend: " << loop_end << endl;
        }
 
        while (dur) {
 
                /* take any loop into account. we can't read past the end of the loop. */
 
-               if (loc && (loop_end - start < dur)) {
+               if (loc && (loop_end - start <= dur)) {
                        this_read = loop_end - start;
-                       //cerr << "reloop true: thisread: " << this_read << "  dur: " << dur << endl;
+                       // cerr << "reloop true: thisread: " << this_read << "  dur: " << dur << endl;
                        reloop = true;
                } else {
                        reloop = false;
@@ -1102,9 +1102,7 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen
 
   no_capture_stuff_to_do:
 
-       if (_playlist) {
-               midi_playlist()->clear_note_trackers ();
-       }
+       reset_tracker ();
 }
 
 void
@@ -1134,6 +1132,10 @@ MidiDiskstream::transport_looped (framepos_t transport_frame)
                last_recordable_frame = max_framepos;
                was_recording = true;
        }
+
+       if (!Config->get_seamless_loop()) {
+               reset_tracker ();
+       }
 }
 
 void
@@ -1373,7 +1375,7 @@ MidiDiskstream::allocate_temporary_buffers ()
 }
 
 void
-MidiDiskstream::monitor_input (bool yn)
+MidiDiskstream::ensure_jack_monitors_input (bool yn)
 {
        boost::shared_ptr<MidiPort> sp = _source_port.lock ();
        
@@ -1477,3 +1479,15 @@ MidiDiskstream::get_gui_feed_buffer () const
        b->copy (_gui_feed_buffer);
        return b;
 }
+
+void
+MidiDiskstream::reset_tracker ()
+{
+       _playback_buf->reset_tracker ();
+
+       boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
+
+       if (mp) {
+               mp->clear_note_trackers ();
+       }
+}