}
BundleRecord* br = new BundleRecord (b, io, colour, has_colour);
- b->Changed.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 ();
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.
*/
!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") ||
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 ();
}
{
_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 ();
}