diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 519d614248..8aae4d5879 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1528,6 +1528,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop AutoConnectQueue _auto_connect_queue; guint _latency_recompute_pending; + void get_physical_ports (std::vector& inputs, std::vector& outputs, DataType type, bool excluding); + void auto_connect (const AutoConnectRequest&); void queue_latency_recompute (); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index b22fe03643..431cadfca0 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -910,6 +910,41 @@ Session::setup_click_state (const XMLNode* node) } } +void +Session::get_physical_ports (vector& inputs, vector& outputs, DataType type, bool excluding) +{ + _engine.get_physical_inputs (type, inputs); + + if (excluding) { + /* rip out ControlOnly ports, and ALSA MIDI Through ports */ + + for (vector::iterator si = inputs.begin(); si != inputs.end(); ) { + if (PortManager::port_is_control_only (*si)) { + si = inputs.erase (si); + } else if ((*si).find (X_("Midi Through")) != string::npos || (*si).find (X_("Midi-Through")) != string::npos) { + si = inputs.erase (si); + } else { + ++si; + } + } + } + _engine.get_physical_outputs (type, outputs); + + if (excluding) { + /* rip out ControlOnly ports, and ALSA MIDI Through ports */ + + for (vector::iterator si = outputs.begin(); si != outputs.end(); ) { + if (PortManager::port_is_control_only (*si)) { + si = outputs.erase (si); + } else if ((*si).find (X_("Midi Through")) != string::npos || (*si).find (X_("Midi-Through")) != string::npos) { + si = outputs.erase (si); + } else { + ++si; + } + } + } +} + void Session::setup_bundles () { @@ -928,30 +963,9 @@ Session::setup_bundles () vector inputs[DataType::num_types]; vector outputs[DataType::num_types]; + for (uint32_t i = 0; i < DataType::num_types; ++i) { - _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]); - - /* rip out ControlOnly ports */ - - for (vector::iterator si = inputs[i].begin(); si != inputs[i].end(); ) { - if (PortManager::port_is_control_only (*si)) { - si = inputs[i].erase (si); - } else { - ++si; - } - } - - _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]); - - /* rip out ControlOnly ports */ - - for (vector::iterator si = outputs[i].begin(); si != outputs[i].end(); ) { - if (PortManager::port_is_control_only (*si)) { - si = outputs[i].erase (si); - } else { - ++si; - } - } + get_physical_ports (inputs[i], outputs[i], DataType (DataType::Symbol (i)), true); } /* Create a set of Bundle objects that map @@ -6934,8 +6948,7 @@ Session::auto_connect (const AutoConnectRequest& ar) vector physinputs; vector physoutputs; - _engine.get_physical_outputs (*t, physoutputs); - _engine.get_physical_inputs (*t, physinputs); + get_physical_ports (physinputs, physoutputs, *t, true); if (!physinputs.empty() && ar.connect_inputs) { uint32_t nphysical_in = physinputs.size();