convert WinMME Device names to UTF-8
[ardour.git] / libs / backends / portaudio / winmmemidi_io.cc
index 43c5d36469b7f435e191c3eaad219892c0c456a3..da7c8a2b8dc38d168bf176d6dec258646ea0df7a 100644 (file)
 #include <mmsystem.h>
 
 #include <sstream>
+#include <set>
 
 #include "pbd/error.h"
 #include "pbd/compose.h"
+#include "pbd/windows_timer_utils.h"
 
 #include "winmmemidi_io.h"
-#include "win_utils.h"
 #include "debug.h"
 
 #include "i18n.h"
 
 using namespace ARDOUR;
-using namespace utils;
 
 WinMMEMidiIO::WinMMEMidiIO()
        : m_active (false)
@@ -110,8 +110,7 @@ WinMMEMidiIO::port_id (uint32_t port, bool input)
        return ss.str();
 }
 
-std::string
-WinMMEMidiIO::port_name (uint32_t port, bool input)
+std::string WinMMEMidiIO::port_name(uint32_t port, bool input)
 {
        if (input) {
                if (port < m_inputs.size ()) {
@@ -136,7 +135,7 @@ WinMMEMidiIO::start ()
        m_run = true;
        DEBUG_MIDI ("Starting MIDI driver\n");
 
-       set_min_timer_resolution();
+       PBD::MMTIMERS::set_min_resolution();
        discover();
        start_devices ();
 }
@@ -156,7 +155,7 @@ WinMMEMidiIO::stop ()
        cleanup ();
        pthread_mutex_unlock (&m_device_lock);
 
-       reset_timer_resolution();
+       PBD::MMTIMERS::reset_resolution();
 }
 
 void
@@ -201,6 +200,101 @@ WinMMEMidiIO::stop_devices ()
        }
 }
 
+void
+WinMMEMidiIO::clear_device_info ()
+{
+       for (std::vector<MidiDeviceInfo*>::iterator i = m_device_info.begin();
+            i != m_device_info.end();
+            ++i) {
+         delete *i;
+       }
+       m_device_info.clear();
+}
+
+bool
+WinMMEMidiIO::get_input_name_from_index (int index, std::string& name)
+{
+       MIDIINCAPS capabilities;
+       MMRESULT result = midiInGetDevCaps(index, &capabilities, sizeof(capabilities));
+
+       if (result == MMSYSERR_NOERROR) {
+               DEBUG_MIDI(string_compose("Input Device: name : %1, mid : %2, pid : %3\n",
+                                         capabilities.szPname,
+                                         capabilities.wMid,
+                                         capabilities.wPid));
+
+               name = Glib::locale_to_utf8 (capabilities.szPname);
+               return true;
+       } else {
+               DEBUG_MIDI ("Unable to get WinMME input device capabilities\n");
+       }
+       return false;
+}
+
+bool
+WinMMEMidiIO::get_output_name_from_index (int index, std::string& name)
+{
+       MIDIOUTCAPS capabilities;
+       MMRESULT result = midiOutGetDevCaps(index, &capabilities, sizeof(capabilities));
+       if (result == MMSYSERR_NOERROR) {
+               DEBUG_MIDI(string_compose("Output Device: name : %1, mid : %2, pid : %3\n",
+                                         capabilities.szPname,
+                                         capabilities.wMid,
+                                         capabilities.wPid));
+
+               name = Glib::locale_to_utf8 (capabilities.szPname);
+               return true;
+       } else {
+               DEBUG_MIDI ("Unable to get WinMME output device capabilities\n");
+       }
+       return false;
+}
+
+void
+WinMMEMidiIO::update_device_info ()
+{
+       std::set<std::string> device_names;
+
+       int in_count = midiInGetNumDevs ();
+
+       for (int i = 0; i < in_count; ++i) {
+               std::string input_name;
+               if (get_input_name_from_index(i, input_name)) {
+                       device_names.insert(input_name);
+               }
+       }
+
+       int out_count = midiOutGetNumDevs ();
+
+       for (int i = 0; i < out_count; ++i) {
+               std::string output_name;
+               if (get_output_name_from_index(i, output_name)) {
+                       device_names.insert(output_name);
+               }
+       }
+
+       clear_device_info ();
+
+       for (std::set<std::string>::const_iterator i = device_names.begin();
+            i != device_names.end();
+            ++i) {
+         m_device_info.push_back(new MidiDeviceInfo(*i));
+       }
+}
+
+MidiDeviceInfo*
+WinMMEMidiIO::get_device_info (const std::string& name)
+{
+       for (std::vector<MidiDeviceInfo*>::const_iterator i = m_device_info.begin();
+            i != m_device_info.end();
+            ++i) {
+               if ((*i)->device_name == name) {
+                       return *i;
+               }
+       }
+       return 0;
+}
+
 void
 WinMMEMidiIO::create_input_devices ()
 {
@@ -209,6 +303,25 @@ WinMMEMidiIO::create_input_devices ()
        DEBUG_MIDI (string_compose ("MidiIn count: %1\n", srcCount));
 
        for (int i = 0; i < srcCount; ++i) {
+               std::string input_name;
+               if (!get_input_name_from_index (i, input_name)) {
+                       DEBUG_MIDI ("Unable to get MIDI input name from index\n");
+                       continue;
+               }
+
+               MidiDeviceInfo* info = get_device_info (input_name);
+
+               if (!info) {
+                       DEBUG_MIDI ("Unable to MIDI device info from name\n");
+                       continue;
+               }
+
+               if (!info->enable) {
+                       DEBUG_MIDI(string_compose(
+                           "MIDI input device %1 not enabled, not opening device\n", input_name));
+                       continue;
+               }
+
                try {
                        WinMMEMidiInputDevice* midi_input = new WinMMEMidiInputDevice (i);
                        if (midi_input) {
@@ -229,6 +342,25 @@ WinMMEMidiIO::create_output_devices ()
        DEBUG_MIDI (string_compose ("MidiOut count: %1\n", dstCount));
 
        for (int i = 0; i < dstCount; ++i) {
+               std::string output_name;
+               if (!get_output_name_from_index (i, output_name)) {
+                       DEBUG_MIDI ("Unable to get MIDI output name from index\n");
+                       continue;
+               }
+
+               MidiDeviceInfo* info = get_device_info (output_name);
+
+               if (!info) {
+                       DEBUG_MIDI ("Unable to MIDI device info from name\n");
+                       continue;
+               }
+
+               if (!info->enable) {
+                       DEBUG_MIDI(string_compose(
+                           "MIDI output device %1 not enabled, not opening device\n", output_name));
+                       continue;
+               }
+
                try {
                        WinMMEMidiOutputDevice* midi_output = new WinMMEMidiOutputDevice(i);
                        if (midi_output) {