X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fport_group.cc;h=a010b3c184b4be91743ca6820d020e178142c003;hb=7eb91510aa45676360a783355d30338d2cae9586;hp=3b10ff1abf00ec658695deb4ca4ac51f9fac8237;hpb=f450df300c9c057141a4caf79ff6dbfbf58492d9;p=ardour.git diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc index 3b10ff1abf..a010b3c184 100644 --- a/gtk2_ardour/port_group.cc +++ b/gtk2_ardour/port_group.cc @@ -117,7 +117,7 @@ PortGroup::add_bundle_internal (boost::shared_ptr b, boost::shared_ptrChanged.connect (br->changed_connection, ui_bind (&PortGroup::bundle_changed, this, _1), gui_context()); + b->Changed.connect (br->changed_connection, invalidator (*this), ui_bind (&PortGroup::bundle_changed, this, _1), gui_context()); _bundles.push_back (br); Changed (); @@ -207,6 +207,55 @@ PortGroup::io_from_bundle (boost::shared_ptr b) const return (*i)->io; } +/** Remove bundles whose channels are already represented by other, larger bundles */ +void +PortGroup::remove_duplicates () +{ + BundleList::iterator i = _bundles.begin(); + while (i != _bundles.end()) { + + BundleList::iterator tmp = i; + ++tmp; + + bool remove = false; + + for (BundleList::iterator j = _bundles.begin(); j != _bundles.end(); ++j) { + + if ((*j)->bundle->nchannels() > (*i)->bundle->nchannels()) { + /* this bundle is larger */ + + uint32_t k = 0; + while (k < (*i)->bundle->nchannels()) { + /* see if this channel on *i has an equivalent on *j */ + uint32_t l = 0; + while (l < (*j)->bundle->nchannels() && (*i)->bundle->channel_ports (k) != (*j)->bundle->channel_ports (l)) { + ++l; + } + + if (l == (*j)->bundle->nchannels()) { + /* it does not */ + break; + } + + ++k; + } + + if (k == (*i)->bundle->nchannels ()) { + /* all channels on *i are represented by the larger bundle *j, so remove *i */ + remove = true; + break; + } + } + } + + if (remove) { + _bundles.erase (i); + } + + i = tmp; + } +} + /** PortGroupList constructor. */ @@ -373,6 +422,16 @@ PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups) !track->has_port(p) && !ardour->has_port(p) && !other->has_port(p)) { + + /* special hack: ignore MIDI ports labelled Midi-Through. these + are basically useless and mess things up for default + connections. + */ + + if (p.find ("MIDI-Through") != string::npos) { + ++n; + continue; + } if (port_has_prefix (p, "system:") || port_has_prefix (p, "alsa_pcm") || @@ -398,11 +457,15 @@ PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups) other->add_bundle (make_bundle_from_ports (extra_other, inputs)); } - add_group_if_not_empty (system); + if (!allow_dups) { + system->remove_duplicates (); + } + + add_group_if_not_empty (other); add_group_if_not_empty (bus); add_group_if_not_empty (track); add_group_if_not_empty (ardour); - add_group_if_not_empty (other); + add_group_if_not_empty (system); emit_changed (); } @@ -522,8 +585,8 @@ PortGroupList::add_group (boost::shared_ptr g) { _groups.push_back (g); - g->Changed.connect (_changed_connections, boost::bind (&PortGroupList::emit_changed, this), gui_context()); - g->BundleChanged.connect (_bundle_changed_connections, ui_bind (&PortGroupList::emit_bundle_changed, this, _1), gui_context()); + g->Changed.connect (_changed_connections, invalidator (*this), boost::bind (&PortGroupList::emit_changed, this), gui_context()); + g->BundleChanged.connect (_bundle_changed_connections, invalidator (*this), ui_bind (&PortGroupList::emit_bundle_changed, this, _1), gui_context()); emit_changed (); }