annotate input/lirc.c @ 35959:acec130e2ab2

Free list and hash table data on widget destruction. This immediately releases the memory and doesn't wait until next widget construction to free old data then.
author ib
date Sun, 24 Mar 2013 14:16:34 +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 }