use correct (RCConfig-based) name for MIDI port in generic MIDI control stuff; make...
[ardour.git] / libs / surfaces / powermate / powermate.cc
index 96baf749b37ac551bcf5ac49121e0e925b0d6c36..a3b535c9e0276b4204825095d22a5055c5733ac8 100644 (file)
 #include <unistd.h>
 #include <fcntl.h>
 
-#include <i18n.h>
-#include <pbd/xml++.h>
-#include <pbd/error.h>
 #include <glibmm.h>
 
+#include "pbd/pthread_utils.h"
+#include "pbd/xml++.h"
+#include "pbd/error.h"
+
 #include "powermate.h"
+#include "i18n.h"
 
 using namespace ARDOUR;
 using namespace std;
@@ -33,54 +35,61 @@ static const char *valid_prefix[NUM_VALID_PREFIXES] = {
 
 #define NUM_EVENT_DEVICES 16
 
-int open_powermate(const char *dev, int mode)
+int open_powermate (const char *dev, int mode)
 {
        if (!Glib::file_test (dev, Glib::FILE_TEST_EXISTS)) {
                return -1;
        }
+       
        int fd = open(dev, mode);
        int i;
        char name[255];
        
-       if(fd < 0){
+       if (fd < 0) {
                if (errno != EACCES) {
                        error << string_compose ("Unable to open \"%1\": %2", dev, strerror(errno)) << endmsg;
                }
                return -1;
        }
 
-  if(ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0){
-    error << string_compose ("\"%1\": EVIOCGNAME failed: %2", dev, strerror(errno)) << endmsg;
-    close(fd);
-    return -1;
-  }
+       /* placate valgrind */
+       name[0] = '\0';
 
-  // it's the correct device if the prefix matches what we expect it to be:
-  for(i=0; i<NUM_VALID_PREFIXES; i++)
-    if(!strncasecmp(name, valid_prefix[i], strlen(valid_prefix[i])))
-      return fd;
+       if (ioctl (fd, EVIOCGNAME (sizeof(name)), name) < 0) {
+               error << string_compose ("\"%1\": EVIOCGNAME failed: %2", dev, strerror(errno)) << endmsg;
+               close (fd);
+               return -1;
+       }
 
-  close(fd);
-  return -1;
+       // it's the correct device if the prefix matches what we expect it to be:
+       for (i = 0; i < NUM_VALID_PREFIXES; ++i) {
+               if (!strncasecmp (name, valid_prefix[i], strlen (valid_prefix[i]))) {
+                       return fd;
+               }
+       }
+       
+       close (fd);
+       return -1;
 }
 
 int find_powermate(int mode)
 {
-  char devname[256];
-  int i, r;
-
-  for(i=0; i<NUM_EVENT_DEVICES; i++){
-    sprintf(devname, "/dev/input/event%d", i);
-    r = open_powermate(devname, mode);
-    if(r >= 0)
-      return r;
-  }
-
-  return -1;
+       char devname[256];
+       int i, r;
+       
+       for (i = 0; i < NUM_EVENT_DEVICES; i++) {
+               sprintf (devname, "/dev/input/event%d", i);
+               r = open_powermate (devname, mode);
+               if (r >= 0) {
+                       return r;
+               }
+       }
+       
+       return -1;
 }
 
 PowermateControlProtocol::PowermateControlProtocol (Session& s)
-       : ControlProtocol  (s, "powermate")
+       : ControlProtocol  (s, "powermate", 0 /* XXX need an event loop here */)
 {
 }
 
@@ -95,8 +104,11 @@ PowermateControlProtocol::probe ()
        int port = find_powermate( O_RDONLY ); 
 
        if (port < 0) {
-               printf ("powermate: Opening of powermate failed - %s\n", strerror(errno));
-               close (port);
+               if (errno == ENOENT) {
+                       info << "Powermate device not found; perhaps you have no powermate connected" << endmsg;
+               } else {
+                       printf ("powermate: Opening of powermate failed - %s\n", strerror(errno));
+               }
                return false;
        }
 
@@ -117,7 +129,7 @@ PowermateControlProtocol::set_active (bool inActivate)
                                return -1;
                        }
                        
-                       if (pthread_create (&mThread, 0, SerialThreadEntry, this) == 0) {
+                       if (pthread_create_and_store ("Powermate", &mThread, SerialThreadEntry, this) == 0) {
                                _active = true;
                        } else {
                                return -1;
@@ -145,7 +157,7 @@ PowermateControlProtocol::get_state ()
 }
 
 int
-PowermateControlProtocol::set_state (const XMLNode& /*node*/)
+PowermateControlProtocol::set_state (const XMLNode& /*node*/, int /*version*/)
 {
        return 0;
 }
@@ -154,6 +166,7 @@ PowermateControlProtocol::set_state (const XMLNode& /*node*/)
 void*
 PowermateControlProtocol::SerialThreadEntry (void* arg)
 {
+       static_cast<PowermateControlProtocol*>(arg)->register_thread ("Powermate");
        return static_cast<PowermateControlProtocol*>(arg)->SerialThread ();
 }