annotate input/lirc.c @ 28177:8eaa8e269bd6

synced with r28211
author Gabrov
date Tue, 30 Dec 2008 12:48:17 +0000
parents 142c53391eb7
children 1dc02f91a9b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28112
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
1 /*
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
2 * This file is part of MPlayer.
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
3 *
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
5 * it under the terms of the GNU General Public License as published by
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
7 * (at your option) any later version.
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
8 *
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
12 * GNU General Public License for more details.
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
13 *
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
14 * You should have received a copy of the GNU General Public License along
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
142c53391eb7 Add standard GPL license header.
diego
parents: 20191
diff changeset
17 */
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
18
16860
a68ede010f66 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15825
diff changeset
19 #include "config.h"
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
20
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
21 #include <lirc/lirc_client.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
22 #include <errno.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
23 #include <stdio.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
24 #include <string.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
25 #include <unistd.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
26 #include <sys/types.h>
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
27 #include <sys/time.h>
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
28 #include <stdlib.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
29
16860
a68ede010f66 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15825
diff changeset
30 #include "mp_msg.h"
a68ede010f66 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15825
diff changeset
31 #include "help_mp.h"
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
32 #include "input.h"
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
33
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
34 static struct lirc_config *lirc_config;
4823
d25b898c4c44 Make old and new lirc support independant from each other
albeu
parents: 4526
diff changeset
35 char *lirc_configfile;
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
36
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
37 static char* cmd_buf = NULL;
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
38
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
39 int
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
40 mp_input_lirc_init(void) {
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
41 int lirc_sock;
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
42
20185
b6eed21e0535 slight overall verbosity reduction
diego
parents: 19801
diff changeset
43 mp_msg(MSGT_LIRC,MSGL_V,MSGTR_SettingUpLIRC);
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
44 if((lirc_sock=lirc_init("mplayer",1))==-1){
20185
b6eed21e0535 slight overall verbosity reduction
diego
parents: 19801
diff changeset
45 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCopenfailed);
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
46 return -1;
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
47 }
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
48
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
49 if(lirc_readconfig( lirc_configfile,&lirc_config,NULL )!=0 ){
20191
871ae3b173bd litle bug, didn't compile :(
ptt
parents: 20185
diff changeset
50 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCcfgerr,
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
51 lirc_configfile == NULL ? "~/.lircrc" : lirc_configfile);
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
52 lirc_deinit();
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
53 return -1;
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
54 }
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
55
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
56 return lirc_sock;
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
57 }
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
58
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
59 int mp_input_lirc_read(int fd,char* dest, int s) {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
60 fd_set fds;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
61 struct timeval tv;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
62 int r,cl = 0;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
63 char *code = NULL,*c = NULL;
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
64
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
65 // We have something in the buffer return it
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
66 if(cmd_buf != NULL) {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
67 int l = strlen(cmd_buf), w = l > s ? s : l;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
68 memcpy(dest,cmd_buf,w);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
69 l -= w;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
70 if(l > 0)
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
71 memmove(cmd_buf,&cmd_buf[w],l+1);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
72 else {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
73 free(cmd_buf);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
74 cmd_buf = NULL;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
75 }
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
76 return w;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
77 }
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
78
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
79 // Nothing in the buffer, pool the lirc fd
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
80 FD_ZERO(&fds);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
81 FD_SET(fd,&fds);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
82 memset(&tv,0,sizeof(tv));
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
83 while((r = select(fd+1,&fds,NULL,NULL,&tv)) <= 0) {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
84 if(r < 0) {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
85 if(errno == EINTR)
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
86 continue;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
87 mp_msg(MSGT_INPUT,MSGL_ERR,"Select error : %s\n",strerror(errno));
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
88 return MP_INPUT_ERROR;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
89 } else
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
90 return MP_INPUT_NOTHING;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
91 }
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
92
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
93 // There's something to read
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
94 if(lirc_nextcode(&code) != 0) {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
95 mp_msg(MSGT_INPUT,MSGL_ERR,"Lirc error :(\n");
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
96 return MP_INPUT_DEAD;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
97 }
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
98
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
99 if(!code) return MP_INPUT_NOTHING;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
100
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
101 // We put all cmds in a single buffer separated by \n
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
102 while((r = lirc_code2char(lirc_config,code,&c))==0 && c!=NULL) {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
103 int l = strlen(c);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
104 if(l <= 0)
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
105 continue;
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
106 cmd_buf = realloc(cmd_buf,cl+l+2);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
107 memcpy(&cmd_buf[cl],c,l);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
108 cl += l+1;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
109 cmd_buf[cl-1] = '\n';
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
110 cmd_buf[cl] = '\0';
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
111 }
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
112
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
113 free(code);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
114
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
115 if(r < 0)
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
116 return MP_INPUT_DEAD;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
117 else if(cmd_buf) // return the first command in the buffer
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
118 return mp_input_lirc_read(fd,dest,s);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
119 else
15825
8549fc0fb5b1 consume empty lirc events at once.
reimar
parents: 7883
diff changeset
120 return MP_INPUT_RETRY;
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
121
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
122 }
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
123
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
124 void
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
125 mp_input_lirc_close(int fd) {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
126 if(cmd_buf) {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
127 free(cmd_buf);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
128 cmd_buf = NULL;
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
129 }
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
130 lirc_freeconfig(lirc_config);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
131 lirc_deinit();
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
132 }