diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-21 16:32:46 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-10-21 16:32:46 -0400 |
commit | 6866359c4800a3443f218c8c3fcff08f83fea9da (patch) | |
tree | 0903b08e9d2edb80a98e295bc7e5b24f4ee89d5d /libs/ardour/port_manager.cc | |
parent | fb200cfbb9271433aba7355e29cf8dafc97552bf (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.cc | 65 |
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)); } } |