summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2019-11-06 16:00:00 -0700
committerPaul Davis <paul@linuxaudiosystems.com>2019-11-06 16:00:31 -0700
commitfebaa1ff2d1f5150d30902f7ccc8b5dfcfb3c913 (patch)
tree8fa79254ff807577eb6977987f834edfed8905fb /libs
parent9694f8996643e8845393aa60548f97ccc416d4e1 (diff)
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
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/delivery.h2
-rw-r--r--libs/ardour/ardour/disk_reader.h2
-rw-r--r--libs/ardour/ardour/midi_port.h2
-rw-r--r--libs/ardour/ardour/midi_track.h2
-rw-r--r--libs/ardour/ardour/plugin.h2
-rw-r--r--libs/ardour/ardour/plugin_insert.h2
-rw-r--r--libs/ardour/ardour/port.h2
-rw-r--r--libs/ardour/ardour/processor.h2
-rw-r--r--libs/ardour/ardour/route.h2
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/delivery.cc4
-rw-r--r--libs/ardour/disk_reader.cc11
-rw-r--r--libs/ardour/midi_port.cc2
-rw-r--r--libs/ardour/midi_track.cc6
-rw-r--r--libs/ardour/plugin.cc2
-rw-r--r--libs/ardour/plugin_insert.cc4
-rw-r--r--libs/ardour/session_transport.cc2
17 files changed, 26 insertions, 25 deletions
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<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_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<RouteList> r = routes.reader ();
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
- (*i)->realtime_locate ();
+ (*i)->realtime_locate (for_loop_end);
}
}