X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fsurfaces%2Fpowermate%2Fpowermate.cc;h=a3b535c9e0276b4204825095d22a5055c5733ac8;hb=ac5bbf4b99635a71093f859e233ad5fe4b07453b;hp=96baf749b37ac551bcf5ac49121e0e925b0d6c36;hpb=b65f8073ba306ac2d85133875746767e7c6b0eb6;p=ardour.git diff --git a/libs/surfaces/powermate/powermate.cc b/libs/surfaces/powermate/powermate.cc index 96baf749b3..a3b535c9e0 100644 --- a/libs/surfaces/powermate/powermate.cc +++ b/libs/surfaces/powermate/powermate.cc @@ -12,12 +12,14 @@ #include #include -#include -#include -#include #include +#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= 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(arg)->register_thread ("Powermate"); return static_cast(arg)->SerialThread (); }