1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-27 01:22:30 +00:00

input: never wait if there are new events in the input queue

Move the reading loop from read_all_fd_events to read_events. If
got_new_events is set when calling read_events, don't actually wait
and set the timeout to 0.

(Note that not waiting is sort of transparent to the caller: the caller
is just supposed to execute the event loop again, and then it will
actually wait. mplayer.c handles this correctly.)

This might reduce latency with some input sources.
This commit is contained in:
wm4 2013-07-14 15:44:11 +02:00
parent 38ce825091
commit 4b1ce17e23

View File

@ -1664,31 +1664,29 @@ static void read_events(struct input_ctx *ictx, int time)
time = FFMIN(time, ictx->ar_delay);
}
time = FFMAX(time, 0);
ictx->got_new_events = false;
remove_dead_fds(ictx);
if (time) {
for (int i = 0; i < ictx->num_fds; i++) {
if (!ictx->fds[i].select)
read_fd(ictx, &ictx->fds[i]);
}
}
if (ictx->got_new_events)
time = 0;
input_wait_read(ictx, time);
}
/* To support blocking file descriptors we don't loop the read over
* every source until it's known to be empty. Instead we use this wrapper
* to run select() again.
*/
static void read_all_fd_events(struct input_ctx *ictx, int time)
{
while (1) {
read_events(ictx, time);
if (ictx->got_new_events)
time = 0;
ictx->got_new_events = false;
remove_dead_fds(ictx);
if (time) {
for (int i = 0; i < ictx->num_fds; i++) {
if (!ictx->fds[i].select)
read_fd(ictx, &ictx->fds[i]);
}
}
if (ictx->got_new_events)
time = 0;
input_wait_read(ictx, time);
// Read until all input FDs are empty
if (!ictx->got_new_events)
return;
time = 0;
break;
}
}
@ -1698,7 +1696,7 @@ static void read_all_events(struct input_ctx *ictx, int time)
#ifdef CONFIG_COCOA
cocoa_check_events();
#endif
read_all_fd_events(ictx, time);
read_events(ictx, time);
}
int mp_input_queue_cmd(struct input_ctx *ictx, mp_cmd_t *cmd)