#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;
#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 */)
{
}
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;
}
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;
}
int
-PowermateControlProtocol::set_state (const XMLNode& /*node*/)
+PowermateControlProtocol::set_state (const XMLNode& /*node*/, int /*version*/)
{
return 0;
}
void*
PowermateControlProtocol::SerialThreadEntry (void* arg)
{
+ static_cast<PowermateControlProtocol*>(arg)->register_thread ("Powermate");
return static_cast<PowermateControlProtocol*>(arg)->SerialThread ();
}