From febaa1ff2d1f5150d30902f7ccc8b5dfcfb3c913 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 6 Nov 2019 16:00:00 -0700 Subject: fix unconditional note resolution during DiskReader::realtime_locate() When looping, we do not want to resolve notes at the end of the loop via ::realtime_locate() - ::get_midi_playback() has already taken care of this. But when not looping, we need this. So, add an argument to tell all interested parties whether the locate is for a loop end or not --- libs/ardour/ardour/delivery.h | 2 +- libs/ardour/ardour/disk_reader.h | 2 +- libs/ardour/ardour/midi_port.h | 2 +- libs/ardour/ardour/midi_track.h | 2 +- libs/ardour/ardour/plugin.h | 2 +- libs/ardour/ardour/plugin_insert.h | 2 +- libs/ardour/ardour/port.h | 2 +- libs/ardour/ardour/processor.h | 2 +- libs/ardour/ardour/route.h | 2 +- libs/ardour/ardour/session.h | 2 +- libs/ardour/delivery.cc | 4 ++-- libs/ardour/disk_reader.cc | 11 +++++++---- libs/ardour/midi_port.cc | 2 +- libs/ardour/midi_track.cc | 6 ++---- libs/ardour/plugin.cc | 2 +- libs/ardour/plugin_insert.cc | 4 ++-- libs/ardour/session_transport.cc | 2 +- 17 files changed, 26 insertions(+), 25 deletions(-) (limited to 'libs') diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h index 18bc2987da..887da3b1da 100644 --- a/libs/ardour/ardour/delivery.h +++ b/libs/ardour/ardour/delivery.h @@ -84,7 +84,7 @@ public: void flush_buffers (samplecnt_t nframes); void no_outs_cuz_we_no_monitor(bool); void non_realtime_transport_stop (samplepos_t now, bool flush); - void realtime_locate (); + void realtime_locate (bool); BufferSet& output_buffers() { return *_output_buffers; } diff --git a/libs/ardour/ardour/disk_reader.h b/libs/ardour/ardour/disk_reader.h index 20f1e93601..beb7fb625e 100644 --- a/libs/ardour/ardour/disk_reader.h +++ b/libs/ardour/ardour/disk_reader.h @@ -50,7 +50,7 @@ public: void run (BufferSet& /*bufs*/, samplepos_t /*start_sample*/, samplepos_t /*end_sample*/, double speed, pframes_t /*nframes*/, bool /*result_required*/); void realtime_handle_transport_stopped (); - void realtime_locate (); + void realtime_locate (bool); bool overwrite_existing_buffers (); void set_pending_overwrite (); diff --git a/libs/ardour/ardour/midi_port.h b/libs/ardour/ardour/midi_port.h index 44186ed19a..bf9ce72c25 100644 --- a/libs/ardour/ardour/midi_port.h +++ b/libs/ardour/ardour/midi_port.h @@ -46,7 +46,7 @@ public: void flush_buffers (pframes_t nframes); void transport_stopped (); - void realtime_locate (); + void realtime_locate (bool); void reset (); void require_resolve (); diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index be78c060c3..5232083311 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -43,7 +43,7 @@ public: int init (); - void realtime_locate (); + void realtime_locate (bool); void non_realtime_locate (samplepos_t); bool can_be_record_enabled (); diff --git a/libs/ardour/ardour/plugin.h b/libs/ardour/ardour/plugin.h index 287f18ad68..cdcc313578 100644 --- a/libs/ardour/ardour/plugin.h +++ b/libs/ardour/ardour/plugin.h @@ -174,7 +174,7 @@ public: bool write_immediate_event (size_t size, const uint8_t* buf); void realtime_handle_transport_stopped (); - void realtime_locate (); + void realtime_locate (bool); void monitoring_changed (); struct UILayoutHint { diff --git a/libs/ardour/ardour/plugin_insert.h b/libs/ardour/ardour/plugin_insert.h index c06bdb66ce..68c1aaa604 100644 --- a/libs/ardour/ardour/plugin_insert.h +++ b/libs/ardour/ardour/plugin_insert.h @@ -190,7 +190,7 @@ public: ); void realtime_handle_transport_stopped (); - void realtime_locate (); + void realtime_locate (bool); void monitoring_changed (); bool load_preset (Plugin::PresetRecord); diff --git a/libs/ardour/ardour/port.h b/libs/ardour/ardour/port.h index d2fb0ed03f..aa19ca85ed 100644 --- a/libs/ardour/ardour/port.h +++ b/libs/ardour/ardour/port.h @@ -122,7 +122,7 @@ public: virtual Buffer& get_buffer (pframes_t nframes) = 0; virtual void flush_buffers (pframes_t /*nframes*/) {} virtual void transport_stopped () {} - virtual void realtime_locate () {} + virtual void realtime_locate (bool for_loop_end) {} virtual void set_buffer_size (pframes_t) {} bool physically_connected () const; diff --git a/libs/ardour/ardour/processor.h b/libs/ardour/ardour/processor.h index 33fc813eec..29f72cb952 100644 --- a/libs/ardour/ardour/processor.h +++ b/libs/ardour/ardour/processor.h @@ -115,7 +115,7 @@ class LIBARDOUR_API Processor : public SessionObject, public Automatable, public virtual ChanCount output_streams() const { return _configured_output; } virtual void realtime_handle_transport_stopped () {} - virtual void realtime_locate () {} + virtual void realtime_locate (bool) {} virtual void set_loop (Location *loc) { _loop_location = loc; } diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 18b1853436..6f96b9e426 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -159,7 +159,7 @@ public: void non_realtime_transport_stop (samplepos_t now, bool flush); virtual void realtime_handle_transport_stopped (); - virtual void realtime_locate () {} + virtual void realtime_locate (bool) {} virtual void non_realtime_locate (samplepos_t); void set_loop (ARDOUR::Location *); diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index f97a30da0f..62742109be 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1693,7 +1693,7 @@ private: void force_locate (samplepos_t sample, bool with_roll = false); void set_transport_speed (double speed, samplepos_t destination_sample, bool abort = false, bool clear_state = false, bool as_default = false); void realtime_stop (bool abort, bool clear_state); - void realtime_locate (); + void realtime_locate (bool); void non_realtime_start_scrub (); void non_realtime_set_speed (); void non_realtime_locate (); diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index b27aded421..32f2f14bdb 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -520,13 +520,13 @@ Delivery::non_realtime_transport_stop (samplepos_t now, bool flush) } void -Delivery::realtime_locate () +Delivery::realtime_locate (bool for_loop_end) { if (_output) { PortSet& ports (_output->ports()); for (PortSet::iterator i = ports.begin(); i != ports.end(); ++i) { - i->realtime_locate (); + i->realtime_locate (for_loop_end); } } } diff --git a/libs/ardour/disk_reader.cc b/libs/ardour/disk_reader.cc index 0790b7279e..919fdd8669 100644 --- a/libs/ardour/disk_reader.cc +++ b/libs/ardour/disk_reader.cc @@ -166,8 +166,12 @@ DiskReader::realtime_handle_transport_stopped () } void -DiskReader::realtime_locate () +DiskReader::realtime_locate (bool for_loop_end) { + if (!for_loop_end) { + boost::shared_ptr mt = boost::dynamic_pointer_cast(_track); + _tracker.resolve_notes (mt->immediate_events(), 0); + } } float @@ -1122,14 +1126,13 @@ DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, sample cnt -= this_read; effective_start += this_read; - DEBUG_TRACE (DEBUG::MidiDiskIO, string_compose ("%1 MDS events LOOP read %2 range %3 .. %4 cnt now %5\n", _name, events_read, effective_start, effective_end, cnt)); - + DEBUG_TRACE (DEBUG::MidiDiskIO, string_compose ("%1 MDS events LOOP read %2 cnt now %3\n", _name, events_read, cnt)); if (cnt) { /* We re going to have to read across the loop end. Resolve any notes the extend across the loop end. * Time is relative to start_sample. */ - _tracker.resolve_notes (*target, (loc->end() - 1) - start_sample); + _tracker.resolve_notes (*target, effective_end - start_sample); } } while (cnt); diff --git a/libs/ardour/midi_port.cc b/libs/ardour/midi_port.cc index 57df97017f..1a34b032b8 100644 --- a/libs/ardour/midi_port.cc +++ b/libs/ardour/midi_port.cc @@ -357,7 +357,7 @@ MidiPort::transport_stopped () } void -MidiPort::realtime_locate () +MidiPort::realtime_locate (bool) { _resolve_required = true; } diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 2711f2e864..4a0c181e7a 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -351,7 +351,7 @@ MidiTrack::no_roll_unlocked (pframes_t nframes, samplepos_t start_sample, sample } void -MidiTrack::realtime_locate () +MidiTrack::realtime_locate (bool for_loop_end) { Glib::Threads::RWLock::ReaderLock lm (_processor_lock, Glib::Threads::TRY_LOCK); @@ -360,10 +360,8 @@ MidiTrack::realtime_locate () } for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) { - (*i)->realtime_locate (); + (*i)->realtime_locate (for_loop_end); } - - _disk_reader->resolve_tracker (_immediate_events, 0); } void diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc index b0964c2c16..5d77b375bc 100644 --- a/libs/ardour/plugin.cc +++ b/libs/ardour/plugin.cc @@ -391,7 +391,7 @@ Plugin::realtime_handle_transport_stopped () } void -Plugin::realtime_locate () +Plugin::realtime_locate (bool) { resolve_midi (); } diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index ba2346b72f..24b5dfd8ad 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -3234,10 +3234,10 @@ PluginInsert::realtime_handle_transport_stopped () } void -PluginInsert::realtime_locate () +PluginInsert::realtime_locate (bool for_loop_end) { for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { - (*i)->realtime_locate (); + (*i)->realtime_locate (for_loop_end); } } diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 1b66dbff11..5baa39a0f8 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -282,7 +282,7 @@ Session::do_locate (samplepos_t target_sample, bool with_roll, bool with_flush, boost::shared_ptr r = routes.reader (); for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { - (*i)->realtime_locate (); + (*i)->realtime_locate (for_loop_end); } } -- cgit v1.2.3