Implement instrument fan-out options (group, track/bus)
authorRobin Gareus <robin@gareus.org>
Thu, 10 Nov 2016 20:35:40 +0000 (21:35 +0100)
committerRobin Gareus <robin@gareus.org>
Thu, 10 Nov 2016 20:39:20 +0000 (21:39 +0100)
gtk2_ardour/mixer_strip.cc
gtk2_ardour/route_ui.cc
gtk2_ardour/route_ui.h

index 12a0d837ad7424128b39b3738d17e32bf78ccee9..fe31b8a3de9dbdc24b38916b4b104e44c5844b37 100644 (file)
@@ -1698,7 +1698,7 @@ MixerStrip::build_route_ops_menu ()
 
        if (_route->the_instrument () && _route->the_instrument ()->output_streams().n_audio() > 2) {
                // TODO ..->n_audio() > 1 && separate_output_groups) hard to check here every time.
-               items.push_back (MenuElem (_("Fan Out Instrument"), sigc::bind (sigc::mem_fun (*this, &RouteUI::fan_out), false)));
+               items.push_back (MenuElem (_("Fan Out Instrument"), sigc::bind (sigc::mem_fun (*this, &RouteUI::fan_out), true, true)));
        }
 
        items.push_back (SeparatorElem());
index ed8873def77677545f1c271ba0ac4fd1ff7bbfc4..c87cd159c63bb9c01b1760789f255c8ecaf78e26 100644 (file)
@@ -2338,8 +2338,9 @@ RouteUI::manage_pins ()
 }
 
 void
-RouteUI::fan_out (bool to_busses)
+RouteUI::fan_out (bool to_busses, bool group)
 {
+       DisplaySuspender ds;
        boost::shared_ptr<PluginInsert> pi = boost::dynamic_pointer_cast<PluginInsert> (_route->the_instrument ());
        assert (pi);
 
@@ -2373,16 +2374,40 @@ RouteUI::fan_out (bool to_busses)
        _route->output ()->disconnect (this);
        _route->panner_shell ()->set_bypassed (true);
 
+       RouteList to_group;
        for (uint32_t p = 0; p < n_outputs; ++p) {
                const Plugin::IOPortDescription& pd (plugin->describe_io_port (DataType::AUDIO, false, p));
                std::string bn = pi->name () + " " + pd.group_name;
                boost::shared_ptr<Route> r = _session->route_by_name (bn);
                if (!r) {
-                       RouteList rl = _session->new_audio_route (busnames[bn], outputs, NULL, 1, bn, PresentationInfo::AudioBus, PresentationInfo::max_order);
-                       r = rl.front ();
+                       if (to_busses) {
+                               RouteList rl = _session->new_audio_route (busnames[bn], outputs, NULL, 1, bn, PresentationInfo::AudioBus, PresentationInfo::max_order);
+                               r = rl.front ();
+                               assert (r);
+                       } else {
+                               list<boost::shared_ptr<AudioTrack> > tl =
+                                       _session->new_audio_track (busnames[bn], outputs, NULL, 1, bn, PresentationInfo::max_order, Normal);
+                               r = tl.front ();
+                               assert (r);
+
+                               boost::shared_ptr<ControlList> cl (new ControlList);
+                               cl->push_back (r->monitoring_control ());
+                               _session->set_controls (cl, (double) MonitorInput, Controllable::NoGroup);
+                       }
                }
+               to_group.push_back (r);
                _route->output ()->audio (p)->connect (r->input ()->audio (pd.group_channel).get());
        }
+
+       if (group) {
+               RouteGroup* rg = new RouteGroup (*_session, pi->name ());
+               _session->add_route_group (rg);
+               rg->set_gain (false);
+               GroupTabs::set_group_color (rg, _route->presentation_info().color());
+               for (RouteList::const_iterator i = to_group.begin(); i != to_group.end(); ++i) {
+                       rg->add (*i);
+               }
+       }
 }
 
 bool
index 41d11fe6c4f0866c8e6285290d727e4979c689c1..778eb3fd892142d3d896aa54b4b62b0291d99a05 100644 (file)
@@ -208,7 +208,7 @@ class RouteUI : public virtual ARDOUR::SessionHandlePtr, public virtual PBD::Sco
 
        void manage_pins ();
        void maybe_add_route_print_mgr ();
-       void fan_out (bool to_busses = true);
+       void fan_out (bool to_busses = true, bool group = true);
 
        virtual void route_property_changed (const PBD::PropertyChange&) = 0;
        void route_removed ();