Mercurial > mplayer.hg
comparison input/lirc.c @ 4432:5105f5da01d6
Added lirc support in input
author | albeu |
---|---|
date | Thu, 31 Jan 2002 09:39:11 +0000 |
parents | |
children | c619a7271690 |
comparison
equal
deleted
inserted
replaced
4431:44c23fd75005 | 4432:5105f5da01d6 |
---|---|
1 | |
2 #include "../config.h" | |
3 | |
4 #ifdef HAVE_LIRC | |
5 | |
6 #include <lirc/lirc_client.h> | |
7 #include <errno.h> | |
8 #include <stdio.h> | |
9 #include <sys/ioctl.h> | |
10 #include <string.h> | |
11 #include <fcntl.h> | |
12 #include <unistd.h> | |
13 #include <signal.h> | |
14 #include <sys/types.h> | |
15 #include <sys/wait.h> | |
16 #include <stdlib.h> | |
17 | |
18 | |
19 #include "../mp_msg.h" | |
20 #include "../help_mp.h" | |
21 | |
22 static struct lirc_config *lirc_config; | |
23 extern char *lirc_configfile; | |
24 | |
25 static int child_pid=0; | |
26 | |
27 static void | |
28 mp_input_lirc_process_quit(int sig); | |
29 | |
30 static void | |
31 mp_input_lirc_process(int mp_fd); | |
32 | |
33 | |
34 int | |
35 mp_input_lirc_init(void) { | |
36 int lirc_flags; | |
37 int lirc_sock; | |
38 int p[2]; | |
39 | |
40 mp_msg(MSGT_LIRC,MSGL_INFO,MSGTR_SettingUpLIRC); | |
41 if((lirc_sock=lirc_init("mplayer",1))==-1){ | |
42 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCopenfailed MSGTR_LIRCdisabled); | |
43 return -1; | |
44 } | |
45 | |
46 #if 0 | |
47 fcntl(lirc_sock,F_SETOWN,getpid()); | |
48 lirc_flags=fcntl(lirc_sock,F_GETFL,0); | |
49 if(lirc_flags!=-1) { | |
50 fcntl(lirc_sock,F_SETFL,lirc_flags|O_NONBLOCK); | |
51 } else { | |
52 lirc_deinit(); | |
53 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCsocketerr MSGTR_LIRCdisabled,strerror(errno)); | |
54 return -1; | |
55 } | |
56 #endif | |
57 | |
58 | |
59 if(lirc_readconfig( lirc_configfile,&lirc_config,NULL )!=0 ){ | |
60 mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCcfgerr MSGTR_LIRCdisabled, | |
61 lirc_configfile == NULL ? "~/.lircrc" : lirc_configfile); | |
62 lirc_deinit(); | |
63 return -1; | |
64 } | |
65 | |
66 if(pipe(p) != 0) { | |
67 mp_msg(MSGT_LIRC,MSGL_ERR,"Can't create lirc pipe : %s\n",strerror(errno)); | |
68 lirc_deinit(); | |
69 } | |
70 | |
71 child_pid = fork(); | |
72 | |
73 if(child_pid < 0) { | |
74 mp_msg(MSGT_LIRC,MSGL_ERR,"Can't fork lirc subprocess : %s\n",strerror(errno)); | |
75 lirc_deinit(); | |
76 close(p[0]); | |
77 close(p[1]); | |
78 return -1; | |
79 } else if(child_pid == 0) {// setup child process | |
80 close(p[0]); | |
81 // put some signal handlers | |
82 signal(SIGINT,mp_input_lirc_process_quit); | |
83 signal(SIGHUP,mp_input_lirc_process_quit); | |
84 signal(SIGQUIT,mp_input_lirc_process_quit); | |
85 // start the process | |
86 mp_input_lirc_process(p[1]); | |
87 } | |
88 | |
89 // free unuseful ressources in parent process | |
90 lirc_freeconfig(lirc_config); | |
91 close(p[1]); | |
92 | |
93 mp_msg(MSGT_LIRC,MSGL_V,"NEW LIRC init was successful.\n"); | |
94 | |
95 return p[0]; | |
96 } | |
97 | |
98 static void | |
99 mp_input_lirc_process_quit(int sig) { | |
100 lirc_freeconfig(lirc_config); | |
101 lirc_deinit(); | |
102 exit(sig > 0 ? 0 : -1); | |
103 } | |
104 | |
105 static void | |
106 mp_input_lirc_process(int mp_fd) { | |
107 char *cmd,*code; | |
108 int ret; | |
109 | |
110 while(lirc_nextcode(&code)==0) { | |
111 if(code==NULL) | |
112 continue; | |
113 while((ret=lirc_code2char(lirc_config,code,&cmd))==0 && cmd!=NULL) { | |
114 int len = strlen(cmd)+1; | |
115 char buf[len]; | |
116 int w=0; | |
117 strcpy(buf,cmd); | |
118 buf[len-1] = '\n'; | |
119 while(w < len) { | |
120 int r = write(mp_fd,buf,len-w); | |
121 if(r < 0) { | |
122 if(errno == EINTR) | |
123 continue; | |
124 mp_msg(MSGT_LIRC,MSGL_V,"LIRC subprocess can't write in input pipe : %s\n", | |
125 strerror(errno)); | |
126 mp_input_lirc_process_quit(-1); | |
127 } | |
128 w += r; | |
129 } | |
130 } | |
131 free(code); | |
132 if(ret==-1) | |
133 break; | |
134 } | |
135 mp_input_lirc_process_quit(-1); | |
136 } | |
137 | |
138 void | |
139 mp_input_lirc_uninit(void) { | |
140 if( kill(child_pid,SIGQUIT) != 0) { | |
141 mp_msg(MSGT_LIRC,MSGL_V,"LIRC can't kill subprocess %d : %s\n", | |
142 child_pid,strerror(errno)); | |
143 return; | |
144 } | |
145 | |
146 if(waitpid(child_pid,NULL,0) < 0) | |
147 mp_msg(MSGT_LIRC,MSGL_V,"LIRC error while waiting subprocess %d : %s\n", | |
148 child_pid,strerror(errno)); | |
149 | |
150 } | |
151 | |
152 #endif |