2 * This file is part of MPlayer.
4 * MPlayer is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * MPlayer is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include <lirc/lirc_client.h>
26 #include <sys/types.h>
34 static struct lirc_config
*lirc_config
;
35 char *lirc_configfile
;
37 static char* cmd_buf
= NULL
;
40 mp_input_lirc_init(void) {
43 mp_msg(MSGT_LIRC
,MSGL_V
,MSGTR_SettingUpLIRC
);
44 if((lirc_sock
=lirc_init("mplayer",1))==-1){
45 mp_msg(MSGT_LIRC
,MSGL_ERR
,MSGTR_LIRCopenfailed
);
49 if(lirc_readconfig( lirc_configfile
,&lirc_config
,NULL
)!=0 ){
50 mp_msg(MSGT_LIRC
,MSGL_ERR
,MSGTR_LIRCcfgerr
,
51 lirc_configfile
== NULL
? "~/.lircrc" : lirc_configfile
);
59 int mp_input_lirc_read(int fd
,char* dest
, int s
) {
63 char *code
= NULL
,*c
= NULL
;
65 // We have something in the buffer return it
67 int l
= strlen(cmd_buf
), w
= l
> s
? s
: l
;
68 memcpy(dest
,cmd_buf
,w
);
71 memmove(cmd_buf
,&cmd_buf
[w
],l
+1);
79 // Nothing in the buffer, pool the lirc fd
82 memset(&tv
,0,sizeof(tv
));
83 while((r
= select(fd
+1,&fds
,NULL
,NULL
,&tv
)) <= 0) {
87 mp_msg(MSGT_INPUT
,MSGL_ERR
,"Select error : %s\n",strerror(errno
));
88 return MP_INPUT_ERROR
;
90 return MP_INPUT_NOTHING
;
93 // There's something to read
94 if(lirc_nextcode(&code
) != 0) {
95 mp_msg(MSGT_INPUT
,MSGL_ERR
,"Lirc error :(\n");
99 if(!code
) return MP_INPUT_NOTHING
;
101 // We put all cmds in a single buffer separated by \n
102 while((r
= lirc_code2char(lirc_config
,code
,&c
))==0 && c
!=NULL
) {
106 cmd_buf
= realloc(cmd_buf
,cl
+l
+2);
107 memcpy(&cmd_buf
[cl
],c
,l
);
109 cmd_buf
[cl
-1] = '\n';
116 return MP_INPUT_DEAD
;
117 else if(cmd_buf
) // return the first command in the buffer
118 return mp_input_lirc_read(fd
,dest
,s
);
120 return MP_INPUT_RETRY
;
125 mp_input_lirc_close(int fd
) {
130 lirc_freeconfig(lirc_config
);