diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1 index c2beb60db9..a66f33ddfd 100644 --- a/DOCS/man/en/mplayer.1 +++ b/DOCS/man/en/mplayer.1 @@ -566,6 +566,17 @@ several 'echo "seek 10" > mp_pipe' and the pipe will stay valid. .PD 1 . .TP +.B \-key-fifo-size <2\-65000> +Specify the size of the FIFO that buffers key events (default: 10). +A FIFO of size n can buffer (n - 1) events. +If it is too small some events may be lost (leading to e.g. "stuck mouse +button"). +If it is too big, MPlayer may seem to hang while it processes the buffered +events. +To get the same behaviour as before this option was introduced, set it to +2 for linux or 1024 for windows. +. +.TP .B \-lircconf (LIRC only) Specifies a configuration file for LIRC (default: ~/\:.lircrc). . diff --git a/cfg-mplayer.h b/cfg-mplayer.h index 5eaa35a21c..7165df8d31 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -405,6 +405,7 @@ m_option_t mplayer_opts[]={ {"slave", &slave_mode, CONF_TYPE_FLAG,CONF_GLOBAL , 0, 1, NULL}, {"use-stdin", "-use-stdin has been renamed to -noconsolecontrols, use that instead.", CONF_TYPE_PRINT, 0, 0, 0, NULL}, + {"key-fifo-size", &key_fifo_size, CONF_TYPE_INT, CONF_RANGE, 2, 65000, NULL}, {"noconsolecontrols", &noconsolecontrols, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 1, NULL}, {"consolecontrols", &noconsolecontrols, CONF_TYPE_FLAG, CONF_GLOBAL, 0, 0, NULL}, diff --git a/fifo.c b/fifo.c index ea76e9c906..5820a30a53 100644 --- a/fifo.c +++ b/fifo.c @@ -1,5 +1,5 @@ -#ifndef HAVE_NO_POSIX_SELECT +#if 0 // keyboard: static int keyb_fifo_put=-1; @@ -34,24 +34,28 @@ void mplayer_put_key(int code){ #else -#define KEY_FIFO_SIZE 1024 -static int key_fifo_data[KEY_FIFO_SIZE]; +int key_fifo_size = 10; +static int *key_fifo_data = NULL; static int key_fifo_read=0; static int key_fifo_write=0; void mplayer_put_key(int code){ // printf("mplayer_put_key(%d)\n",code); - if(((key_fifo_write+1)%KEY_FIFO_SIZE)==key_fifo_read) return; // FIFO FULL!! + if (key_fifo_data == NULL) + key_fifo_data = malloc(key_fifo_size * sizeof(int)); + if(((key_fifo_write+1)%key_fifo_size)==key_fifo_read) return; // FIFO FULL!! key_fifo_data[key_fifo_write]=code; - key_fifo_write=(key_fifo_write+1)%KEY_FIFO_SIZE; + key_fifo_write=(key_fifo_write+1)%key_fifo_size; } int mplayer_get_key(int fd){ int key; // printf("mplayer_get_key(%d)\n",fd); + if (key_fifo_data == NULL) + return MP_INPUT_NOTHING; if(key_fifo_write==key_fifo_read) return MP_INPUT_NOTHING; key=key_fifo_data[key_fifo_read]; - key_fifo_read=(key_fifo_read+1)%KEY_FIFO_SIZE; + key_fifo_read=(key_fifo_read+1)%key_fifo_size; // printf("mplayer_get_key => %d\n",key); return key; } diff --git a/mplayer.c b/mplayer.c index c6399cfb4e..2e087c846c 100644 --- a/mplayer.c +++ b/mplayer.c @@ -1312,7 +1312,7 @@ if (edl_check_mode() == EDL_ERROR && edl_filename) // Init input system current_module = "init_input"; mp_input_init(); -#ifndef HAVE_NO_POSIX_SELECT +#if 0 make_pipe(&keyb_fifo_get,&keyb_fifo_put); if(keyb_fifo_get > 0)