Mercurial > mplayer.hg
changeset 28345:3a08f32c8fa1
Do not use select n lirc code, instead set the fd non-blocking.
select can not work because lirc_nextcode buffers data internally,
causing events to be delayed until the next keypress in some cases.
Patch by Dennis Vshivkov [jaimor (at) orcon net nz]
author | reimar |
---|---|
date | Tue, 27 Jan 2009 19:06:50 +0000 |
parents | a69d51cd4ee3 |
children | d6d819415c83 |
files | input/lirc.c |
diffstat | 1 files changed, 10 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/input/lirc.c Tue Jan 27 10:02:47 2009 +0000 +++ b/input/lirc.c Tue Jan 27 19:06:50 2009 +0000 @@ -20,11 +20,10 @@ #include <lirc/lirc_client.h> #include <errno.h> +#include <fcntl.h> #include <stdio.h> #include <string.h> #include <unistd.h> -#include <sys/types.h> -#include <sys/time.h> #include <stdlib.h> #include "mp_msg.h" @@ -39,6 +38,7 @@ int mp_input_lirc_init(void) { int lirc_sock; + int mode; mp_msg(MSGT_LIRC,MSGL_V,MSGTR_SettingUpLIRC); if((lirc_sock=lirc_init("mplayer",1))==-1){ @@ -53,12 +53,18 @@ return -1; } + mode = fcntl(lirc_sock, F_GETFL); + if (mode < 0 || fcntl(lirc_sock, F_SETFL, mode | O_NONBLOCK) < 0) { + mp_msg(MSGT_LIRC, MSGL_ERR, "setting non-blocking mode failed: %s\n", + strerror(errno)); + lirc_deinit(); + return -1; + } + return lirc_sock; } int mp_input_lirc_read(int fd,char* dest, int s) { - fd_set fds; - struct timeval tv; int r,cl = 0; char *code = NULL,*c = NULL; @@ -77,20 +83,6 @@ } // Nothing in the buffer, poll the lirc fd - FD_ZERO(&fds); - FD_SET(fd,&fds); - memset(&tv,0,sizeof(tv)); - while((r = select(fd+1,&fds,NULL,NULL,&tv)) <= 0) { - if(r < 0) { - if(errno == EINTR) - continue; - mp_msg(MSGT_INPUT,MSGL_ERR,"Select error : %s\n",strerror(errno)); - return MP_INPUT_ERROR; - } else - return MP_INPUT_NOTHING; - } - - // There's something to read if(lirc_nextcode(&code) != 0) { mp_msg(MSGT_INPUT,MSGL_ERR,"Lirc error :(\n"); return MP_INPUT_DEAD;