summaryrefslogtreecommitdiff
path: root/libs/ardour/session_transport.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2019-12-11 20:36:00 -0700
committerPaul Davis <paul@linuxaudiosystems.com>2019-12-11 20:36:10 -0700
commit87f4a4afff6c639ddaab2f10dadca72b2ea57704 (patch)
treec8b9be5db6dde25d4c701586927d083a35261162 /libs/ardour/session_transport.cc
parentf78c65984086a182fba325746f5933119d34b81f (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.cc12
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) {