summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-07-09 17:42:58 +0200
committerRobin Gareus <robin@gareus.org>2016-07-09 17:42:58 +0200
commit0d050de94e3ae5a1a0dc36114df1995b042f3b80 (patch)
tree8775d6393355b551b699819e5ca175d48be051d8
parentb64a6b658eae14b1dd1eba6113fa88f940fafc42 (diff)
move latency-recompute into dedicated thread.
this fixes an issue with jack1 and jack_latency_recompute() since must not send a server request from inside the server callback.
-rw-r--r--libs/ardour/ardour/route.h1
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/plugin_insert.cc4
-rw-r--r--libs/ardour/session.cc16
4 files changed, 20 insertions, 3 deletions
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 9d16c00ba3..bef1a54569 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -360,6 +360,7 @@ public:
/** the processors have changed; the parameter indicates what changed */
PBD::Signal1<void,RouteProcessorChange> processors_changed;
PBD::Signal1<void,void*> record_enable_changed;
+ PBD::Signal0<void> processor_latency_changed;
/** the metering point has changed */
PBD::Signal0<void> meter_change;
PBD::Signal0<void> signal_latency_changed;
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index ebafdd82f6..82c9231cfb 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -1509,8 +1509,10 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
typedef std::queue<AutoConnectRequest> AutoConnectQueue;
Glib::Threads::Mutex _auto_connect_queue_lock;
AutoConnectQueue _auto_connect_queue;
+ guint _latency_recompute_pending;
void auto_connect (const AutoConnectRequest&);
+ void queue_latency_recompute ();
/* SessionEventManager interface */
diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc
index 4bbeed5cf1..0beb4c2fdb 100644
--- a/libs/ardour/plugin_insert.cc
+++ b/libs/ardour/plugin_insert.cc
@@ -2959,10 +2959,8 @@ PluginInsert::latency_changed ()
{
// this is called in RT context, LatencyChanged is emitted after run()
_latency_changed = true;
-#if 1 // TODO check possible deadlock in RT-context (esp. with jack) latency-callback.
// XXX This also needs a proper API not an owner() hack.
- static_cast<Route*>(owner ())->processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
-#endif
+ static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
}
void
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index bf8291e4b0..74f20306d2 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -279,6 +279,7 @@ Session::Session (AudioEngine &eng,
, _reconnecting_routes_in_progress (false)
, _route_deletion_in_progress (false)
, destructive_index (0)
+ , _latency_recompute_pending (0)
, _track_number_decimals(1)
, default_fade_steepness (0)
, default_fade_msecs (0)
@@ -3418,6 +3419,7 @@ Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool
r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
+ r->processor_latency_changed.connect_same_thread (*this, boost::bind (&Session::queue_latency_recompute, this));
if (r->is_master()) {
_master_out = r;
@@ -6839,6 +6841,16 @@ Session::auto_connect_route (boost::shared_ptr<Route> route, bool connect_inputs
}
void
+Session::queue_latency_recompute ()
+{
+ g_atomic_int_inc (&_latency_recompute_pending);
+ if (pthread_mutex_trylock (&_auto_connect_mutex) == 0) {
+ pthread_cond_signal (&_auto_connect_cond);
+ pthread_mutex_unlock (&_auto_connect_mutex);
+ }
+}
+
+void
Session::auto_connect (const AutoConnectRequest& ar)
{
boost::shared_ptr<Route> route = ar.route.lock();
@@ -7003,6 +7015,10 @@ Session::auto_connect_thread_run ()
}
}
+ while (g_atomic_int_and (&_latency_recompute_pending, 0)) {
+ update_latency_compensation ();
+ }
+
pthread_cond_wait (&_auto_connect_cond, &_auto_connect_mutex);
}
pthread_mutex_unlock (&_auto_connect_mutex);