summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/bundle_manager.cc44
-rw-r--r--gtk2_ardour/bundle_manager.h2
-rw-r--r--gtk2_ardour/global_port_matrix.cc2
-rw-r--r--gtk2_ardour/io_selector.cc2
-rw-r--r--gtk2_ardour/mixer_strip.cc10
-rw-r--r--gtk2_ardour/port_group.cc82
-rw-r--r--gtk2_ardour/port_group.h10
-rw-r--r--gtk2_ardour/port_matrix.cc50
-rw-r--r--gtk2_ardour/port_matrix_body.cc7
-rw-r--r--gtk2_ardour/port_matrix_column_labels.cc26
-rw-r--r--gtk2_ardour/port_matrix_component.cc6
-rw-r--r--gtk2_ardour/port_matrix_grid.cc32
-rw-r--r--gtk2_ardour/port_matrix_row_labels.cc25
-rw-r--r--gtk2_ardour/session_option_editor.cc2
-rw-r--r--libs/ardour/ardour/bundle.h20
-rw-r--r--libs/ardour/bundle.cc98
-rw-r--r--libs/ardour/io.cc16
-rw-r--r--libs/ardour/session.cc12
-rw-r--r--libs/ardour/user_bundle.cc9
19 files changed, 217 insertions, 238 deletions
diff --git a/gtk2_ardour/bundle_manager.cc b/gtk2_ardour/bundle_manager.cc
index ba00cce9d0..66e985e808 100644
--- a/gtk2_ardour/bundle_manager.cc
+++ b/gtk2_ardour/bundle_manager.cc
@@ -37,7 +37,7 @@ using namespace std;
using namespace ARDOUR;
BundleEditorMatrix::BundleEditorMatrix (Gtk::Window* parent, Session* session, boost::shared_ptr<Bundle> bundle)
- : PortMatrix (parent, session, bundle->type())
+ : PortMatrix (parent, session, DataType::NIL)
, _bundle (bundle)
{
_port_group = boost::shared_ptr<PortGroup> (new PortGroup (""));
@@ -60,7 +60,7 @@ BundleEditorMatrix::setup_ports (int dim)
otherwise in some cases the basic system IO ports may be hidden, making
the bundle editor useless */
- _ports[OTHER].gather (_session, _bundle->ports_are_inputs(), true);
+ _ports[OTHER].gather (_session, DataType::NIL, _bundle->ports_are_inputs(), true);
_ports[OTHER].remove_bundle (_bundle);
_ports[OTHER].resume_signals ();
}
@@ -118,7 +118,8 @@ BundleEditorMatrix::add_channel (boost::shared_ptr<Bundle> b)
return;
}
- _bundle->add_channel (d.get_name());
+ /* XXX: allow user to specify type */
+ _bundle->add_channel (d.get_name(), DataType::AUDIO);
setup_ports (OURS);
} else {
@@ -212,28 +213,6 @@ BundleEditor::BundleEditor (Session* session, boost::shared_ptr<UserBundle> bund
_input_or_output.signal_changed().connect (sigc::mem_fun (*this, &BundleEditor::input_or_output_changed));
- /* Type (audio or MIDI) */
- a = new Gtk::Alignment (1, 0.5, 0, 1);
- a->add (*Gtk::manage (new Gtk::Label (_("Type:"))));
- t->attach (*Gtk::manage (a), 0, 1, 2, 3, Gtk::FILL, Gtk::FILL);
- a = new Gtk::Alignment (0, 0.5, 0, 1);
- a->add (_type);
- t->attach (*Gtk::manage (a), 1, 2, 2, 3);
-
- _type.append_text (_("Audio"));
- _type.append_text (_("MIDI"));
-
- switch (bundle->type ()) {
- case DataType::AUDIO:
- _type.set_active_text (_("Audio"));
- break;
- case DataType::MIDI:
- _type.set_active_text (_("MIDI"));
- break;
- }
-
- _type.signal_changed().connect (sigc::mem_fun (*this, &BundleEditor::type_changed));
-
get_vbox()->pack_start (*Gtk::manage (t), false, false);
get_vbox()->pack_start (_matrix);
get_vbox()->set_spacing (4);
@@ -271,18 +250,6 @@ BundleEditor::input_or_output_changed ()
}
void
-BundleEditor::type_changed ()
-{
- _bundle->remove_ports_from_channels ();
-
- DataType const t = _type.get_active_text() == _("Audio") ?
- DataType::AUDIO : DataType::MIDI;
-
- _bundle->set_type (t);
- _matrix.set_type (t);
-}
-
-void
BundleEditor::on_map ()
{
_matrix.setup_all_ports ();
@@ -360,7 +327,8 @@ BundleManager::new_clicked ()
boost::shared_ptr<UserBundle> b (new UserBundle (_("Bundle")));
/* Start off with a single channel */
- b->add_channel ("1");
+ /* XXX: allow user to specify type */
+ b->add_channel ("1", DataType::AUDIO);
_session->add_bundle (b);
add_bundle (b);
diff --git a/gtk2_ardour/bundle_manager.h b/gtk2_ardour/bundle_manager.h
index c2c30d47bb..0bad5b2108 100644
--- a/gtk2_ardour/bundle_manager.h
+++ b/gtk2_ardour/bundle_manager.h
@@ -72,14 +72,12 @@ class BundleEditor : public ArdourDialog
private:
void name_changed ();
void input_or_output_changed ();
- void type_changed ();
void on_show ();
BundleEditorMatrix _matrix;
boost::shared_ptr<ARDOUR::UserBundle> _bundle;
Gtk::Entry _name;
Gtk::ComboBoxText _input_or_output;
- Gtk::ComboBoxText _type;
};
class BundleManager : public ArdourDialog
diff --git a/gtk2_ardour/global_port_matrix.cc b/gtk2_ardour/global_port_matrix.cc
index 510d3b3ce3..49e2673263 100644
--- a/gtk2_ardour/global_port_matrix.cc
+++ b/gtk2_ardour/global_port_matrix.cc
@@ -42,7 +42,7 @@ void
GlobalPortMatrix::setup_ports (int dim)
{
_ports[dim].suspend_signals ();
- _ports[dim].gather (_session, dim == IN, false);
+ _ports[dim].gather (_session, type(), dim == IN, false);
_ports[dim].resume_signals ();
}
diff --git a/gtk2_ardour/io_selector.cc b/gtk2_ardour/io_selector.cc
index 913fa6dafe..cc5ae58224 100644
--- a/gtk2_ardour/io_selector.cc
+++ b/gtk2_ardour/io_selector.cc
@@ -76,7 +76,7 @@ IOSelector::setup_ports (int dim)
if (dim == _other) {
- _ports[_other].gather (_session, _find_inputs_for_io_outputs, false);
+ _ports[_other].gather (_session, type(), _find_inputs_for_io_outputs, false);
} else {
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index a7cb17b0db..48f44cadf4 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -868,10 +868,7 @@ MixerStrip::maybe_add_bundle_to_input_menu (boost::shared_ptr<Bundle> b, ARDOUR:
{
using namespace Menu_Helpers;
- if (b->ports_are_outputs() == false ||
- route()->input()->default_type() != b->type() ||
- b->nchannels() != _route->n_inputs().get (b->type ())) {
-
+ if (b->ports_are_outputs() == false || b->nchannels() != _route->n_inputs()) {
return;
}
@@ -905,10 +902,7 @@ MixerStrip::maybe_add_bundle_to_output_menu (boost::shared_ptr<Bundle> b, ARDOUR
{
using namespace Menu_Helpers;
- if (b->ports_are_inputs() == false ||
- route()->output()->default_type() != b->type() ||
- b->nchannels() != _route->n_outputs().get (b->type ())) {
-
+ if (b->ports_are_inputs() == false || b->nchannels() != _route->n_outputs()) {
return;
}
diff --git a/gtk2_ardour/port_group.cc b/gtk2_ardour/port_group.cc
index a010b3c184..ffa27d783a 100644
--- a/gtk2_ardour/port_group.cc
+++ b/gtk2_ardour/port_group.cc
@@ -181,10 +181,10 @@ PortGroup::only_bundle ()
}
-uint32_t
+ChanCount
PortGroup::total_channels () const
{
- uint32_t n = 0;
+ ChanCount n;
for (BundleList::const_iterator i = _bundles.begin(); i != _bundles.end(); ++i) {
n += (*i)->bundle->nchannels ();
}
@@ -225,14 +225,14 @@ PortGroup::remove_duplicates ()
/* this bundle is larger */
uint32_t k = 0;
- while (k < (*i)->bundle->nchannels()) {
+ while (k < (*i)->bundle->nchannels().n_total()) {
/* 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)) {
+ while (l < (*j)->bundle->nchannels().n_total() && (*i)->bundle->channel_ports (k) != (*j)->bundle->channel_ports (l)) {
++l;
}
- if (l == (*j)->bundle->nchannels()) {
+ if (l == (*j)->bundle->nchannels().n_total()) {
/* it does not */
break;
}
@@ -240,7 +240,7 @@ PortGroup::remove_duplicates ()
++k;
}
- if (k == (*i)->bundle->nchannels ()) {
+ if (k == (*i)->bundle->nchannels().n_total()) {
/* all channels on *i are represented by the larger bundle *j, so remove *i */
remove = true;
break;
@@ -260,7 +260,7 @@ PortGroup::remove_duplicates ()
/** PortGroupList constructor.
*/
PortGroupList::PortGroupList ()
- : _type (DataType::AUDIO), _signals_suspended (false), _pending_change (false), _pending_bundle_change ((Bundle::Change) 0)
+ : _signals_suspended (false), _pending_change (false), _pending_bundle_change ((Bundle::Change) 0)
{
}
@@ -271,13 +271,6 @@ PortGroupList::~PortGroupList()
}
void
-PortGroupList::set_type (DataType t)
-{
- _type = t;
- clear ();
-}
-
-void
PortGroupList::maybe_add_processor_to_list (
boost::weak_ptr<Processor> wp, list<boost::shared_ptr<Bundle> >* route_bundles, bool inputs, set<boost::shared_ptr<IO> >& used_io
)
@@ -304,7 +297,7 @@ PortGroupList::maybe_add_processor_to_list (
/** Gather bundles from around the system and put them in this PortGroupList */
void
-PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups)
+PortGroupList::gather (ARDOUR::Session* session, ARDOUR::DataType type, bool inputs, bool allow_dups)
{
clear ();
@@ -342,33 +335,18 @@ PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups)
/* Work out which group to put these bundles in */
boost::shared_ptr<PortGroup> g;
- if (_type == DataType::AUDIO) {
-
- if (boost::dynamic_pointer_cast<AudioTrack> (*i)) {
- g = track;
- } else if (!boost::dynamic_pointer_cast<MidiTrack>(*i)) {
- g = bus;
- }
-
-
- } else if (_type == DataType::MIDI) {
-
- if (boost::dynamic_pointer_cast<MidiTrack> (*i)) {
- g = track;
- }
-
- /* No MIDI busses yet */
+ if (boost::dynamic_pointer_cast<Track> (*i)) {
+ g = track;
+ } else {
+ g = bus;
}
- if (g) {
-
- TimeAxisView* tv = PublicEditor::instance().axis_view_from_route (*i);
- for (list<boost::shared_ptr<Bundle> >::iterator i = route_bundles.begin(); i != route_bundles.end(); ++i) {
- if (tv) {
- g->add_bundle (*i, io, tv->color ());
- } else {
- g->add_bundle (*i, io);
- }
+ TimeAxisView* tv = PublicEditor::instance().axis_view_from_route (*i);
+ for (list<boost::shared_ptr<Bundle> >::iterator i = route_bundles.begin(); i != route_bundles.end(); ++i) {
+ if (tv) {
+ g->add_bundle (*i, io, tv->color ());
+ } else {
+ g->add_bundle (*i, io);
}
}
}
@@ -380,20 +358,20 @@ PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups)
boost::shared_ptr<BundleList> b = session->bundles ();
for (BundleList::iterator i = b->begin(); i != b->end(); ++i) {
- if (boost::dynamic_pointer_cast<UserBundle> (*i) && (*i)->ports_are_inputs() == inputs && (*i)->type() == _type) {
+ if (boost::dynamic_pointer_cast<UserBundle> (*i) && (*i)->ports_are_inputs() == inputs) {
system->add_bundle (*i, allow_dups);
}
}
for (BundleList::iterator i = b->begin(); i != b->end(); ++i) {
- if (boost::dynamic_pointer_cast<UserBundle> (*i) == 0 && (*i)->ports_are_inputs() == inputs && (*i)->type() == _type) {
+ if (boost::dynamic_pointer_cast<UserBundle> (*i) == 0 && (*i)->ports_are_inputs() == inputs) {
system->add_bundle (*i, allow_dups);
}
}
/* Ardour stuff */
- if (!inputs && _type == DataType::AUDIO) {
+ if (!inputs && type == DataType::AUDIO) {
ardour->add_bundle (session->the_auditioner()->output()->bundle());
ardour->add_bundle (session->click_io()->bundle());
}
@@ -403,7 +381,7 @@ PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups)
std::vector<std::string> extra_system;
std::vector<std::string> extra_other;
- const char **ports = session->engine().get_ports ("", _type.to_jack_type(), inputs ?
+ const char **ports = session->engine().get_ports ("", type.to_jack_type(), inputs ?
JackPortIsInput : JackPortIsOutput);
if (ports) {
@@ -449,12 +427,12 @@ PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups)
}
if (!extra_system.empty()) {
- boost::shared_ptr<Bundle> b = make_bundle_from_ports (extra_system, inputs);
+ boost::shared_ptr<Bundle> b = make_bundle_from_ports (extra_system, type, inputs);
system->add_bundle (b);
}
if (!extra_other.empty()) {
- other->add_bundle (make_bundle_from_ports (extra_other, inputs));
+ other->add_bundle (make_bundle_from_ports (extra_other, type, inputs));
}
if (!allow_dups) {
@@ -471,9 +449,9 @@ PortGroupList::gather (ARDOUR::Session* session, bool inputs, bool allow_dups)
}
boost::shared_ptr<Bundle>
-PortGroupList::make_bundle_from_ports (std::vector<std::string> const & p, bool inputs) const
+PortGroupList::make_bundle_from_ports (std::vector<std::string> const & p, ARDOUR::DataType type, bool inputs) const
{
- boost::shared_ptr<Bundle> b (new Bundle ("", _type, inputs));
+ boost::shared_ptr<Bundle> b (new Bundle ("", inputs));
std::string const pre = common_prefix (p);
if (!pre.empty()) {
@@ -481,7 +459,7 @@ PortGroupList::make_bundle_from_ports (std::vector<std::string> const & p, bool
}
for (uint32_t j = 0; j < p.size(); ++j) {
- b->add_channel (p[j].substr (pre.length()));
+ b->add_channel (p[j].substr (pre.length()), type);
b->set_port (j, p[j]);
}
@@ -560,10 +538,10 @@ PortGroupList::bundles () const
return _bundles;
}
-uint32_t
+ChanCount
PortGroupList::total_channels () const
{
- uint32_t n = 0;
+ ChanCount n;
for (PortGroupList::List::const_iterator i = begin(); i != end(); ++i) {
n += (*i)->total_channels ();
@@ -661,7 +639,7 @@ bool
PortGroupList::empty () const
{
List::const_iterator i = _groups.begin ();
- while (i != _groups.end() && (*i)->total_channels() == 0) {
+ while (i != _groups.end() && (*i)->total_channels() == ChanCount::ZERO) {
++i;
}
diff --git a/gtk2_ardour/port_group.h b/gtk2_ardour/port_group.h
index 17d1963e19..f8955337a2 100644
--- a/gtk2_ardour/port_group.h
+++ b/gtk2_ardour/port_group.h
@@ -58,7 +58,7 @@ public:
void remove_bundle (boost::shared_ptr<ARDOUR::Bundle>);
boost::shared_ptr<ARDOUR::Bundle> only_bundle ();
void clear ();
- uint32_t total_channels () const;
+ ARDOUR::ChanCount total_channels () const;
boost::shared_ptr<ARDOUR::IO> io_from_bundle (boost::shared_ptr<ARDOUR::Bundle>) const;
void remove_duplicates ();
@@ -108,12 +108,11 @@ class PortGroupList : public sigc::trackable
void add_group (boost::shared_ptr<PortGroup>);
void add_group_if_not_empty (boost::shared_ptr<PortGroup>);
- void set_type (ARDOUR::DataType);
- void gather (ARDOUR::Session *, bool, bool);
+ void gather (ARDOUR::Session *, ARDOUR::DataType, bool, bool);
PortGroup::BundleList const & bundles () const;
void clear ();
void remove_bundle (boost::shared_ptr<ARDOUR::Bundle>);
- uint32_t total_channels () const;
+ ARDOUR::ChanCount total_channels () const;
uint32_t size () const {
return _groups.size();
}
@@ -144,12 +143,11 @@ class PortGroupList : public sigc::trackable
std::string common_prefix_before (std::vector<std::string> const &, std::string const &) const;
void emit_changed ();
void emit_bundle_changed (ARDOUR::Bundle::Change);
- boost::shared_ptr<ARDOUR::Bundle> make_bundle_from_ports (std::vector<std::string> const &, bool) const;
+ boost::shared_ptr<ARDOUR::Bundle> make_bundle_from_ports (std::vector<std::string> const &, ARDOUR::DataType, bool) const;
void maybe_add_processor_to_list (
boost::weak_ptr<ARDOUR::Processor>, std::list<boost::shared_ptr<ARDOUR::Bundle> > *, bool, std::set<boost::shared_ptr<ARDOUR::IO> > &
);
- ARDOUR::DataType _type;
mutable PortGroup::BundleList _bundles;
List _groups;
PBD::ScopedConnectionList _bundle_changed_connections;
diff --git a/gtk2_ardour/port_matrix.cc b/gtk2_ardour/port_matrix.cc
index 73e937e840..dc7730c823 100644
--- a/gtk2_ardour/port_matrix.cc
+++ b/gtk2_ardour/port_matrix.cc
@@ -77,10 +77,6 @@ PortMatrix::PortMatrix (Window* parent, Session* session, DataType type)
_hnotebook.property_tab_border() = 4;
_hnotebook.set_name (X_("PortMatrixLabel"));
- for (int i = 0; i < 2; ++i) {
- _ports[i].set_type (type);
- }
-
_vlabel.set_use_markup ();
_vlabel.set_alignment (1, 1);
_vlabel.set_padding (4, 16);
@@ -217,8 +213,6 @@ void
PortMatrix::set_type (DataType t)
{
_type = t;
- _ports[0].set_type (_type);
- _ports[1].set_type (_type);
setup_all_ports ();
}
@@ -261,9 +255,13 @@ PortMatrix::disassociate_all ()
PortGroup::BundleList b = _ports[1].bundles ();
for (PortGroup::BundleList::iterator i = a.begin(); i != a.end(); ++i) {
- for (uint32_t j = 0; j < (*i)->bundle->nchannels(); ++j) {
+ for (uint32_t j = 0; j < (*i)->bundle->nchannels().n_total(); ++j) {
for (PortGroup::BundleList::iterator k = b.begin(); k != b.end(); ++k) {
- for (uint32_t l = 0; l < (*k)->bundle->nchannels(); ++l) {
+ for (uint32_t l = 0; l < (*k)->bundle->nchannels().n_total(); ++l) {
+
+ if ((*i)->bundle->channel_type(j) != _type || (*k)->bundle->channel_type(l) != _type) {
+ continue;
+ }
BundleChannel c[2] = {
BundleChannel ((*i)->bundle, j),
@@ -287,8 +285,8 @@ void
PortMatrix::select_arrangement ()
{
uint32_t const N[2] = {
- _ports[0].total_channels (),
- _ports[1].total_channels ()
+ _ports[0].total_channels().get(_type),
+ _ports[1].total_channels().get(_type)
};
/* The list with the most channels goes on left or right, so that the most channel
@@ -426,13 +424,15 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t)
MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::remove_all_channels), w))
);
- for (uint32_t i = 0; i < bc[dim].bundle->nchannels(); ++i) {
- add_remove_option (sub, w, i);
+ for (uint32_t i = 0; i < bc[dim].bundle->nchannels().n_total(); ++i) {
+ if (bc[dim].bundle->channel_type(i) == _type) {
+ add_remove_option (sub, w, i);
+ }
}
}
}
- if (_show_only_bundles || bc[dim].bundle->nchannels() <= 1) {
+ if (_show_only_bundles || bc[dim].bundle->nchannels().get(_type) <= 1) {
snprintf (buf, sizeof (buf), _("%s all"), disassociation_verb().c_str());
sub.push_back (
MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::disassociate_all_on_channel), w, bc[dim].channel, dim))
@@ -448,8 +448,10 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t)
MenuElem (buf, sigc::bind (sigc::mem_fun (*this, &PortMatrix::disassociate_all_on_bundle), w, dim))
);
- for (uint32_t i = 0; i < bc[dim].bundle->nchannels(); ++i) {
- add_disassociate_option (sub, w, dim, i);
+ for (uint32_t i = 0; i < bc[dim].bundle->nchannels().n_total(); ++i) {
+ if (bc[dim].bundle->channel_type(i) == _type) {
+ add_disassociate_option (sub, w, dim, i);
+ }
}
}
}
@@ -505,8 +507,10 @@ PortMatrix::disassociate_all_on_bundle (boost::weak_ptr<Bundle> bundle, int dim)
return;
}
- for (uint32_t i = 0; i < sb->nchannels(); ++i) {
- disassociate_all_on_channel (bundle, i, dim);
+ for (uint32_t i = 0; i < sb->nchannels().n_total(); ++i) {
+ if (sb->channel_type(i) == _type) {
+ disassociate_all_on_channel (bundle, i, dim);
+ }
}
}
@@ -521,7 +525,11 @@ PortMatrix::disassociate_all_on_channel (boost::weak_ptr<Bundle> bundle, uint32_
PortGroup::BundleList a = _ports[1-dim].bundles ();
for (PortGroup::BundleList::iterator i = a.begin(); i != a.end(); ++i) {
- for (uint32_t j = 0; j < (*i)->bundle->nchannels(); ++j) {
+ for (uint32_t j = 0; j < (*i)->bundle->nchannels().n_total(); ++j) {
+
+ if ((*i)->bundle->channel_type(j) != _type) {
+ continue;
+ }
BundleChannel c[2];
c[dim] = BundleChannel (sb, channel);
@@ -662,8 +670,10 @@ PortMatrix::remove_all_channels (boost::weak_ptr<Bundle> w)
return;
}
- for (uint32_t i = 0; i < b->nchannels(); ++i) {
- remove_channel (ARDOUR::BundleChannel (b, i));
+ for (uint32_t i = 0; i < b->nchannels().n_total(); ++i) {
+ if (b->channel_type(i) == _type) {
+ remove_channel (ARDOUR::BundleChannel (b, i));
+ }
}
}
diff --git a/gtk2_ardour/port_matrix_body.cc b/gtk2_ardour/port_matrix_body.cc
index 6da2ab87b5..df92c51e5e 100644
--- a/gtk2_ardour/port_matrix_body.cc
+++ b/gtk2_ardour/port_matrix_body.cc
@@ -467,7 +467,12 @@ PortMatrixBody::highlight_associated_channels (int dim, ARDOUR::BundleChannel h)
PortGroup::BundleList const b = _matrix->visible_ports(1 - dim)->bundles ();
for (PortGroup::BundleList::const_iterator i = b.begin(); i != b.end(); ++i) {
- for (uint32_t j = 0; j < (*i)->bundle->nchannels(); ++j) {
+ for (uint32_t j = 0; j < (*i)->bundle->nchannels().n_total(); ++j) {
+
+ if ((*i)->bundle->channel_type(j) != _matrix->type()) {
+ continue;
+ }
+
bc[1 - dim] = ARDOUR::BundleChannel ((*i)->bundle, j);
if (_matrix->get_state (bc) == PortMatrixNode::ASSOCIATED) {
if (dim == _matrix->column_index()) {
diff --git a/gtk2_ardour/port_matrix_column_labels.cc b/gtk2_ardour/port_matrix_column_labels.cc
index 339767f27d..fa1989f914 100644
--- a/gtk2_ardour/port_matrix_column_labels.cc
+++ b/gtk2_ardour/port_matrix_column_labels.cc
@@ -62,7 +62,11 @@ PortMatrixColumnLabels::compute_dimensions ()
_longest_bundle_name = ext.width;
}
- for (uint32_t k = 0; k < (*j)->bundle->nchannels (); ++k) {
+ for (uint32_t k = 0; k < (*j)->bundle->nchannels().n_total(); ++k) {
+
+ if ((*j)->bundle->channel_type(k) != _matrix->type()) {
+ continue;
+ }
cairo_text_extents (
cr,
@@ -135,7 +139,7 @@ PortMatrixColumnLabels::render (cairo_t* cr)
if (_matrix->show_only_bundles()) {
x += grid_spacing();
} else {
- x += (*i)->bundle->nchannels () * grid_spacing();
+ x += (*i)->bundle->nchannels().get(_matrix->type()) * grid_spacing();
}
++N;
@@ -149,7 +153,12 @@ PortMatrixColumnLabels::render (cairo_t* cr)
for (PortGroup::BundleList::const_iterator i = bundles.begin (); i != bundles.end(); ++i) {
- for (uint32_t j = 0; j < (*i)->bundle->nchannels(); ++j) {
+ for (uint32_t j = 0; j < (*i)->bundle->nchannels().n_total(); ++j) {
+
+ if ((*i)->bundle->channel_type(j) != _matrix->type()) {
+ continue;
+ }
+
Gdk::Color c = (*i)->has_colour ? (*i)->colour : get_a_bundle_colour (N);
render_channel_name (cr, background_colour (), c, x, 0, ARDOUR::BundleChannel ((*i)->bundle, j));
x += grid_spacing();
@@ -254,7 +263,7 @@ PortMatrixColumnLabels::render_bundle_name (
if (_matrix->show_only_bundles()) {
w = grid_spacing ();
} else {
- w = b->nchannels() * grid_spacing();
+ w = b->nchannels().get(_matrix->type()) * grid_spacing();
}
double x_ = xoff;
@@ -352,7 +361,7 @@ PortMatrixColumnLabels::render_channel_name (
);
}
- if (bc.bundle->nchannels() > 1) {
+ if (bc.bundle->nchannels().get(_matrix->type()) > 1) {
/* only plot the name if the bundle has more than one channel;
the name of a single channel is assumed to be redundant */
@@ -478,7 +487,12 @@ PortMatrixColumnLabels::motion (double x, double y)
list<PortMatrixNode> n;
- for (uint32_t i = 0; i < w.bundle->nchannels(); ++i) {
+ for (uint32_t i = 0; i < w.bundle->nchannels().n_total(); ++i) {
+
+ if (w.bundle->channel_type(i) != _matrix->type()) {
+ continue;
+ }
+
ARDOUR::BundleChannel const bc (w.bundle, i);
n.push_back (PortMatrixNode (ARDOUR::BundleChannel (), bc));
}
diff --git a/gtk2_ardour/port_matrix_component.cc b/gtk2_ardour/port_matrix_component.cc
index 440376d1fa..720acce862 100644
--- a/gtk2_ardour/port_matrix_component.cc
+++ b/gtk2_ardour/port_matrix_component.cc
@@ -132,7 +132,7 @@ PortMatrixComponent::group_size (boost::shared_ptr<const PortGroup> g) const
s = bundles.size();
} else {
for (PortGroup::BundleList::const_iterator i = bundles.begin(); i != bundles.end(); ++i) {
- s += (*i)->bundle->nchannels();
+ s += (*i)->bundle->nchannels().get (_matrix->type());
}
}
@@ -169,7 +169,7 @@ PortMatrixComponent::channel_to_position (ARDOUR::BundleChannel bc, boost::share
if (_matrix->show_only_bundles()) {
p += 1;
} else {
- p += (*i)->bundle->nchannels ();
+ p += (*i)->bundle->nchannels().get (_matrix->type());
}
}
@@ -195,7 +195,7 @@ PortMatrixComponent::position_to_channel (double p, double, boost::shared_ptr<co
} else {
- uint32_t const s = (*j)->bundle->nchannels ();
+ uint32_t const s = (*j)->bundle->nchannels().get (_matrix->type());
if (p < s) {
return ARDOUR::BundleChannel ((*j)->bundle, p);
} else {
diff --git a/gtk2_ardour/port_matrix_grid.cc b/gtk2_ardour/port_matrix_grid.cc
index fdfe45b224..572b278f79 100644
--- a/gtk2_ardour/port_matrix_grid.cc
+++ b/gtk2_ardour/port_matrix_grid.cc
@@ -81,7 +81,7 @@ PortMatrixGrid::render (cairo_t* cr)
if (!_matrix->show_only_bundles()) {
cairo_set_line_width (cr, thin_grid_line_width());
- for (uint32_t j = 0; j < (*i)->bundle->nchannels(); ++j) {
+ for (uint32_t j = 0; j < (*i)->bundle->nchannels().get(_matrix->type()); ++j) {
x += grid_spacing ();
cairo_move_to (cr, x, 0);
cairo_line_to (cr, x, _height);
@@ -111,7 +111,7 @@ PortMatrixGrid::render (cairo_t* cr)
if (!_matrix->show_only_bundles()) {
cairo_set_line_width (cr, thin_grid_line_width());
- for (uint32_t j = 0; j < (*i)->bundle->nchannels(); ++j) {
+ for (uint32_t j = 0; j < (*i)->bundle->nchannels().get(_matrix->type()); ++j) {
y += grid_spacing ();
cairo_move_to (cr, 0, y);
cairo_line_to (cr, _width, y);
@@ -169,10 +169,14 @@ PortMatrixGrid::render (cairo_t* cr)
for (PortGroup::BundleList::const_iterator j = row_bundles.begin(); j != row_bundles.end(); ++j) {
x = bx;
- for (uint32_t k = 0; k < (*i)->bundle->nchannels (); ++k) {
+ for (uint32_t k = 0; k < (*i)->bundle->nchannels().n_total(); ++k) {
y = by;
- for (uint32_t l = 0; l < (*j)->bundle->nchannels (); ++l) {
+ for (uint32_t l = 0; l < (*j)->bundle->nchannels().n_total(); ++l) {
+
+ if ((*i)->bundle->channel_type(k) != _matrix->type() || (*j)->bundle->channel_type(l) != _matrix->type()) {
+ continue;
+ }
ARDOUR::BundleChannel c[2];
c[_matrix->column_index()] = ARDOUR::BundleChannel ((*i)->bundle, k);
@@ -198,10 +202,10 @@ PortMatrixGrid::render (cairo_t* cr)
x += grid_spacing();
}
- by += (*j)->bundle->nchannels () * grid_spacing();
+ by += (*j)->bundle->nchannels().get(_matrix->type()) * grid_spacing();
}
- bx += (*i)->bundle->nchannels () * grid_spacing();
+ bx += (*i)->bundle->nchannels().get(_matrix->type()) * grid_spacing();
}
}
}
@@ -277,9 +281,13 @@ PortMatrixGrid::get_association (PortMatrixNode node) const
bool have_diagonal_association = false;
bool have_diagonal_not_association = false;
- for (uint32_t i = 0; i < node.row.bundle->nchannels (); ++i) {
+ for (uint32_t i = 0; i < node.row.bundle->nchannels().n_total(); ++i) {
+
+ for (uint32_t j = 0; j < node.column.bundle->nchannels().n_total(); ++j) {
- for (uint32_t j = 0; j < node.column.bundle->nchannels (); ++j) {
+ if (node.row.bundle->channel_type(i) != _matrix->type() || node.column.bundle->channel_type(j) != _matrix->type()) {
+ continue;
+ }
ARDOUR::BundleChannel c[2];
c[_matrix->column_index()] = ARDOUR::BundleChannel (node.row.bundle, i);
@@ -334,9 +342,13 @@ PortMatrixGrid::set_association (PortMatrixNode node, bool s)
{
if (_matrix->show_only_bundles()) {
- for (uint32_t i = 0; i < node.column.bundle->nchannels(); ++i) {
- for (uint32_t j = 0; j < node.row.bundle->nchannels(); ++j) {
+ for (uint32_t i = 0; i < node.column.bundle->nchannels().n_total(); ++i) {
+ for (uint32_t j = 0; j < node.row.bundle->nchannels().n_total(); ++j) {
+ if (node.column.bundle->channel_type(i) != _matrix->type() || node.row.bundle->channel_type(j) != _matrix->type()) {
+ continue;
+ }
+
ARDOUR::BundleChannel c[2];
c[_matrix->column_index()] = ARDOUR::BundleChannel (node.column.bundle, i);
c[_matrix->row_index()] = ARDOUR::BundleChannel (node.row.bundle, j);
diff --git a/gtk2_ardour/port_matrix_row_labels.cc b/gtk2_ardour/port_matrix_row_labels.cc
index 57e972acd4..30317f5619 100644
--- a/gtk2_ardour/port_matrix_row_labels.cc
+++ b/gtk2_ardour/port_matrix_row_labels.cc
@@ -54,7 +54,12 @@ PortMatrixRowLabels::compute_dimensions ()
PortGroup::BundleList const r = (*i)->bundles ();
for (PortGroup::BundleList::const_iterator j = r.begin(); j != r.end(); ++j) {
- for (uint32_t k = 0; k < (*j)->bundle->nchannels(); ++k) {
+ for (uint32_t k = 0; k < (*j)->bundle->nchannels().n_total(); ++k) {
+
+ if ((*j)->bundle->channel_type(k) != _matrix->type()) {
+ continue;
+ }
+
cairo_text_extents_t ext;
cairo_text_extents (cr, (*j)->bundle->channel_name(k).c_str(), &ext);
if (ext.width > _longest_port_name) {
@@ -110,7 +115,12 @@ PortMatrixRowLabels::render (cairo_t* cr)
render_bundle_name (cr, background_colour (), (*i)->has_colour ? (*i)->colour : get_a_bundle_colour (N), 0, y, (*i)->bundle);
if (!_matrix->show_only_bundles()) {
- for (uint32_t j = 0; j < (*i)->bundle->nchannels(); ++j) {
+ for (uint32_t j = 0; j < (*i)->bundle->nchannels().n_total(); ++j) {
+
+ if ((*i)->bundle->channel_type(j) != _matrix->type()) {
+ continue;
+ }
+
Gdk::Color c = (*i)->has_colour ? (*i)->colour : get_a_bundle_colour (M);
render_channel_name (cr, background_colour (), c, 0, y, ARDOUR::BundleChannel ((*i)->bundle, j));
y += grid_spacing();
@@ -205,7 +215,7 @@ PortMatrixRowLabels::render_bundle_name (
{
double const x = bundle_name_x ();
- int const n = _matrix->show_only_bundles() ? 1 : b->nchannels();
+ int const n = _matrix->show_only_bundles() ? 1 : b->nchannels().get(_matrix->type());
set_source_rgb (cr, bg_colour);
cairo_rectangle (cr, xoff + x, yoff, _longest_bundle_name + name_pad() * 2, grid_spacing() * n);
cairo_fill_preserve (cr);
@@ -238,7 +248,7 @@ PortMatrixRowLabels::render_channel_name (
cairo_text_extents (cr, bc.bundle->channel_name(bc.channel).c_str(), &ext);
double const off = (grid_spacing() - ext.height) / 2;
- if (bc.bundle->nchannels() > 1) {
+ if (bc.bundle->nchannels().get(_matrix->type()) > 1) {
/* only plot the name if the bundle has more than one channel;
the name of a single channel is assumed to be redundant */
@@ -323,7 +333,12 @@ PortMatrixRowLabels::motion (double x, double y)
list<PortMatrixNode> n;
- for (uint32_t i = 0; i < w.bundle->nchannels(); ++i) {
+ for (uint32_t i = 0; i < w.bundle->nchannels().n_total(); ++i) {
+
+ if (w.bundle->channel_type(i) != _matrix->type()) {
+ continue;
+ }
+
ARDOUR::BundleChannel const bc (w.bundle, i);
n.push_back (PortMatrixNode (bc, ARDOUR::BundleChannel ()));
}
diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc
index 1afc079aaf..06ad58d7e0 100644
--- a/gtk2_ardour/session_option_editor.cc
+++ b/gtk2_ardour/session_option_editor.cc
@@ -32,7 +32,7 @@ public:
_port_group->add_bundle (_session->click_io()->bundle());
_port_group->add_bundle (_session->the_auditioner()->output()->bundle());
} else {
- _ports[OTHER].gather (_session, true, false);
+ _ports[OTHER].gather (_session, DataType::AUDIO, true, false);
}
}
diff --git a/libs/ardour/ardour/bundle.h b/libs/ardour/ardour/bundle.h
index cc2ee19155..39c58ed318 100644
--- a/libs/ardour/ardour/bundle.h
+++ b/libs/ardour/ardour/bundle.h
@@ -28,13 +28,14 @@
#include "pbd/signals.h"
#include "ardour/data_type.h"
+#include "ardour/chan_count.h"
namespace ARDOUR {
class AudioEngine;
/** A set of `channels', each of which is associated with 0 or more ports.
- * Each channel has a name which can be anything useful.
+ * Each channel has a name which can be anything useful, and a data type.
* Intended for grouping things like, for example, a buss' outputs.
* `Channel' is a rather overloaded term but I can't think of a better
* one right now.
@@ -49,33 +50,34 @@ class Bundle : public PBD::ScopedConnectionList
typedef std::vector<std::string> PortList;
struct Channel {
- Channel (std::string n) : name (n) {}
+ Channel (std::string n, DataType t) : name (n), type (t) {}
bool operator== (Channel const &o) const {
- return name == o.name && ports == o.ports;
+ return name == o.name && type == o.type && ports == o.ports;
}
std::string name;
+ DataType type;
PortList ports;
};
Bundle (bool i = true);
Bundle (std::string const &, bool i = true);
- Bundle (std::string const &, DataType, bool i = true);
Bundle (boost::shared_ptr<Bundle>);
virtual ~Bundle() {}
/** @return Number of channels that this Bundle has */
- uint32_t nchannels () const;
+ ChanCount nchannels () const;
/** @param Channel index.
* @return Ports associated with this channel.
*/
PortList const & channel_ports (uint32_t) const;
- void add_channel (std::string const &);
+ void add_channel (std::string const &, DataType);
std::string channel_name (uint32_t) const;
+ DataType channel_type (uint32_t) const;
void set_channel_name (uint32_t, std::string const &);
void add_port_to_channel (uint32_t, std::string);
void set_port (uint32_t, std::string);
@@ -98,11 +100,6 @@ class Bundle : public PBD::ScopedConnectionList
/** @return Bundle name */
std::string name () const { return _name; }
- void set_type (DataType);
-
- /** @return Type of the ports in this Bundle. */
- DataType type () const { return _type; }
-
void set_ports_are_inputs ();
void set_ports_are_outputs ();
bool ports_are_inputs () const { return _ports_are_inputs; }
@@ -135,7 +132,6 @@ class Bundle : public PBD::ScopedConnectionList
void emit_changed (Change);
std::string _name;
- DataType _type;
bool _ports_are_inputs;
bool _signals_suspended;
diff --git a/libs/ardour/bundle.cc b/libs/ardour/bundle.cc
index f409e0beee..9878437ff8 100644
--- a/libs/ardour/bundle.cc
+++ b/libs/ardour/bundle.cc
@@ -36,8 +36,7 @@ using namespace PBD;
* @param i true if ports are inputs, otherwise false.
*/
Bundle::Bundle (bool i)
- : _type (DataType::AUDIO),
- _ports_are_inputs (i),
+ : _ports_are_inputs (i),
_signals_suspended (false),
_pending_change (Change (0))
{
@@ -51,23 +50,6 @@ Bundle::Bundle (bool i)
*/
Bundle::Bundle (std::string const & n, bool i)
: _name (n),
- _type (DataType::AUDIO),
- _ports_are_inputs (i),
- _signals_suspended (false),
- _pending_change (Change (0))
-{
-
-}
-
-
-/** Construct a bundle.
- * @param n Name.
- * @param t Type.
- * @param i true if ports are inputs, otherwise false.
- */
-Bundle::Bundle (std::string const & n, DataType t, bool i)
- : _name (n),
- _type (t),
_ports_are_inputs (i),
_signals_suspended (false),
_pending_change (Change (0))
@@ -75,11 +57,9 @@ Bundle::Bundle (std::string const & n, DataType t, bool i)
}
-
Bundle::Bundle (boost::shared_ptr<Bundle> other)
: _channel (other->_channel),
_name (other->_name),
- _type (other->_type),
_ports_are_inputs (other->_ports_are_inputs),
_signals_suspended (other->_signals_suspended),
_pending_change (other->_pending_change)
@@ -87,17 +67,23 @@ Bundle::Bundle (boost::shared_ptr<Bundle> other)
}
-uint32_t
+ChanCount
Bundle::nchannels () const
{
Glib::Mutex::Lock lm (_channel_mutex);
- return _channel.size ();
+
+ ChanCount c;
+ for (vector<Channel>::const_iterator i = _channel.begin(); i != _channel.end(); ++i) {
+ c.set (i->type, c.get (i->type) + 1);
+ }
+
+ return c;
}
Bundle::PortList const &
Bundle::channel_ports (uint32_t c) const
{
- assert (c < nchannels());
+ assert (c < nchannels().n_total());
Glib::Mutex::Lock lm (_channel_mutex);
return _channel[c].ports;
@@ -110,7 +96,7 @@ Bundle::channel_ports (uint32_t c) const
void
Bundle::add_port_to_channel (uint32_t ch, string portname)
{
- assert (ch < nchannels());
+ assert (ch < nchannels().n_total());
assert (portname.find_first_of (':') != string::npos);
{
@@ -128,7 +114,7 @@ Bundle::add_port_to_channel (uint32_t ch, string portname)
void
Bundle::remove_port_from_channel (uint32_t ch, string portname)
{
- assert (ch < nchannels());
+ assert (ch < nchannels().n_total());
bool changed = false;
@@ -155,7 +141,7 @@ Bundle::remove_port_from_channel (uint32_t ch, string portname)
void
Bundle::set_port (uint32_t ch, string portname)
{
- assert (ch < nchannels());
+ assert (ch < nchannels().n_total());
assert (portname.find_first_of (':') != string::npos);
{
@@ -169,11 +155,11 @@ Bundle::set_port (uint32_t ch, string portname)
/** @param n Channel name */
void
-Bundle::add_channel (std::string const & n)
+Bundle::add_channel (std::string const & n, DataType t)
{
{
Glib::Mutex::Lock lm (_channel_mutex);
- _channel.push_back (Channel (n));
+ _channel.push_back (Channel (n, t));
}
emit_changed (ConfigurationChanged);
@@ -182,7 +168,7 @@ Bundle::add_channel (std::string const & n)
bool
Bundle::port_attached_to_channel (uint32_t ch, std::string portname)
{
- assert (ch < nchannels());
+ assert (ch < nchannels().n_total());
Glib::Mutex::Lock lm (_channel_mutex);
return (std::find (_channel[ch].ports.begin (), _channel[ch].ports.end (), portname) != _channel[ch].ports.end ());
@@ -194,7 +180,7 @@ Bundle::port_attached_to_channel (uint32_t ch, std::string portname)
void
Bundle::remove_channel (uint32_t ch)
{
- assert (ch < nchannels ());
+ assert (ch < nchannels().n_total());
Glib::Mutex::Lock lm (_channel_mutex);
_channel.erase (_channel.begin () + ch);
@@ -252,7 +238,7 @@ Bundle::offers_port_alone (std::string p) const
std::string
Bundle::channel_name (uint32_t ch) const
{
- assert (ch < nchannels());
+ assert (ch < nchannels().n_total());
Glib::Mutex::Lock lm (_channel_mutex);
return _channel[ch].name;
@@ -265,7 +251,7 @@ Bundle::channel_name (uint32_t ch) const
void
Bundle::set_channel_name (uint32_t ch, std::string const & n)
{
- assert (ch < nchannels());
+ assert (ch < nchannels().n_total());
{
Glib::Mutex::Lock lm (_channel_mutex);
@@ -282,14 +268,14 @@ Bundle::set_channel_name (uint32_t ch, std::string const & n)
void
Bundle::add_channels_from_bundle (boost::shared_ptr<Bundle> other)
{
- uint32_t const ch = nchannels ();
+ uint32_t const ch = nchannels().n_total();
- for (uint32_t i = 0; i < other->nchannels(); ++i) {
+ for (uint32_t i = 0; i < other->nchannels().n_total(); ++i) {
std::stringstream s;
s << other->name() << " " << other->channel_name(i);
- add_channel (s.str());
+ add_channel (s.str(), other->channel_type(i));
PortList const& pl = other->channel_ports (i);
for (uint32_t j = 0; j < pl.size(); ++j) {
@@ -306,8 +292,8 @@ Bundle::add_channels_from_bundle (boost::shared_ptr<Bundle> other)
void
Bundle::connect (boost::shared_ptr<Bundle> other, AudioEngine & engine)
{
- uint32_t const N = nchannels ();
- assert (N == other->nchannels ());
+ uint32_t const N = nchannels().n_total();
+ assert (N == other->nchannels().n_total());
for (uint32_t i = 0; i < N; ++i) {
Bundle::PortList const & our_ports = channel_ports (i);
@@ -324,8 +310,8 @@ Bundle::connect (boost::shared_ptr<Bundle> other, AudioEngine & engine)
void
Bundle::disconnect (boost::shared_ptr<Bundle> other, AudioEngine & engine)
{
- uint32_t const N = nchannels ();
- assert (N == other->nchannels ());
+ uint32_t const N = nchannels().n_total();
+ assert (N == other->nchannels().n_total());
for (uint32_t i = 0; i < N; ++i) {
Bundle::PortList const & our_ports = channel_ports (i);
@@ -360,7 +346,7 @@ Bundle::remove_ports_from_channels ()
void
Bundle::remove_ports_from_channel (uint32_t ch)
{
- assert (ch < nchannels ());
+ assert (ch < nchannels().n_total());
{
Glib::Mutex::Lock lm (_channel_mutex);
@@ -400,14 +386,11 @@ Bundle::emit_changed (Change c)
bool
Bundle::connected_to (boost::shared_ptr<Bundle> other, AudioEngine & engine)
{
- if (_ports_are_inputs == other->_ports_are_inputs ||
- _type != other->_type ||
- nchannels() != other->nchannels ()) {
-
+ if (_ports_are_inputs == other->_ports_are_inputs || nchannels() != other->nchannels()) {
return false;
}
- for (uint32_t i = 0; i < nchannels(); ++i) {
+ for (uint32_t i = 0; i < nchannels().n_total(); ++i) {
Bundle::PortList const & A = channel_ports (i);
Bundle::PortList const & B = other->channel_ports (i);
@@ -433,16 +416,6 @@ Bundle::connected_to (boost::shared_ptr<Bundle> other, AudioEngine & engine)
return true;
}
-/** Set the type of the ports in this Bundle.
- * @param t New type.
- */
-void
-Bundle::set_type (DataType t)
-{
- _type = t;
- emit_changed (TypeChanged);
-}
-
void
Bundle::set_ports_are_inputs ()
{
@@ -473,9 +446,9 @@ Bundle::set_name (string const & n)
bool
Bundle::has_same_ports (boost::shared_ptr<Bundle> b) const
{
- uint32_t const N = nchannels ();
+ uint32_t const N = nchannels().n_total();
- if (b->nchannels() != N) {
+ if (b->nchannels().n_total() != N) {
return false;
}
@@ -489,3 +462,12 @@ Bundle::has_same_ports (boost::shared_ptr<Bundle> b) const
return true;
}
+
+DataType
+Bundle::channel_type (uint32_t c) const
+{
+ assert (c < nchannels().n_total());
+
+ Glib::Mutex::Lock lm (_channel_mutex);
+ return _channel[c].type;
+}
diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc
index f40cbafb2d..0cc61e1044 100644
--- a/libs/ardour/io.cc
+++ b/libs/ardour/io.cc
@@ -111,6 +111,10 @@ IO::check_bundles_connected ()
check_bundles (_bundles_connected, ports());
}
+/** Check the bundles in list to see which are connected to a given PortSet,
+ * and update list with those that are connected such that every port on every
+ * bundle channel x is connected to port x in ports.
+ */
void
IO::check_bundles (std::vector<UserBundleInfo*>& list, const PortSet& ports)
{
@@ -118,9 +122,9 @@ IO::check_bundles (std::vector<UserBundleInfo*>& list, const PortSet& ports)
for (std::vector<UserBundleInfo*>::iterator i = list.begin(); i != list.end(); ++i) {
- uint32_t const N = (*i)->bundle->nchannels ();
+ uint32_t const N = (*i)->bundle->nchannels().n_total();
- if (_ports.num_ports (default_type()) < N) {
+ if (_ports.num_ports() < N) {
continue;
}
@@ -771,7 +775,7 @@ IO::get_port_counts (const XMLNode& node, int version, ChanCount& n, boost::shar
if ((prop = node.property ("connection")) != 0) {
if ((c = find_possible_bundle (prop->value())) != 0) {
- n = ChanCount::max (n, ChanCount(c->type(), c->nchannels()));
+ n = ChanCount::max (n, c->nchannels());
}
return 0;
}
@@ -780,7 +784,7 @@ IO::get_port_counts (const XMLNode& node, int version, ChanCount& n, boost::shar
if ((*iter)->name() == X_("Bundle")) {
if ((c = find_possible_bundle (prop->value())) != 0) {
- n = ChanCount::max (n, ChanCount(c->type(), c->nchannels()));
+ n = ChanCount::max (n, c->nchannels());
return 0;
} else {
return -1;
@@ -1328,8 +1332,6 @@ IO::setup_bundle ()
_bundle->suspend_signals ();
- _bundle->set_type (default_type ());
-
_bundle->remove_channels ();
if (_direction == Input) {
@@ -1340,7 +1342,7 @@ IO::setup_bundle ()
_bundle->set_name (buf);
uint32_t const ni = _ports.num_ports();
for (uint32_t i = 0; i < ni; ++i) {
- _bundle->add_channel (bundle_channel_name (i, ni));
+ _bundle->add_channel (bundle_channel_name (i, ni), _ports.port(i)->type());
_bundle->set_port (i, _session.engine().make_port_name_non_relative (_ports.port(i)->name()));
}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 423cc8cb9a..675cd9acfe 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -441,7 +441,7 @@ Session::when_engine_running ()
snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
shared_ptr<Bundle> c (new Bundle (buf, true));
- c->add_channel (_("mono"));
+ c->add_channel (_("mono"), DataType::AUDIO);
c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
add_bundle (c);
@@ -454,9 +454,9 @@ Session::when_engine_running ()
char buf[32];
snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
shared_ptr<Bundle> c (new Bundle (buf, true));
- c->add_channel (_("L"));
+ c->add_channel (_("L"), DataType::AUDIO);
c->set_port (0, _engine.get_nth_physical_output (DataType::AUDIO, np));
- c->add_channel (_("R"));
+ c->add_channel (_("R"), DataType::AUDIO);
c->set_port (1, _engine.get_nth_physical_output (DataType::AUDIO, np + 1));
add_bundle (c);
@@ -470,7 +470,7 @@ Session::when_engine_running ()
snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
shared_ptr<Bundle> c (new Bundle (buf, false));
- c->add_channel (_("mono"));
+ c->add_channel (_("mono"), DataType::AUDIO);
c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
add_bundle (c);
@@ -484,9 +484,9 @@ Session::when_engine_running ()
snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
shared_ptr<Bundle> c (new Bundle (buf, false));
- c->add_channel (_("L"));
+ c->add_channel (_("L"), DataType::AUDIO);
c->set_port (0, _engine.get_nth_physical_input (DataType::AUDIO, np));
- c->add_channel (_("R"));
+ c->add_channel (_("R"), DataType::AUDIO);
c->set_port (1, _engine.get_nth_physical_input (DataType::AUDIO, np + 1));
add_bundle (c);
diff --git a/libs/ardour/user_bundle.cc b/libs/ardour/user_bundle.cc
index 4c39c5f5ff..b6c38e0eed 100644
--- a/libs/ardour/user_bundle.cc
+++ b/libs/ardour/user_bundle.cc
@@ -50,7 +50,13 @@ ARDOUR::UserBundle::set_state (XMLNode const & node, int /*version*/)
return -1;
}
- add_channel (name->value ());
+ XMLProperty const * type;
+ if ((type = (*i)->property ("type")) == 0) {
+ PBD::error << _("Node for Channel has no \"type\" property") << endmsg;
+ return -1;
+ }
+
+ add_channel (name->value (), DataType (type->value()));
XMLNodeList const ports = (*i)->children ();
@@ -93,6 +99,7 @@ ARDOUR::UserBundle::get_state ()
for (std::vector<Channel>::iterator i = _channel.begin(); i != _channel.end(); ++i) {
XMLNode* c = new XMLNode ("Channel");
c->add_property ("name", i->name);
+ c->add_property ("type", i->type.to_string());
for (PortList::iterator j = i->ports.begin(); j != i->ports.end(); ++j) {
XMLNode* p = new XMLNode ("Port");