annotate input/lirc.c @ 37171:29802bb119f6

Add new FFmpeg AMVF tag for AMV video.
author reimar
date Sat, 06 Sep 2014 19:51:59 +0000
parents 277ec491a8a7
children
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>
28345
3a08f32c8fa1 Do not use select n lirc code, instead set the fd non-blocking.
reimar
parents: 28321
diff changeset
23 #include <fcntl.h>
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
24 #include <stdio.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
25 #include <string.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
26 #include <unistd.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
27 #include <stdlib.h>
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
28
16860
a68ede010f66 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15825
diff changeset
29 #include "mp_msg.h"
a68ede010f66 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15825
diff changeset
30 #include "help_mp.h"
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
31 #include "input.h"
30725
ca614fc25817 Include lirc.h in lirc.c to add missing prototypes.
cehoyos
parents: 29263
diff changeset
32 #include "lirc.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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28355
diff changeset
39 int
4432
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;
28345
3a08f32c8fa1 Do not use select n lirc code, instead set the fd non-blocking.
reimar
parents: 28321
diff changeset
42 int mode;
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
43
33827
277ec491a8a7 Do not translate console messages of verbosity level MSGL_V and above.
diego
parents: 32537
diff changeset
44 mp_msg(MSGT_LIRC, MSGL_V, "Setting up LIRC support...\n");
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
45 if((lirc_sock=lirc_init("mplayer",1))==-1){
20185
b6eed21e0535 slight overall verbosity reduction
diego
parents: 19801
diff changeset
46 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCopenfailed);
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
47 return -1;
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
48 }
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
49
28355
418d7d213966 Move setting of O_NONBLOCK before lirc_readconfig, this avoids a memleak
reimar
parents: 28354
diff changeset
50 mode = fcntl(lirc_sock, F_GETFL);
418d7d213966 Move setting of O_NONBLOCK before lirc_readconfig, this avoids a memleak
reimar
parents: 28354
diff changeset
51 if (mode < 0 || fcntl(lirc_sock, F_SETFL, mode | O_NONBLOCK) < 0) {
418d7d213966 Move setting of O_NONBLOCK before lirc_readconfig, this avoids a memleak
reimar
parents: 28354
diff changeset
52 mp_msg(MSGT_LIRC, MSGL_ERR, "setting non-blocking mode failed: %s\n",
418d7d213966 Move setting of O_NONBLOCK before lirc_readconfig, this avoids a memleak
reimar
parents: 28354
diff changeset
53 strerror(errno));
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
54 lirc_deinit();
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
55 return -1;
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
56 }
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
57
28355
418d7d213966 Move setting of O_NONBLOCK before lirc_readconfig, this avoids a memleak
reimar
parents: 28354
diff changeset
58 if(lirc_readconfig( lirc_configfile,&lirc_config,NULL )!=0 ){
418d7d213966 Move setting of O_NONBLOCK before lirc_readconfig, this avoids a memleak
reimar
parents: 28354
diff changeset
59 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCcfgerr,
418d7d213966 Move setting of O_NONBLOCK before lirc_readconfig, this avoids a memleak
reimar
parents: 28354
diff changeset
60 lirc_configfile == NULL ? "~/.lircrc" : lirc_configfile);
28345
3a08f32c8fa1 Do not use select n lirc code, instead set the fd non-blocking.
reimar
parents: 28321
diff changeset
61 lirc_deinit();
3a08f32c8fa1 Do not use select n lirc code, instead set the fd non-blocking.
reimar
parents: 28321
diff changeset
62 return -1;
3a08f32c8fa1 Do not use select n lirc code, instead set the fd non-blocking.
reimar
parents: 28321
diff changeset
63 }
3a08f32c8fa1 Do not use select n lirc code, instead set the fd non-blocking.
reimar
parents: 28321
diff changeset
64
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
65 return lirc_sock;
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
66 }
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
67
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
68 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
69 int r,cl = 0;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
70 char *code = NULL,*c = NULL;
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
71
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
72 // We have something in the buffer return it
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
73 if(cmd_buf != NULL) {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
74 int l = strlen(cmd_buf), w = l > s ? s : l;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
75 memcpy(dest,cmd_buf,w);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
76 l -= w;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
77 if(l > 0)
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
78 memmove(cmd_buf,&cmd_buf[w],l+1);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
79 else {
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
80 free(cmd_buf);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
81 cmd_buf = NULL;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
82 }
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
83 return w;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
84 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28355
diff changeset
85
28321
1dc02f91a9b4 Fix typo: pool -> poll
reimar
parents: 28112
diff changeset
86 // Nothing in the buffer, poll the lirc fd
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
87 if(lirc_nextcode(&code) != 0) {
28354
5b1f6e52673b Fix an MSGT_INPUT to MSGT_LIRC in lirc.c
reimar
parents: 28345
diff changeset
88 mp_msg(MSGT_LIRC,MSGL_ERR,"Lirc error :(\n");
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
89 return MP_INPUT_DEAD;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
90 }
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
91
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
92 if(!code) return MP_INPUT_NOTHING;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
93
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
94 // 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
95 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
96 int l = strlen(c);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
97 if(l <= 0)
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
98 continue;
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
99 cmd_buf = realloc(cmd_buf,cl+l+2);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
100 memcpy(&cmd_buf[cl],c,l);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
101 cl += l+1;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
102 cmd_buf[cl-1] = '\n';
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
103 cmd_buf[cl] = '\0';
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
104 }
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
105
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
106 free(code);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
107
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
108 if(r < 0)
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
109 return MP_INPUT_DEAD;
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
110 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
111 return mp_input_lirc_read(fd,dest,s);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
112 else
15825
8549fc0fb5b1 consume empty lirc events at once.
reimar
parents: 7883
diff changeset
113 return MP_INPUT_RETRY;
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
114
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
115 }
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
116
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
117 void
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
118 mp_input_lirc_close(int fd) {
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 30725
diff changeset
119 free(cmd_buf);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 30725
diff changeset
120 cmd_buf = NULL;
7883
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
121 lirc_freeconfig(lirc_config);
d375383e1a48 rewrote the lirc code to remove the fork
arpi
parents: 5196
diff changeset
122 lirc_deinit();
4432
5105f5da01d6 Added lirc support in input
albeu
parents:
diff changeset
123 }