Mercurial > mplayer.hg
annotate input/lirc.c @ 33468:86b2ec222a2c
Make "Invalid seek to negative position" message more useful by
printing the actual value.
author | reimar |
---|---|
date | Sat, 04 Jun 2011 09:30:42 +0000 |
parents | 8fa2f43cb760 |
children | 277ec491a8a7 |
rev | line source |
---|---|
28112 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
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. | |
8 * | |
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. | |
13 * | |
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. | |
17 */ | |
4432 | 18 |
16860 | 19 #include "config.h" |
4432 | 20 |
21 #include <lirc/lirc_client.h> | |
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 | 24 #include <stdio.h> |
25 #include <string.h> | |
26 #include <unistd.h> | |
27 #include <stdlib.h> | |
28 | |
16860 | 29 #include "mp_msg.h" |
30 #include "help_mp.h" | |
7883 | 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 | 33 |
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 | 36 |
7883 | 37 static char* cmd_buf = NULL; |
4432 | 38 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28355
diff
changeset
|
39 int |
4432 | 40 mp_input_lirc_init(void) { |
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 | 43 |
20185 | 44 mp_msg(MSGT_LIRC,MSGL_V,MSGTR_SettingUpLIRC); |
4432 | 45 if((lirc_sock=lirc_init("mplayer",1))==-1){ |
20185 | 46 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCopenfailed); |
4432 | 47 return -1; |
48 } | |
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 | 54 lirc_deinit(); |
55 return -1; | |
56 } | |
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 | 65 return lirc_sock; |
4432 | 66 } |
67 | |
7883 | 68 int mp_input_lirc_read(int fd,char* dest, int s) { |
69 int r,cl = 0; | |
70 char *code = NULL,*c = NULL; | |
4432 | 71 |
7883 | 72 // We have something in the buffer return it |
73 if(cmd_buf != NULL) { | |
74 int l = strlen(cmd_buf), w = l > s ? s : l; | |
75 memcpy(dest,cmd_buf,w); | |
76 l -= w; | |
77 if(l > 0) | |
78 memmove(cmd_buf,&cmd_buf[w],l+1); | |
79 else { | |
80 free(cmd_buf); | |
81 cmd_buf = NULL; | |
82 } | |
83 return w; | |
84 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28355
diff
changeset
|
85 |
28321 | 86 // Nothing in the buffer, poll the lirc fd |
7883 | 87 if(lirc_nextcode(&code) != 0) { |
28354 | 88 mp_msg(MSGT_LIRC,MSGL_ERR,"Lirc error :(\n"); |
7883 | 89 return MP_INPUT_DEAD; |
90 } | |
4432 | 91 |
7883 | 92 if(!code) return MP_INPUT_NOTHING; |
93 | |
94 // We put all cmds in a single buffer separated by \n | |
95 while((r = lirc_code2char(lirc_config,code,&c))==0 && c!=NULL) { | |
96 int l = strlen(c); | |
97 if(l <= 0) | |
4432 | 98 continue; |
7883 | 99 cmd_buf = realloc(cmd_buf,cl+l+2); |
100 memcpy(&cmd_buf[cl],c,l); | |
101 cl += l+1; | |
102 cmd_buf[cl-1] = '\n'; | |
103 cmd_buf[cl] = '\0'; | |
4432 | 104 } |
7883 | 105 |
106 free(code); | |
107 | |
108 if(r < 0) | |
109 return MP_INPUT_DEAD; | |
110 else if(cmd_buf) // return the first command in the buffer | |
111 return mp_input_lirc_read(fd,dest,s); | |
112 else | |
15825 | 113 return MP_INPUT_RETRY; |
7883 | 114 |
4432 | 115 } |
116 | |
117 void | |
7883 | 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 | 121 lirc_freeconfig(lirc_config); |
122 lirc_deinit(); | |
4432 | 123 } |