From 2d9ed69fe2f8f35d81bb9bc33c8f4fa8393dd00a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 18 Oct 2012 16:15:11 +0000 Subject: change input/output button context menus for mixer strip to be non-additive: when selecting a new IO bundle, disconnect from any existing connections before connecting to the new one (fixes #5087) git-svn-id: svn://localhost/ardour2/branches/3.0@13308 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/io.h | 2 +- libs/ardour/audio_track.cc | 2 +- libs/ardour/io.cc | 10 ++++++++-- libs/ardour/route_group.cc | 2 +- libs/ardour/session.cc | 2 +- 5 files changed, 12 insertions(+), 6 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h index 69297fff04..adad0c753f 100644 --- a/libs/ardour/ardour/io.h +++ b/libs/ardour/ardour/io.h @@ -94,7 +94,7 @@ class IO : public SessionObject, public Latent int ensure_io (ChanCount cnt, bool clear, void *src); - int connect_ports_to_bundle (boost::shared_ptr, void *); + int connect_ports_to_bundle (boost::shared_ptr, bool exclusive, void *); int disconnect_ports_from_bundle (boost::shared_ptr, void *); BundleList bundles_connected (); diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index 2801a4e997..90439f46e9 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -176,7 +176,7 @@ AudioTrack::deprecated_use_diskstream_connections () } } - _input->connect_ports_to_bundle (c, this); + _input->connect_ports_to_bundle (c, true, this); } else if ((prop = node.property ("inputs")) != 0) { if (_input->set_ports (prop->value())) { diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index d39ba7b4f9..38b5fc717d 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -912,7 +912,7 @@ IO::make_connections (const XMLNode& node, int version, bool in) if (prop) { boost::shared_ptr b = find_possible_bundle (prop->value()); if (b) { - connect_ports_to_bundle (b, this); + connect_ports_to_bundle (b, true, this); } } @@ -1241,13 +1241,19 @@ IO::latency () const } int -IO::connect_ports_to_bundle (boost::shared_ptr c, void* src) +IO::connect_ports_to_bundle (boost::shared_ptr c, bool exclusive, void* src) { BLOCK_PROCESS_CALLBACK (); { Glib::Threads::Mutex::Lock lm2 (io_lock); + if (exclusive) { + for (PortSet::iterator i = _ports.begin(); i != _ports.end(); ++i) { + i->disconnect_all (); + } + } + c->connect (_bundle, _session.engine()); /* If this is a UserBundle, make a note of what we've done */ diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc index cb00df724a..ed684d3c9f 100644 --- a/libs/ardour/route_group.cc +++ b/libs/ardour/route_group.cc @@ -502,7 +502,7 @@ RouteGroup::make_subgroup (bool aux, Placement placement) for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { (*i)->output()->disconnect (this); - (*i)->output()->connect_ports_to_bundle (bundle, this); + (*i)->output()->connect_ports_to_bundle (bundle, false, this); } } } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 43fb4b6b5d..3a18b1f7f7 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -725,7 +725,7 @@ Session::add_monitor_section () boost::shared_ptr b = bundle_by_name (Config->get_monitor_bus_preferred_bundle()); if (b) { - _monitor_out->output()->connect_ports_to_bundle (b, this); + _monitor_out->output()->connect_ports_to_bundle (b, true, this); } else { warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"), Config->get_monitor_bus_preferred_bundle()) -- cgit v1.2.3