+}
+
+ostream &
+operator<< (ostream& os, Bundle const & b)
+{
+ os << "BUNDLE " << b.nchannels() << " channels: ";
+ for (uint32_t i = 0; i < b.n_total(); ++i) {
+ os << "( ";
+ Bundle::PortList const & pl = b.channel_ports (i);
+ for (Bundle::PortList::const_iterator j = pl.begin(); j != pl.end(); ++j) {
+ os << *j << " ";
+ }
+ os << ") ";
+ }
+
+ return os;
+}
+
+bool
+Bundle::operator== (Bundle const & other)
+{
+ return _channel == other._channel;
+}
+
+/** Given an index of a channel as the nth channel of a particular type,
+ * return an index of that channel when considering channels of all types.
+ *
+ * e.g. given a bundle with channels:
+ * fred [audio]
+ * jim [audio]
+ * sheila [midi]
+ *
+ * If t == MIDI and c == 0, then we would return 2, as 2 is the index of the
+ * 0th MIDI channel.
+ *
+ * If t == NIL, we just return c.
+ */
+
+uint32_t
+Bundle::type_channel_to_overall (DataType t, uint32_t c) const
+{
+ if (t == DataType::NIL) {
+ return c;
+ }
+
+ Glib::Threads::Mutex::Lock lm (_channel_mutex);
+
+ vector<Channel>::const_iterator i = _channel.begin ();