From 87f4a4afff6c639ddaab2f10dadca72b2ea57704 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 11 Dec 2019 20:36:00 -0700 Subject: [PATCH] use process lock to lock out process() during playback buffer resizing --- libs/ardour/session_butler.cc | 1 - libs/ardour/session_transport.cc | 12 ++++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc index 0744df6233..143c9d540d 100644 --- a/libs/ardour/session_butler.cc +++ b/libs/ardour/session_butler.cc @@ -66,7 +66,6 @@ void Session::schedule_playback_buffering_adjustment () { add_post_transport_work (PostTransportAdjustPlaybackBuffering); - DiskReader::inc_no_disk_output (); _butler->schedule_transport_work (); } diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index 2c93e10d47..e41eb59a0f 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -716,20 +716,13 @@ Session::butler_completed_transport_work () TFSM_EVENT (TransportFSM::LocateDone); } - if (ptw & PostTransportAdjustPlaybackBuffering) { - /* we blocked output while this happened */ - DiskReader::dec_no_disk_output (); - ptw = PostTransportWork (ptw & ~PostTransportAdjustPlaybackBuffering); - set_post_transport_work (ptw); - } - bool start_after_butler_done_msg = false; if ((ptw & (PostTransportReverse|PostTransportRoll))) { start_after_butler_done_msg = true; } - ptw = PostTransportWork (ptw & ~(PostTransportAdjustCaptureBuffering|PostTransportOverWrite|PostTransportReverse|PostTransportRoll)); + ptw = PostTransportWork (ptw & ~(PostTransportAdjustPlaybackBuffering|PostTransportAdjustCaptureBuffering|PostTransportOverWrite|PostTransportReverse|PostTransportRoll)); set_post_transport_work (ptw); set_next_event (); @@ -1147,6 +1140,9 @@ Session::butler_transport_work () } if (ptw & PostTransportAdjustPlaybackBuffering) { + /* need to prevent concurrency with ARDOUR::Reader::run(), + * DiskWriter::adjust_buffering() re-allocates the ringbuffer */ + Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ()); for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { boost::shared_ptr tr = boost::dynamic_pointer_cast (*i); if (tr) { -- 2.30.2