freebsd-ports/comms/lirc/files/patch-daemons__hw_default.c
2014-07-29 17:12:47 +00:00

97 lines
2.2 KiB
C

--- daemons/hw_default.c.orig
+++ daemons/hw_default.c
@@ -38,6 +38,20 @@
#include "transmit.h"
#include "hw_default.h"
+/*
+ * Some(?) versions of the Linux mceusb /dev/lirc0 driver return
+ * trailing spaces while at least irrecord expects spaces at the
+ * beginning of a remote button event. So if DELAYEDSPACE is
+ * defined delay a space until the next pulse if it comes right
+ * after a pulse.
+ *
+ * XXX make this a separate hw_mceusb device?
+ */
+#define DELAYEDSPACE
+#ifdef DELAYEDSPACE
+#include <errno.h>
+#endif
+
extern struct ir_remote *repeat_remote;
static __u32 supported_send_modes[] = {
@@ -81,6 +95,39 @@ struct hardware hw_default = {
static int write_send_buffer(int lirc);
+#ifdef DELAYEDSPACE
+static int delayedspace = 100000;
+
+static int availabledata(void)
+{
+ fd_set fds;
+ int ret;
+ struct timeval tv;
+
+ FD_ZERO(&fds);
+ FD_SET(hw.fd, &fds);
+ do {
+ do {
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ ret = select(hw.fd + 1, &fds, NULL, NULL, &tv);
+ }
+ while (ret == -1 && errno == EINTR);
+ if (ret == -1) {
+ logprintf(LOG_ERR, "select() failed\n");
+ logperror(LOG_ERR, NULL);
+ continue;
+ }
+ }
+ while (ret == -1);
+
+ if (FD_ISSET(hw.fd, &fds)) {
+ return (1);
+ }
+ return (0);
+}
+#endif
+
/**********************************************************************
*
* decode stuff
@@ -115,6 +162,13 @@ int default_readdata(lirc_t timeout)
dosigterm(SIGTERM);
}
#else
+#ifdef DELAYEDSPACE
+ if (delayedspace) {
+ data = delayedspace;
+ delayedspace = 0;
+ return data;
+ }
+#endif
ret = read(hw.fd, &data, sizeof(data));
if (ret != sizeof(data)) {
logprintf(LOG_ERR, "error reading from %s (ret %d, expected %d)",
@@ -125,6 +179,19 @@ int default_readdata(lirc_t timeout)
return 0;
}
+#ifdef DELAYEDSPACE
+ if (hw.rec_mode == LIRC_MODE_MODE2 && (data & PULSE_BIT) && availabledata() /* waitfordata((long)timeout) */) {
+ ret = read(hw.fd, &delayedspace, sizeof(delayedspace));
+ if (ret != sizeof(delayedspace)) {
+ logprintf(LOG_ERR, "error reading space from %s (ret %d, expected %d)",
+ hw.device, ret, sizeof(delayedspace));
+ logperror(LOG_ERR, NULL);
+ default_deinit();
+
+ return 0;
+ }
+ }
+#endif
if (data == 0) {
static int data_warning = 1;