use process lock to lock out process() during playback buffer resizing
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 12 Dec 2019 03:36:00 +0000 (20:36 -0700)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 12 Dec 2019 03:36:10 +0000 (20:36 -0700)
libs/ardour/session_butler.cc
libs/ardour/session_transport.cc

index 0744df6233e674428869909c647b8759c26a891e..143c9d540d65101b031278172fb24bbcf59baff9 100644 (file)
@@ -66,7 +66,6 @@ void
 Session::schedule_playback_buffering_adjustment ()
 {
        add_post_transport_work (PostTransportAdjustPlaybackBuffering);
-       DiskReader::inc_no_disk_output ();
        _butler->schedule_transport_work ();
 }
 
index 2c93e10d47ae676238a480b0d5776981e3bc756f..e41eb59a0fee1e44efd4e511686e8c115b359e6a 100644 (file)
@@ -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) {