+
+ if (exclusive && p) {
+ port_connections.clear();
+ p->get_connections(port_connections);
+ if (port_connections.size() != other_ports.size())
+ return false;
+ }
+ }
+ }
+
+ return true;
+}
+
+/** This must not be called in code executed as a response to a backend event,
+ * as it uses the backend port_get_all_connections().
+ * @return true if any of this bundle's channels are connected to anything.
+ */
+bool
+Bundle::connected_to_anything (AudioEngine& engine)
+{
+ PortManager& pm (engine);
+
+ for (uint32_t i = 0; i < n_total(); ++i) {
+ Bundle::PortList const & ports = channel_ports (i);
+
+ for (uint32_t j = 0; j < ports.size(); ++j) {
+
+ /* ports[j] may not be an Ardour port, so use the port manager directly
+ rather than doing it with Port.
+ */
+
+ if (pm.connected (ports[j])) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+void
+Bundle::set_ports_are_inputs ()
+{
+ _ports_are_inputs = true;
+ emit_changed (DirectionChanged);
+}
+
+void
+Bundle::set_ports_are_outputs ()
+{
+ _ports_are_inputs = false;
+ emit_changed (DirectionChanged);
+}
+
+/** Set the name.
+ * @param n New name.
+ */
+void
+Bundle::set_name (string const & n)
+{
+ _name = n;
+ emit_changed (NameChanged);
+}
+
+/** @param b Other bundle.
+ * @return true if b has the same number of channels as this bundle, and those channels have corresponding ports.
+ */
+bool
+Bundle::has_same_ports (boost::shared_ptr<Bundle> b) const
+{
+ ChanCount our_count = nchannels();
+ ChanCount other_count = b->nchannels();
+
+ if (our_count != other_count)
+ return false;
+
+ for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
+ uint32_t N = our_count.n(*t);
+ for (uint32_t i = 0; i < N; ++i) {
+ Bundle::PortList const & our_ports =
+ channel_ports (type_channel_to_overall(*t, i));
+ Bundle::PortList const & other_ports =
+ b->channel_ports (b->type_channel_to_overall(*t, i));
+
+ if (our_ports != other_ports)
+ return false;