change input/output button context menus for mixer strip to be non-additive: when...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 18 Oct 2012 16:15:11 +0000 (16:15 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 18 Oct 2012 16:15:11 +0000 (16:15 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@13308 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_strip.h
libs/ardour/ardour/io.h
libs/ardour/audio_track.cc
libs/ardour/io.cc
libs/ardour/route_group.cc
libs/ardour/session.cc

index 848439ccd1607a4b0fd74b39e8eab8f25c470a72..c4410438f93be6f319f32478f77eeb4c6597188f 100644 (file)
@@ -874,7 +874,7 @@ MixerStrip::input_press (GdkEventButton *ev)
 }
 
 void
-MixerStrip::bundle_input_toggled (boost::shared_ptr<ARDOUR::Bundle> c)
+MixerStrip::bundle_input_chosen (boost::shared_ptr<ARDOUR::Bundle> c)
 {
        if (ignore_toggle) {
                return;
@@ -883,14 +883,14 @@ MixerStrip::bundle_input_toggled (boost::shared_ptr<ARDOUR::Bundle> c)
        ARDOUR::BundleList current = _route->input()->bundles_connected ();
 
        if (std::find (current.begin(), current.end(), c) == current.end()) {
-               _route->input()->connect_ports_to_bundle (c, this);
+               _route->input()->connect_ports_to_bundle (c, true, this);
        } else {
                _route->input()->disconnect_ports_from_bundle (c, this);
        }
 }
 
 void
-MixerStrip::bundle_output_toggled (boost::shared_ptr<ARDOUR::Bundle> c)
+MixerStrip::bundle_output_chosen (boost::shared_ptr<ARDOUR::Bundle> c)
 {
        if (ignore_toggle) {
                return;
@@ -899,7 +899,7 @@ MixerStrip::bundle_output_toggled (boost::shared_ptr<ARDOUR::Bundle> c)
        ARDOUR::BundleList current = _route->output()->bundles_connected ();
 
        if (std::find (current.begin(), current.end(), c) == current.end()) {
-               _route->output()->connect_ports_to_bundle (c, this);
+               _route->output()->connect_ports_to_bundle (c, true, this);
        } else {
                _route->output()->disconnect_ports_from_bundle (c, this);
        }
@@ -930,13 +930,7 @@ MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr<Bundle> b, ARDOUR:
        std::string n = b->name ();
        replace_all (n, "_", " ");
 
-       citems.push_back (CheckMenuElem (n, sigc::bind (sigc::mem_fun(*this, &MixerStrip::bundle_input_toggled), b)));
-
-       if (std::find (current.begin(), current.end(), b) != current.end()) {
-               ignore_toggle = true;
-               dynamic_cast<CheckMenuItem *> (&citems.back())->set_active (true);
-               ignore_toggle = false;
-       }
+       citems.push_back (MenuElem (n, sigc::bind (sigc::mem_fun(*this, &MixerStrip::bundle_input_chosen), b)));
 }
 
 void
@@ -964,13 +958,7 @@ MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR
        std::string n = b->name ();
        replace_all (n, "_", " ");
 
-       citems.push_back (CheckMenuElem (n, sigc::bind (sigc::mem_fun(*this, &MixerStrip::bundle_output_toggled), b)));
-
-       if (std::find (current.begin(), current.end(), b) != current.end()) {
-               ignore_toggle = true;
-               dynamic_cast<CheckMenuItem *> (&citems.back())->set_active (true);
-               ignore_toggle = false;
-       }
+       citems.push_back (MenuElem (n, sigc::bind (sigc::mem_fun(*this, &MixerStrip::bundle_output_chosen), b)));
 }
 
 void
index e5df59565c647b288637b79740d78881939385a6..eb29bdbf97337bda2a85a63b9759dcb412bfb061 100644 (file)
@@ -219,8 +219,8 @@ class MixerStrip : public RouteUI, public Gtk::EventBox
        std::list<boost::shared_ptr<ARDOUR::Bundle> > output_menu_bundles;
        void maybe_add_bundle_to_output_menu (boost::shared_ptr<ARDOUR::Bundle>, ARDOUR::BundleList const &);
 
-       void bundle_input_toggled (boost::shared_ptr<ARDOUR::Bundle>);
-       void bundle_output_toggled (boost::shared_ptr<ARDOUR::Bundle>);
+       void bundle_input_chosen (boost::shared_ptr<ARDOUR::Bundle>);
+       void bundle_output_chosen (boost::shared_ptr<ARDOUR::Bundle>);
 
        void edit_input_configuration ();
        void edit_output_configuration ();
index 69297fff0452dff75a4d070e0aafd5e79ff33e18..adad0c753fa1036f1a2e8474530e8b5a2e9d040b 100644 (file)
@@ -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<Bundle>, void *);
+        int connect_ports_to_bundle (boost::shared_ptr<Bundle>, bool exclusive, void *);
        int disconnect_ports_from_bundle (boost::shared_ptr<Bundle>, void *);
 
        BundleList bundles_connected ();
index 2801a4e99780bd107f1b0e6654cec8411378332b..90439f46e907eadd5ff5e66e1f545ce4ba95cd31 100644 (file)
@@ -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())) {
index d39ba7b4f967851dc30acdde4437a639ceb61439..38b5fc717d8d57e16bc37f2094d9f6704493548b 100644 (file)
@@ -912,7 +912,7 @@ IO::make_connections (const XMLNode& node, int version, bool in)
                        if (prop) {
                                boost::shared_ptr<Bundle> 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<Bundle> c, void* src)
+IO::connect_ports_to_bundle (boost::shared_ptr<Bundle> 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 */
index cb00df724a6f65a2dc3fe7e61f737bb4a7860c15..ed684d3c9fe2619b74458f88d57f0b5731a13984 100644 (file)
@@ -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);
                }
        }
 }
index 43fb4b6b5d88edff70490671e7b3b0a0565060f7..3a18b1f7f7978ee594970847bbaef5889fc75f18 100644 (file)
@@ -725,7 +725,7 @@ Session::add_monitor_section ()
                        boost::shared_ptr<Bundle> 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())