From ebdb9bffa36c7017c2f472641f3799b7003147e0 Mon Sep 17 00:00:00 2001 From: albeu Date: Thu, 31 Jan 2002 09:39:11 +0000 Subject: Added lirc support in input git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@4433 b3059339-0415-0410-9bf9-f77b7e298cf2 --- input/lirc.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 input/lirc.c (limited to 'input/lirc.c') diff --git a/input/lirc.c b/input/lirc.c new file mode 100644 index 0000000000..0582ed676a --- /dev/null +++ b/input/lirc.c @@ -0,0 +1,152 @@ + +#include "../config.h" + +#ifdef HAVE_LIRC + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "../mp_msg.h" +#include "../help_mp.h" + +static struct lirc_config *lirc_config; +extern char *lirc_configfile; + +static int child_pid=0; + +static void +mp_input_lirc_process_quit(int sig); + +static void +mp_input_lirc_process(int mp_fd); + + +int +mp_input_lirc_init(void) { + int lirc_flags; + int lirc_sock; + int p[2]; + + mp_msg(MSGT_LIRC,MSGL_INFO,MSGTR_SettingUpLIRC); + if((lirc_sock=lirc_init("mplayer",1))==-1){ + mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCopenfailed MSGTR_LIRCdisabled); + return -1; + } + +#if 0 + fcntl(lirc_sock,F_SETOWN,getpid()); + lirc_flags=fcntl(lirc_sock,F_GETFL,0); + if(lirc_flags!=-1) { + fcntl(lirc_sock,F_SETFL,lirc_flags|O_NONBLOCK); + } else { + lirc_deinit(); + mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCsocketerr MSGTR_LIRCdisabled,strerror(errno)); + return -1; + } +#endif + + + if(lirc_readconfig( lirc_configfile,&lirc_config,NULL )!=0 ){ + mp_msg(MSGT_LIRC,MSGL_ERR,MSGTR_LIRCcfgerr MSGTR_LIRCdisabled, + lirc_configfile == NULL ? "~/.lircrc" : lirc_configfile); + lirc_deinit(); + return -1; + } + + if(pipe(p) != 0) { + mp_msg(MSGT_LIRC,MSGL_ERR,"Can't create lirc pipe : %s\n",strerror(errno)); + lirc_deinit(); + } + + child_pid = fork(); + + if(child_pid < 0) { + mp_msg(MSGT_LIRC,MSGL_ERR,"Can't fork lirc subprocess : %s\n",strerror(errno)); + lirc_deinit(); + close(p[0]); + close(p[1]); + return -1; + } else if(child_pid == 0) {// setup child process + close(p[0]); + // put some signal handlers + signal(SIGINT,mp_input_lirc_process_quit); + signal(SIGHUP,mp_input_lirc_process_quit); + signal(SIGQUIT,mp_input_lirc_process_quit); + // start the process + mp_input_lirc_process(p[1]); + } + + // free unuseful ressources in parent process + lirc_freeconfig(lirc_config); + close(p[1]); + + mp_msg(MSGT_LIRC,MSGL_V,"NEW LIRC init was successful.\n"); + + return p[0]; +} + +static void +mp_input_lirc_process_quit(int sig) { + lirc_freeconfig(lirc_config); + lirc_deinit(); + exit(sig > 0 ? 0 : -1); +} + +static void +mp_input_lirc_process(int mp_fd) { + char *cmd,*code; + int ret; + + while(lirc_nextcode(&code)==0) { + if(code==NULL) + continue; + while((ret=lirc_code2char(lirc_config,code,&cmd))==0 && cmd!=NULL) { + int len = strlen(cmd)+1; + char buf[len]; + int w=0; + strcpy(buf,cmd); + buf[len-1] = '\n'; + while(w < len) { + int r = write(mp_fd,buf,len-w); + if(r < 0) { + if(errno == EINTR) + continue; + mp_msg(MSGT_LIRC,MSGL_V,"LIRC subprocess can't write in input pipe : %s\n", + strerror(errno)); + mp_input_lirc_process_quit(-1); + } + w += r; + } + } + free(code); + if(ret==-1) + break; + } + mp_input_lirc_process_quit(-1); +} + +void +mp_input_lirc_uninit(void) { + if( kill(child_pid,SIGQUIT) != 0) { + mp_msg(MSGT_LIRC,MSGL_V,"LIRC can't kill subprocess %d : %s\n", + child_pid,strerror(errno)); + return; + } + + if(waitpid(child_pid,NULL,0) < 0) + mp_msg(MSGT_LIRC,MSGL_V,"LIRC error while waiting subprocess %d : %s\n", + child_pid,strerror(errno)); + +} + +#endif -- cgit v1.2.3