mirror of
https://github.com/mpv-player/mpv
synced 2024-12-18 12:55:16 +00:00
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] git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28380 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
7fcf438a2f
commit
88aca1ef25
28
input/lirc.c
28
input/lirc.c
@ -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 @@ static char* cmd_buf = NULL;
|
||||
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 @@ mp_input_lirc_init(void) {
|
||||
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 @@ int mp_input_lirc_read(int fd,char* dest, int s) {
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
Loading…
Reference in New Issue
Block a user