Remove not implemented API
[ardour.git] / libs / ardour / port_manager.cc
index ca980c0294b63be885c3aa08b767e8ff7fe8de40..dfc1c6442107c4aefdf5c59356d0b92813f0a514 100644 (file)
@@ -27,7 +27,6 @@
 #include <glibmm/fileutils.h>
 #include <glibmm/miscutils.h>
 
-#include "pbd/convert.h"
 #include "pbd/error.h"
 
 #include "ardour/async_midi_port.h"
@@ -40,6 +39,7 @@
 #include "ardour/port_manager.h"
 #include "ardour/profile.h"
 #include "ardour/session.h"
+#include "ardour/types_convert.h"
 
 #include "pbd/i18n.h"
 
@@ -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
@@ -710,7 +749,7 @@ void
 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 ();
 
@@ -857,6 +896,7 @@ PortManager::port_is_control_only (std::string const& name)
                const char * const control_only_ports[] = {
                        X_(".*Ableton Push.*"),
                        X_(".*FaderPort .*"),
+                       X_(".*FaderPort8 .*"),
                };
 
                pattern = "(";
@@ -1029,10 +1069,9 @@ PortManager::save_midi_port_info ()
 
                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);
                }
        }
@@ -1064,32 +1103,15 @@ PortManager::load_midi_port_info ()
        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));
        }
 }
@@ -1124,6 +1146,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 +1173,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));
                }
        }
@@ -1148,22 +1192,34 @@ PortManager::fill_midi_port_info_locked ()
         * 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;
                        }
                }
        }