From 33942e6d5262610b9e62d7a95d144cfa343609a6 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 10 Nov 2016 21:35:40 +0100 Subject: Implement instrument fan-out options (group, track/bus) --- gtk2_ardour/mixer_strip.cc | 2 +- gtk2_ardour/route_ui.cc | 31 ++++++++++++++++++++++++++++--- gtk2_ardour/route_ui.h | 2 +- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 12a0d837ad..fe31b8a3de 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -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()); diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index ed8873def7..c87cd159c6 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -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 pi = boost::dynamic_pointer_cast (_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 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 > tl = + _session->new_audio_track (busnames[bn], outputs, NULL, 1, bn, PresentationInfo::max_order, Normal); + r = tl.front (); + assert (r); + + boost::shared_ptr 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 diff --git a/gtk2_ardour/route_ui.h b/gtk2_ardour/route_ui.h index 41d11fe6c4..778eb3fd89 100644 --- a/gtk2_ardour/route_ui.h +++ b/gtk2_ardour/route_ui.h @@ -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 (); -- cgit v1.2.3