0edca97428
support in webcamd svn (for mceusb-based receivers/transmitters and USB DVB tuner remotes supported by the Linux code), and enable support for a few more USB devices while we're at it tho of those only an FTDI-based one was tested: http://www.huitsing.nl/irftdi/ [1] - Fix plist for audio/rhythmbox and multimedia/totem and add missing LIRC_{CFLAGS,LIBS} variables to CONFIGURE_ENV for multimedia/xine when building them with (optional) lirc support. [2] - Chase liblirc_client shlib version bump for ports depdending on it and bump PORTREVISIONs for ports depending on it by default. Approved by: portmgr (miwi) [2] Thanks to: Warren Block <wblock@wonkity.com> for testing [1]
97 lines
2.2 KiB
C
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;
|
|
|