I've just written a little piece of code to intercept the IR device before and make beeps.
This should be run before the player; one way to do this is to rename
/sbin/init
to /sbin/init.empeg
and replace the
original with something like this:
#!/bin/bash # /bin/intercept& exec /sbin/init.empeg
ir.h
/* * ir.h * * /dev/ir codes from the empeg * * the top 16 bits of each code should be zero */ /* * Front panel buttons */ #define IR_TOP_BUTTON_PRESSED 0x00000000 #define IR_TOP_BUTTON_RELEASED 0x00000001 #define IR_RIGHT_BUTTON_PRESSED 0x00000002 #define IR_RIGHT_BUTTON_RELEASED 0x00000003 #define IR_LEFT_BUTTON_PRESSED 0x00000004 #define IR_LEFT_BUTTON_RELEASED 0x00000005 #define IR_BOTTOM_BUTTON_PRESSED 0x00000006 #define IR_BOTTOM_BUTTON_RELEASED 0x00000007 /* * Kenwood RCA-R6A remote */ #define IR_0 0x0000B900 #define IR_1 0x0000B901 #define IR_2 0x0000B902 #define IR_3 0x0000B903 #define IR_4 0x0000B904 #define IR_5 0x0000B905 #define IR_6 0x0000B906 #define IR_7 0x0000B907 #define IR_8 0x0000B908 #define IR_9 0x0000B909 #define IR_TRACK_MINUS 0x0000B90A #define IR_TRACK_PLUS 0x0000B90B #define IR_AM 0x0000B90C #define IR_FM 0x0000B90D #define IR_PROG 0x0000B90E #define IR_DIRECT 0x0000B90F #define IR_VOL_PLUS 0x0000B914 #define IR_VOL_MINUS 0x0000B915 #define IR_STAR 0x0000B91B #define IR_TUNER 0x0000B91C #define IR_TAPE 0x0000B91D #define IR_CD 0x0000B91E #define IR_CDMDCH 0x0000B91F #define IR_DNPP 0x0000B95E
intercept.c
/* * Intercept.c * * To use this code you need to rename /dev/ir to * /dev/ir_real, mkfifo /dev/ir and put intercept * into the startup by moving /sbin/init to /sbin/init.empeg * and creating a script called init to call intercept * first and then the real init. * * It will then intercept IR codes and do a beep * before passing them onto the player. I have noticed that * the beep sometimes lags the press, I suspect the intercept * process is being swapped out by the caching facility. * * Thanks to Mike Crowe @empeg for the dsp ioctl * * Obviously I take no responsibilty for this mess ;-) * * Steve Boyle sysboy@hotmail.com * */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/ioctl.h> #include <math.h> #include "ir.h" #define REAL_IR_DEV "/dev/ir_real" #define IR_DEV "/dev/ir" #define DSP_DEV "/dev/dsp" #define EMPEG_DSP_MAGIC 'a' #define EMPEG_DSP_BEEP _IOW(EMPEG_DSP_MAGIC, 0, int) main(argc,argv) int argc; char *argv[]; { int irfd; int irrealfd; ssize_t rts; long ircode; int dspfd; int pitch = 80; int duration = 25; int args[2]; args[0] = pitch; args[1] = duration; irrealfd = open(REAL_IR_DEV, O_RDONLY&O_NDELAY&O_NONBLOCK); if ( irrealfd == -1 ) { perror("Opening real IR device."); exit(1); } irfd = open(IR_DEV, O_WRONLY); if ( irfd == -1 ) { perror("Opening phony IR device."); close(irrealfd); exit(1); } dspfd = open(DSP_DEV, O_RDONLY); if ( dspfd == -1 ) { perror("Opening DSP device."); close(irrealfd); close(irfd); exit(1); } for (;;) { rts = read(irrealfd, (char *) &ircode, 4); if (rts == -1 ) { perror("Reading from real IR device."); close(irfd); close(irrealfd); exit(1); } if (rts == 0 ) { perror("Finished reading from real IR device."); close(irfd); close(irrealfd); exit(0); } switch (ircode) { case IR_TOP_BUTTON_RELEASED: case IR_RIGHT_BUTTON_RELEASED: case IR_LEFT_BUTTON_RELEASED: case IR_BOTTOM_BUTTON_RELEASED: break; /* do nothing for releases */ default: if (ioctl(dspfd, EMPEG_DSP_BEEP, args) < 0) { perror("ioctl.\n"); close(irfd); close(irrealfd); close(dspfd); exit(1); } } rts = write(irfd, (char *) &ircode, 4); if (rts == -1 ) { perror("Writing to phony IR device."); close(irfd); close(irrealfd); exit(1); } } }