#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
-#include "pbd/convert.h"
#include "pbd/error.h"
#include "ardour/async_midi_port.h"
#include "ardour/port_manager.h"
#include "ardour/profile.h"
#include "ardour/session.h"
+#include "ardour/types_convert.h"
#include "pbd/i18n.h"
}
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 ();
}
_backend->get_physical_inputs (type, s);
+ filter_midi_ports (s, include, exclude);
}
ChanCount
PortManager::cycle_start (pframes_t nframes)
{
Port::set_global_port_buffer_offset (0);
- Port::set_cycle_framecnt (nframes);
+ Port::set_cycle_samplecnt (nframes);
_cycle_ports = ports.reader ();
const char * const control_only_ports[] = {
X_(".*Ableton Push.*"),
X_(".*FaderPort .*"),
+ X_(".*FaderPort8 .*"),
};
pattern = "(";
for (MidiPortInfo::iterator i = midi_port_info.begin(); i != midi_port_info.end(); ++i) {
XMLNode* node = new XMLNode (X_("port"));
- node->add_property (X_("name"), i->first);
- node->add_property (X_("pretty-name"), i->second.pretty_name);
- node->add_property (X_("input"), i->second.input ? X_("yes") : X_("no"));
- node->add_property (X_("properties"), enum_2_string (i->second.properties));
+ node->set_property (X_("name"), i->first);
+ node->set_property (X_("input"), i->second.input);
+ node->set_property (X_("properties"), i->second.properties);
root->add_child_nocopy (*node);
}
}
midi_port_info.clear ();
for (XMLNodeConstIterator i = tree.root()->children().begin(); i != tree.root()->children().end(); ++i) {
- XMLProperty const* prop;
MidiPortInformation mpi;
string name;
- if ((prop = (*i)->property (X_("name"))) == 0) {
+ if (!(*i)->get_property (X_("name"), name) ||
+ !(*i)->get_property (X_("input"), mpi.input) ||
+ !(*i)->get_property (X_("properties"), mpi.properties)) {
continue;
}
- name = prop->value ();
-
- if ((prop = (*i)->property (X_("pretty-name"))) == 0) {
- continue;
- }
- mpi.pretty_name = prop->value();
-
- if ((prop = (*i)->property (X_("input"))) == 0) {
- continue;
- }
- mpi.input = string_is_affirmative (prop->value());
-
- if ((prop = (*i)->property (X_("properties"))) == 0) {
- continue;
- }
-
- mpi.properties = (MidiPortFlags) string_2_enum (prop->value(), mpi.properties);
-
midi_port_info.insert (make_pair (name, mpi));
}
}
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));
}
}
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));
}
}
* PortManager
*/
+ // rg: I don't understand what this attempts to solve
+ //
+ // Naming ports should be left to the backend:
+ // Ardour cannot associate numeric IDs with corresponding hardware.
+ // (see also 7dde6c3b)
+
for (MidiPortInfo::iterator x = midi_port_info.begin(); x != midi_port_info.end(); ++x) {
PortEngine::PortHandle ph = _backend->get_port_by_name (x->first);
- if (x->second.pretty_name != x->first) {
+ if (!ph) {
+ /* port info saved from some condition where this port
+ * existed, but no longer does (i.e. device unplugged
+ * at present)
+ */
+ continue;
+ }
+
+ if (!x->second.pretty_name.empty () && x->second.pretty_name != x->first) {
/* name set in port info ... propagate */
_backend->set_port_property (ph, "http://jackaudio.org/metadata/pretty-name", x->second.pretty_name, string());
} else {
/* check with backend for pre-existing pretty name */
- if (ph) {
- string value;
- string type;
- if (0 == _backend->get_port_property (ph,
- "http://jackaudio.org/metadata/pretty-name",
- value, type)) {
- x->second.pretty_name = value;
- }
+ string value;
+ string type;
+ if (0 == _backend->get_port_property (ph,
+ "http://jackaudio.org/metadata/pretty-name",
+ value, type)) {
+ x->second.pretty_name = value;
}
}
}