diff options
-rw-r--r-- | gtk2_ardour/mixer_strip.cc | 24 | ||||
-rw-r--r-- | gtk2_ardour/mixer_strip.h | 3 |
2 files changed, 23 insertions, 4 deletions
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 7bb51f99b5..f459237000 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -1118,23 +1118,41 @@ MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr<Bundle> b, ARDOUR: } void -MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR::BundleList const& /*current*/) +MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR::BundleList const& /*current*/, + DataType type) { using namespace Menu_Helpers; - if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs() || *b == *_route->input()->bundle()) { + /* The bundle should be an input one, but not ours */ + if (b->ports_are_inputs() == false || *b == *_route->input()->bundle()) { return; } + /* Don't add the monitor input unless we are Master */ + boost::shared_ptr<Route> monitor = _session->monitor_out(); + if ((!_route->is_master()) && monitor && b->has_same_ports (monitor->input()->bundle())) + return; + + /* It should either match exactly our outputs (if |type| is DataType::NIL) + * or have the same number of |type| channels than our outputs. */ + if (type == DataType::NIL) { + if(b->nchannels() != _route->n_outputs()) + return; + } else { + if (b->nchannels().n(type) != _route->n_outputs().n(type)) + return; + } + + /* Avoid adding duplicates */ list<boost::shared_ptr<Bundle> >::iterator i = output_menu_bundles.begin (); while (i != output_menu_bundles.end() && b->has_same_ports (*i) == false) { ++i; } - if (i != output_menu_bundles.end()) { return; } + /* Now add the bundle to the menu */ output_menu_bundles.push_back (b); MenuList& citems = output_menu.items(); diff --git a/gtk2_ardour/mixer_strip.h b/gtk2_ardour/mixer_strip.h index 6b5553d6bb..e4cecf3586 100644 --- a/gtk2_ardour/mixer_strip.h +++ b/gtk2_ardour/mixer_strip.h @@ -236,7 +236,8 @@ private: Gtk::Menu output_menu; 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 maybe_add_bundle_to_output_menu (boost::shared_ptr<ARDOUR::Bundle>, ARDOUR::BundleList const &, + ARDOUR::DataType type = ARDOUR::DataType::NIL); void bundle_input_chosen (boost::shared_ptr<ARDOUR::Bundle>); void bundle_output_chosen (boost::shared_ptr<ARDOUR::Bundle>); |