freebsd-ports/comms/lirc/files/patch-daemons::hw_default.c
Juergen Lock 0edca97428 - Update comms/lirc to 0.9.0p1_4 in order to be able to use the lirc
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]
2011-02-26 22:11:54 +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;