summaryrefslogtreecommitdiff
path: root/libs/ardour/port_manager.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-10-21 16:32:46 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-10-21 16:32:46 -0400
commit6866359c4800a3443f218c8c3fcff08f83fea9da (patch)
tree0903b08e9d2edb80a98e295bc7e5b24f4ee89d5d /libs/ardour/port_manager.cc
parentfb200cfbb9271433aba7355e29cf8dafc97552bf (diff)
when fetching MIDI ports for bundles and auto-connection, ignore control-only (and "virtual") MIDI ports
"virtual" is a placeholder name for ALSA sequencer MIDI through ports
Diffstat (limited to 'libs/ardour/port_manager.cc')
-rw-r--r--libs/ardour/port_manager.cc65
1 files changed, 63 insertions, 2 deletions
diff --git a/libs/ardour/port_manager.cc b/libs/ardour/port_manager.cc
index ca980c0294..a7341c442d 100644
--- a/libs/ardour/port_manager.cc
+++ b/libs/ardour/port_manager.cc
@@ -189,17 +189,55 @@ PortManager::port_is_physical (const std::string& portname) const
}
void
-PortManager::get_physical_outputs (DataType type, std::vector<std::string>& s)
+PortManager::filter_midi_ports (vector<string>& ports, MidiPortFlags include, MidiPortFlags exclude)
+{
+ if (!include && !exclude) {
+ return;
+ }
+
+ for (vector<string>::iterator si = ports.begin(); si != ports.end(); ) {
+
+ PortManager::MidiPortInformation mpi = midi_port_information (*si);
+
+ if (mpi.pretty_name.empty()) {
+ /* no information !!! */
+ ++si;
+ continue;
+ }
+
+ if (include) {
+ if ((mpi.properties & include) != include) {
+ /* properties do not include requested ones */
+ si = ports.erase (si);
+ continue;
+ }
+ }
+
+ if (exclude) {
+ if ((mpi.properties & exclude)) {
+ /* properties include ones to avoid */
+ si = ports.erase (si);
+ continue;
+ }
+ }
+
+ ++si;
+ }
+}
+
+void
+PortManager::get_physical_outputs (DataType type, std::vector<std::string>& s, MidiPortFlags include, MidiPortFlags exclude)
{
if (!_backend) {
s.clear ();
return;
}
_backend->get_physical_outputs (type, s);
+ filter_midi_ports (s, include, exclude);
}
void
-PortManager::get_physical_inputs (DataType type, std::vector<std::string>& s)
+PortManager::get_physical_inputs (DataType type, std::vector<std::string>& s, MidiPortFlags include, MidiPortFlags exclude)
{
if (!_backend) {
s.clear ();
@@ -207,6 +245,7 @@ PortManager::get_physical_inputs (DataType type, std::vector<std::string>& s)
}
_backend->get_physical_inputs (type, s);
+ filter_midi_ports (s, include, exclude);
}
ChanCount
@@ -1124,6 +1163,17 @@ PortManager::fill_midi_port_info_locked ()
MidiPortInformation mpi;
mpi.pretty_name = *p;
mpi.input = true;
+
+ if (port_is_control_only (*p)) {
+ mpi.properties = MidiPortFlags (mpi.properties | MidiPortControl);
+ }
+#ifdef LINUX
+ if ((*p.find (X_("Midi Through")) != string::npos ||
+ (*p).find (X_("Midi-Through")) != string::npos))
+ {
+ mpi.properties = MidiPortFlags (mpi.properties | MidiPortVirtual);
+ }
+#endif
midi_port_info.insert (make_pair (*p, mpi));
}
}
@@ -1140,6 +1190,17 @@ PortManager::fill_midi_port_info_locked ()
MidiPortInformation mpi;
mpi.pretty_name = *p;
mpi.input = false;
+
+ if (port_is_control_only (*p)) {
+ mpi.properties = MidiPortFlags (mpi.properties | MidiPortControl);
+ }
+#ifdef LINUX
+ if ((*p.find (X_("Midi Through")) != string::npos ||
+ (*p).find (X_("Midi-Through")) != string::npos))
+ {
+ mpi.properties = MidiPortFlags (mpi.properties | MidiPortVirtual);
+ }
+#endif
midi_port_info.insert (make_pair (*p, mpi));
}
}