mirror of
https://github.com/mpv-player/mpv
synced 2024-12-27 17:42:17 +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:
parent
38ce825091
commit
4b1ce17e23
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user