[Pkg-lirc-maint] Bug#890374: lirc: 'pre' and 'post' in *.conf is ignored if no 'pre_data', 'post_data'

Andreas Christ software at quantentunnel.de
Wed Feb 14 07:54:43 UTC 2018

Package: lirc
Version: 0.9.4c-9
Severity: normal
Tags: patch

Dear Maintainer,

In a configuration file for a remote control, I use 'post' to send a pulse
(30 us) and a space (460 us) after the data, then ptrail for a trailing pulse.
The 'post' cannot be part of 'data' as the space of 'zero' and 'one' is 650 us
and 830 us (not 460 us). The pulse and space configured in 'post' is, however,
not sent, i.e., the 'post' directive is silently ignored.

Looking into the source code I found the issue in lib/transmit.c:
'post' (i.e., a pulse and a space of specific lengths) is only sent if also
'post_data' (i.e., a sequence of 'zero' and 'one') is configured. The function
send_post(remote) checks if has_post(remote) is true; this is only true if
remote->post_data_bits > 0.

Same applies to 'pre' and 'pre_data'. 

This limitation is not described in the documentation
(see http://www.lirc.org/html/lircd.conf.html). Thus, I suggest to either
update the documentation or fix the code. I prefer the latter as I see no logic
why a directive should be ignored. I attach a patch.

For my specific use case, I have a workaround: I replace 'ptrail' by a single
bit 'post_data'. This only works because the 'ptrail' pulse happens to have
the same duration as the pulse of 'one'. Thus, I now have 'post_data' and
therefore 'post' is no longer ignored. My workaround results in having two
spaces at the end (the space of the 'one' from 'post_data' and the 'gap'); this
does no harm.

I have not found a generic workaround that can be used if the trailing pulse
has a different duration than 'one' and 'zero', nor for repeat sequences.

Best regards


-- System Information:
Distributor ID:	Raspbian
Description:	Raspbian GNU/Linux 9.3 (stretch)
Release:	9.3
Codename:	stretch
Architecture: armv7l

Kernel: Linux 4.9.59-v7+ (SMP w/4 CPU cores)
Locale: LANG=C.UTF-8, LC_CTYPE=C.UTF-8 (charmap=UTF-8), LANGUAGE=C.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages lirc depends on:
ii  init-system-helpers  1.48
ii  libasound2           1.1.3-5+rpi3
ii  libc6                2.24-11+deb9u1
ii  libftdi1-2           1.3-2
ii  libgcc1              1:6.3.0-18+rpi1
ii  liblirc-client0      0.9.4c-9
ii  liblirc0             0.9.4c-9
ii  libportaudio2        19.6.0-1
ii  libstdc++6           6.3.0-18+rpi1
ii  libsystemd0          232-25+deb9u1
ii  libudev1             232-25+deb9u1
ii  libusb-0.1-4         2:0.1.12-30
ii  libusb-1.0-0         2:1.0.21-1
ii  lsb-base             9.20161125+rpi1
ii  python3              3.5.3-1

Versions of packages lirc recommends:
pn  gir1.2-vte    <none>
ii  python3-gi    3.22.0-2
ii  python3-yaml  3.12-1

Versions of packages lirc suggests:
pn  ir-keytable          <none>
pn  lirc-compat-remotes  <none>
pn  lirc-doc             <none>
pn  lirc-drv-irman       <none>
pn  lirc-x               <none>
pn  setserial            <none>

-- no debconf information
-------------- next part --------------
diff --git a/lib/transmit.c b/lib/transmit.c
index 178e889..28a4af4 100644
--- a/lib/transmit.c
+++ b/lib/transmit.c
@@ -302,20 +302,20 @@ static void send_pre(struct ir_remote* remote)
 	if (has_pre(remote)) {
 		send_data(remote, remote->pre_data, remote->pre_data_bits, 0);
+        }
 		if (remote->pre_p > 0 && remote->pre_s > 0) {
-	}
 static void send_post(struct ir_remote* remote)
-	if (has_post(remote)) {
 		if (remote->post_p > 0 && remote->post_s > 0) {
+        if (has_post(remote)) {
 		send_data(remote, remote->post_data, remote->post_data_bits, remote->pre_data_bits + remote->bits);

More information about the Pkg-lirc-maint mailing list