diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h index b40f1ad27a..3d9f401c80 100644 --- a/libs/ardour/ardour/audioengine.h +++ b/libs/ardour/ardour/audioengine.h @@ -135,6 +135,7 @@ class LIBARDOUR_API AudioEngine : public PortManager, public SessionHandlePtr bool running() const { return _running; } Glib::Threads::Mutex& process_lock() { return _process_lock; } + Glib::Threads::Mutex& latency_lock() { return _latency_lock; } Glib::Threads::RecMutex& state_lock() { return _state_lock; } int request_buffer_size (pframes_t samples) { @@ -268,6 +269,7 @@ class LIBARDOUR_API AudioEngine : public PortManager, public SessionHandlePtr static AudioEngine* _instance; Glib::Threads::Mutex _process_lock; + Glib::Threads::Mutex _latency_lock; Glib::Threads::RecMutex _state_lock; Glib::Threads::Cond session_removed; bool session_remove_pending; diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 9be6248069..6e019ee7f0 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -308,6 +308,7 @@ AudioEngine::process_callback (pframes_t nframes) lc = true; } if (lp || lc) { + Glib::Threads::Mutex::Lock ll (_latency_lock); tm.release (); /* re-check after releasing lock */ if (_session->processing_blocked ()) { @@ -1479,12 +1480,18 @@ AudioEngine::latency_callback (bool for_playback) return; } - if (in_process_thread () && ! _session->processing_blocked ()) { + if (in_process_thread ()) { /* internal backends emit the latency callback in the rt-callback, * async to connect/disconnect or port creation/deletion. * All is fine. */ - _session->update_latency (for_playback); + Glib::Threads::Mutex::Lock ll (_latency_lock); + if (_session->processing_blocked ()) { + /* Except Session::write_one_track() might just have called block_processing() */ + queue_latency_update (for_playback); + } else { + _session->update_latency (for_playback); + } } else { /* However jack 1/2 emit the callback in sync with creating the port * (or while handling the connection change). diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index d9bd579e65..7663af6636 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -5762,6 +5762,8 @@ Session::write_one_track (Track& track, samplepos_t start, samplepos_t end, // and processing_blocked() is honored before // acquiring thread buffers Glib::Threads::Mutex::Lock lm (_engine.process_lock()); + /* latency callback may be in process, wait until complete */ + Glib::Threads::Mutex::Lock lx (_engine.latency_lock()); } _bounce_processing_active = true;