summaryrefslogtreecommitdiff
path: root/libs/ardour/session_transport.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2007-03-16 04:09:03 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2007-03-16 04:09:03 +0000
commitbca0450c188cdac82fbc74d05b5d72aff9115646 (patch)
tree688870950203e270b1dbc9baf975daa4c6d0d56c /libs/ardour/session_transport.cc
parent0b7a7cba788c20d9554ab8aa5b38bacf16e72ab6 (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.cc25
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) {