#include "ardour/session.h"
#include "ardour/auditioner.h"
+#include "gui_thread.h"
#include "port_group.h"
#include "port_matrix.h"
#include "time_axis_view.h"
}
BundleRecord* br = new BundleRecord (b, io, colour, has_colour);
- br->changed_connection = b->Changed.connect (boost::bind (&PortGroup::bundle_changed, this, _1));
+ 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.
*/
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 (sigc::mem_fun (*this, &PortGroupList::emit_changed));
-
- _bundle_changed_connections.add_connection (g->BundleChanged.connect (sigc::mem_fun (*this, &PortGroupList::emit_bundle_changed)));
+ 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 ();
}