diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2019-12-11 20:36:00 -0700 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2019-12-11 20:36:10 -0700 |
commit | 87f4a4afff6c639ddaab2f10dadca72b2ea57704 (patch) | |
tree | c8b9be5db6dde25d4c701586927d083a35261162 /libs/ardour/session_transport.cc | |
parent | f78c65984086a182fba325746f5933119d34b81f (diff) |
use process lock to lock out process() during playback buffer resizing
Diffstat (limited to 'libs/ardour/session_transport.cc')
-rw-r--r-- | libs/ardour/session_transport.cc | 12 |
1 files changed, 4 insertions, 8 deletions
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<Track> tr = boost::dynamic_pointer_cast<Track> (*i); if (tr) { |