Mercurial > mplayer.hg
annotate input/lirc.c @ 37104:91b00a4407cd
demux_real: Improve buffer allocation for interleaved audio handling.
Allocate buffers where they are needed.
This avoids code duplication, allocating them when they are not
needed, and might avoid a crash if an audio stream is specified
via -aid that does not exist in the headers but does exist in the
file since then we might run the deinterleaving without having
the buffers allocated first (note: I have not tested this can
actually happen).
| author | reimar |
|---|---|
| date | Tue, 13 May 2014 21:06:38 +0000 |
| parents | 277ec491a8a7 |
| children |
| 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 |
|
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 | 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 } |
