diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-03-16 04:09:03 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-03-16 04:09:03 +0000 |
commit | bca0450c188cdac82fbc74d05b5d72aff9115646 (patch) | |
tree | 688870950203e270b1dbc9baf975daa4c6d0d56c /libs/ardour/session_transport.cc | |
parent | 0b7a7cba788c20d9554ab8aa5b38bacf16e72ab6 (diff) |
possible fix for crash while adding new tracks
git-svn-id: svn://localhost/ardour2/trunk@1603 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/session_transport.cc')
-rw-r--r-- | libs/ardour/session_transport.cc | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc index c0468a63ca..17a6806c52 100644 --- a/libs/ardour/session_transport.cc +++ b/libs/ardour/session_transport.cc @@ -49,10 +49,11 @@ using namespace sigc; using namespace PBD; void -Session::request_input_change_handling () +Session::request_input_change_handling (boost::shared_ptr<Diskstream> ds) { if (!(_state_of_the_state & (InitialConnecting|Deletion))) { Event* ev = new Event (Event::InputConfigurationChange, Event::Add, Event::Immediate, 0, 0.0); + ev->diskstream = ds; queue_event (ev); } } @@ -196,9 +197,27 @@ Session::butler_transport_work () } if (post_transport_work & PostTransportInputChange) { - for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) { - (*i)->non_realtime_input_change (); + { + RCUWriter<DiskstreamList> input_writer (diskstreams_input_pending); + boost::shared_ptr<DiskstreamList> input_list = input_writer.get_copy (); + RCUWriter<DiskstreamList> dswriter (diskstreams); + boost::shared_ptr<DiskstreamList> ds = dswriter.get_copy(); + + for (DiskstreamList::iterator i = input_list->begin(); i != input_list->end(); ++i) { + + /* make the change */ + + (*i)->non_realtime_input_change (); + + /* now transfer it back onto the regular diskstreams list */ + + ds->push_back (*i); + } + + input_list->clear(); } + + diskstreams_input_pending.flush (); } if (post_transport_work & PostTransportSpeed) { |