changeset 14077:3d3f3cc8494a

use a configurable-size ringbuffer instead of a pipe for buffering key events.
author reimar
date Wed, 01 Dec 2004 12:22:39 +0000
parents 8807085a6edf
children c4033dcb986f
files DOCS/man/en/mplayer.1 cfg-mplayer.h fifo.c mplayer.c
diffstat 4 files changed, 23 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1	Wed Dec 01 12:07:14 2004 +0000
+++ b/DOCS/man/en/mplayer.1	Wed Dec 01 12:22:39 2004 +0000
@@ -566,6 +566,17 @@
 .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 <filename> (LIRC only)
 Specifies a configuration file for LIRC (default: ~/\:.lircrc).
 .
--- a/cfg-mplayer.h	Wed Dec 01 12:07:14 2004 +0000
+++ b/cfg-mplayer.h	Wed Dec 01 12:22:39 2004 +0000
@@ -405,6 +405,7 @@
 
 	{"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},
 
--- a/fifo.c	Wed Dec 01 12:07:14 2004 +0000
+++ b/fifo.c	Wed Dec 01 12:22:39 2004 +0000
@@ -1,5 +1,5 @@
 
-#ifndef HAVE_NO_POSIX_SELECT
+#if 0
 
 // keyboard:
 static int keyb_fifo_put=-1;
@@ -34,24 +34,28 @@
 
 #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;
 }
--- a/mplayer.c	Wed Dec 01 12:07:14 2004 +0000
+++ b/mplayer.c	Wed Dec 01 12:22:39 2004 +0000
@@ -1312,7 +1312,7 @@
 // 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)