mirror of https://github.com/mpv-player/mpv
c184e290b0
sdl_gamepad.c and vo_sdl.c both have their own event loops and run in separate threads. They don't know of each other (and shouldn't). Since SDL only has one global event loop (why didn't they fix this in SDL2?), these obviously clash. The actual behavior is relatively subtle, which event being randomly dispatched to either of the threads. This is very regrettable. Very. Work this around. "Fortunately" SDL exposes its global state to some degree. SDL_WasInit() returns whether a "subsystem" was initialized, and you could say the one who initialized it owns it. Both SDL_INIT_VIDEO and SDL_INIT_GAMECONTROLLER implicitly enable SDL_INIT_EVENTS, and the event loop is indeed the resource that cannot be shared. Unfortunately, this is still racy, since SDL_InitSubSystem is a second call, and succeeds if the subsystem is already initialized (increases a refcount I think). But good enough. Blame SDL for everything. (I think I made this commit message too long. Nobody cares even.) Fixes: #7085 |
||
---|---|---|
.. | ||
cmd.c | ||
cmd.h | ||
event.c | ||
event.h | ||
input.c | ||
input.h | ||
ipc-dummy.c | ||
ipc-unix.c | ||
ipc-win.c | ||
ipc.c | ||
keycodes.c | ||
keycodes.h | ||
pipe-win32.c | ||
sdl_gamepad.c |