summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/session.cc11
2 files changed, 13 insertions, 0 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index c18b76a984..b5997a3a83 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -1540,6 +1540,8 @@ private:
ChanCount output_offset;
};
+ Glib::Threads::Mutex _update_latency_lock;
+
typedef std::queue<AutoConnectRequest> AutoConnectQueue;
Glib::Threads::Mutex _auto_connect_queue_lock;
AutoConnectQueue _auto_connect_queue;
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 228c52ef08..da4421d4a2 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -6944,6 +6944,17 @@ Session::update_latency_compensation (bool force_whole_graph)
if (_state_of_the_state & (InitialConnecting|Deletion)) {
return;
}
+ /* this lock is not usually contended, but under certain conditions,
+ * update_latency_compensation may be called concurrently.
+ * e.g. drag/drop copy a latent plugin while rolling.
+ * GUI thread (via route_processors_changed) and
+ * auto_connect_thread_run may race.
+ */
+ Glib::Threads::Mutex::Lock lx (_update_latency_lock, Glib::Threads::TRY_LOCK);
+ if (!lx.locked()) {
+ /* no need to do this twice */
+ return;
+ }
bool some_track_latency_changed = update_route_latency (false, false);