Add a comment that explains why this header has no multiple inclusion guards.
[mplayer/greg.git] / input / lirc.c
blobe76ee85b9aa5c94edccc49d8a0c8aa720ce15ac3
2 #include "config.h"
4 #include <lirc/lirc_client.h>
5 #include <errno.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <unistd.h>
9 #include <sys/types.h>
10 #include <sys/time.h>
11 #include <stdlib.h>
13 #include "mp_msg.h"
14 #include "help_mp.h"
15 #include "input.h"
17 static struct lirc_config *lirc_config;
18 char *lirc_configfile;
20 static char* cmd_buf = NULL;
22 int
23 mp_input_lirc_init(void) {
24 int lirc_sock;
26 mp_msg(MSGT_LIRC,MSGL_V,MSGTR_SettingUpLIRC);
27 if((lirc_sock=lirc_init("mplayer",1))==-1){
28 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCopenfailed);
29 return -1;
32 if(lirc_readconfig( lirc_configfile,&lirc_config,NULL )!=0 ){
33 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCcfgerr,
34 lirc_configfile == NULL ? "~/.lircrc" : lirc_configfile);
35 lirc_deinit();
36 return -1;
39 return lirc_sock;
42 int mp_input_lirc_read(int fd,char* dest, int s) {
43 fd_set fds;
44 struct timeval tv;
45 int r,cl = 0;
46 char *code = NULL,*c = NULL;
48 // We have something in the buffer return it
49 if(cmd_buf != NULL) {
50 int l = strlen(cmd_buf), w = l > s ? s : l;
51 memcpy(dest,cmd_buf,w);
52 l -= w;
53 if(l > 0)
54 memmove(cmd_buf,&cmd_buf[w],l+1);
55 else {
56 free(cmd_buf);
57 cmd_buf = NULL;
59 return w;
62 // Nothing in the buffer, pool the lirc fd
63 FD_ZERO(&fds);
64 FD_SET(fd,&fds);
65 memset(&tv,0,sizeof(tv));
66 while((r = select(fd+1,&fds,NULL,NULL,&tv)) <= 0) {
67 if(r < 0) {
68 if(errno == EINTR)
69 continue;
70 mp_msg(MSGT_INPUT,MSGL_ERR,"Select error : %s\n",strerror(errno));
71 return MP_INPUT_ERROR;
72 } else
73 return MP_INPUT_NOTHING;
76 // There's something to read
77 if(lirc_nextcode(&code) != 0) {
78 mp_msg(MSGT_INPUT,MSGL_ERR,"Lirc error :(\n");
79 return MP_INPUT_DEAD;
82 if(!code) return MP_INPUT_NOTHING;
84 // We put all cmds in a single buffer separated by \n
85 while((r = lirc_code2char(lirc_config,code,&c))==0 && c!=NULL) {
86 int l = strlen(c);
87 if(l <= 0)
88 continue;
89 cmd_buf = realloc(cmd_buf,cl+l+2);
90 memcpy(&cmd_buf[cl],c,l);
91 cl += l+1;
92 cmd_buf[cl-1] = '\n';
93 cmd_buf[cl] = '\0';
96 free(code);
98 if(r < 0)
99 return MP_INPUT_DEAD;
100 else if(cmd_buf) // return the first command in the buffer
101 return mp_input_lirc_read(fd,dest,s);
102 else
103 return MP_INPUT_RETRY;
107 void
108 mp_input_lirc_close(int fd) {
109 if(cmd_buf) {
110 free(cmd_buf);
111 cmd_buf = NULL;
113 lirc_freeconfig(lirc_config);
114 lirc_deinit();