Skip to content

Commit

Permalink
input: add gamepad support through SDL2
Browse files Browse the repository at this point in the history
The code is very basic:

- only handles gamepads, could be extended for generic joysticks in the
  future.
- only has button mappings for controllers natively supported by SDL2.
  I heard more can be added through env vars, there's also ways to load
  mappings from text files, but I'd rather not go there yet. Common ones
  like Dualshock are supported natively.
- analog buttons (TRIGGER and AXIS) are mapped to discrete buttons using an
  activation threshold.
- only supports one gamepad at a time. the feature is intented to use
  gamepads as evolved remote controls, not play multiplayer games in mpv :)
  • Loading branch information
pigoz committed Oct 23, 2019
1 parent 79b15f5 commit 899e0bd
Show file tree
Hide file tree
Showing 12 changed files with 378 additions and 8 deletions.
3 changes: 3 additions & 0 deletions DOCS/man/options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -3407,6 +3407,9 @@ Input
(OS X only)
Enable/disable Apple Remote support. Enabled by default (except for libmpv).

``--input-gamepad=<yes|no>``
Enable/disable SDL2 Gamepad support. Enabled by default (except for libmpv).

``--input-cursor``, ``--no-input-cursor``
Permit mpv to receive pointer events reported by the video output
driver. Necessary to use the OSC, or to select the buttons in DVD menus.
Expand Down
2 changes: 1 addition & 1 deletion audio/out/ao.c
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ static const struct ao_driver * const audio_out_drivers[] = {
#if HAVE_OPENSLES
&audio_out_opensles,
#endif
#if HAVE_SDL2
#if HAVE_SDL2_AUDIO
&audio_out_sdl,
#endif
#if HAVE_SNDIO
Expand Down
1 change: 1 addition & 0 deletions etc/builtin.conf
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ input-terminal=no
osc=no
input-default-bindings=no
input-vo-keyboard=no
input-gamepad=no
# OSX/Cocoa global input hooks
input-appleremote=no
input-media-keys=no
Expand Down
13 changes: 13 additions & 0 deletions input/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ struct input_opts {
int ar_rate;
int use_alt_gr;
int use_appleremote;
int use_gamepad;
int use_media_keys;
int default_bindings;
int enable_mouse_movements;
Expand All @@ -198,6 +199,9 @@ const struct m_sub_options input_config = {
OPT_FLAG("input-media-keys", use_media_keys, 0),
#if HAVE_COCOA
OPT_FLAG("input-appleremote", use_appleremote, 0),
#endif
#if HAVE_SDL2_GAMEPAD
OPT_FLAG("input-gamepad", use_gamepad, 0),
#endif
OPT_FLAG("window-dragging", allow_win_drag, 0),
OPT_REPLACED("input-x11-keyboard", "input-vo-keyboard"),
Expand All @@ -214,6 +218,9 @@ const struct m_sub_options input_config = {
.use_media_keys = 1,
#if HAVE_COCOA
.use_appleremote = 1,
#endif
#if HAVE_SDL2_GAMEPAD
.use_gamepad = 1,
#endif
.default_bindings = 1,
.vo_key_input = 1,
Expand Down Expand Up @@ -1377,6 +1384,12 @@ void mp_input_load_config(struct input_ctx *ictx)
talloc_free(ifile);
#endif

#if HAVE_SDL2_GAMEPAD
if (ictx->opts->use_gamepad) {
mp_input_sdl_gamepad_add(ictx);
}
#endif

input_unlock(ictx);
}

Expand Down
2 changes: 2 additions & 0 deletions input/input.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,8 @@ void mp_input_set_repeat_info(struct input_ctx *ictx, int rate, int delay);

void mp_input_pipe_add(struct input_ctx *ictx, const char *filename);

void mp_input_sdl_gamepad_add(struct input_ctx *ictx);

struct mp_ipc_ctx;
struct mp_client_api;

Expand Down
26 changes: 26 additions & 0 deletions input/keycodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,32 @@ static const struct key_name key_names[] = {
{ MP_AR_VDOWN, "AR_VDOWN" },
{ MP_AR_VDOWN_HOLD, "AR_VDOWN_HOLD" },

{ MP_KEY_GAMEPAD_ACTION_DOWN, "GAMEPAD_ACTION_DOWN" },
{ MP_KEY_GAMEPAD_ACTION_RIGHT, "GAMEPAD_ACTION_RIGHT" },
{ MP_KEY_GAMEPAD_ACTION_LEFT, "GAMEPAD_ACTION_LEFT" },
{ MP_KEY_GAMEPAD_ACTION_UP, "GAMEPAD_ACTION_UP" },
{ MP_KEY_GAMEPAD_BACK, "GAMEPAD_BACK" },
{ MP_KEY_GAMEPAD_MENU, "GAMEPAD_MENU" },
{ MP_KEY_GAMEPAD_START, "GAMEPAD_START" },
{ MP_KEY_GAMEPAD_LEFT_SHOULDER, "GAMEPAD_LEFT_SHOULDER" },
{ MP_KEY_GAMEPAD_RIGHT_SHOULDER, "GAMEPAD_RIGHT_SHOULDER" },
{ MP_KEY_GAMEPAD_LEFT_TRIGGER, "GAMEPAD_LEFT_TRIGGER" },
{ MP_KEY_GAMEPAD_RIGHT_TRIGGER, "GAMEPAD_RIGHT_TRIGGER" },
{ MP_KEY_GAMEPAD_LEFT_STICK, "GAMEPAD_LEFT_STICK" },
{ MP_KEY_GAMEPAD_RIGHT_STICK, "GAMEPAD_RIGHT_STICK" },
{ MP_KEY_GAMEPAD_DPAD_UP, "GAMEPAD_DPAD_UP" },
{ MP_KEY_GAMEPAD_DPAD_DOWN, "GAMEPAD_DPAD_DOWN" },
{ MP_KEY_GAMEPAD_DPAD_LEFT, "GAMEPAD_DPAD_LEFT" },
{ MP_KEY_GAMEPAD_DPAD_RIGHT, "GAMEPAD_DPAD_RIGHT" },
{ MP_KEY_GAMEPAD_LEFT_STICK_UP, "GAMEPAD_LEFT_STICK_UP" },
{ MP_KEY_GAMEPAD_LEFT_STICK_DOWN, "GAMEPAD_LEFT_STICK_DOWN" },
{ MP_KEY_GAMEPAD_LEFT_STICK_LEFT, "GAMEPAD_LEFT_STICK_LEFT" },
{ MP_KEY_GAMEPAD_LEFT_STICK_RIGHT, "GAMEPAD_LEFT_STICK_RIGHT" },
{ MP_KEY_GAMEPAD_RIGHT_STICK_UP, "GAMEPAD_RIGHT_STICK_UP" },
{ MP_KEY_GAMEPAD_RIGHT_STICK_DOWN, "GAMEPAD_RIGHT_STICK_DOWN" },
{ MP_KEY_GAMEPAD_RIGHT_STICK_LEFT, "GAMEPAD_RIGHT_STICK_LEFT" },
{ MP_KEY_GAMEPAD_RIGHT_STICK_RIGHT, "GAMEPAD_RIGHT_STICK_RIGHT" },

{ MP_KEY_POWER, "POWER" },
{ MP_KEY_MENU, "MENU" },
{ MP_KEY_PLAY, "PLAY" },
Expand Down
28 changes: 28 additions & 0 deletions input/keycodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,34 @@
#define MP_AR_VDOWN (MP_AR_BASE + 12)
#define MP_AR_VDOWN_HOLD (MP_AR_BASE + 13)

/* game controller keys */
#define MP_KEY_GAMEPAD (MP_KEY_BASE+0xF0)
#define MP_KEY_GAMEPAD_ACTION_DOWN (MP_KEY_GAMEPAD+0)
#define MP_KEY_GAMEPAD_ACTION_RIGHT (MP_KEY_GAMEPAD+1)
#define MP_KEY_GAMEPAD_ACTION_LEFT (MP_KEY_GAMEPAD+2)
#define MP_KEY_GAMEPAD_ACTION_UP (MP_KEY_GAMEPAD+3)
#define MP_KEY_GAMEPAD_BACK (MP_KEY_GAMEPAD+4)
#define MP_KEY_GAMEPAD_MENU (MP_KEY_GAMEPAD+5)
#define MP_KEY_GAMEPAD_START (MP_KEY_GAMEPAD+6)
#define MP_KEY_GAMEPAD_LEFT_SHOULDER (MP_KEY_GAMEPAD+7)
#define MP_KEY_GAMEPAD_RIGHT_SHOULDER (MP_KEY_GAMEPAD+8)
#define MP_KEY_GAMEPAD_LEFT_TRIGGER (MP_KEY_GAMEPAD+9)
#define MP_KEY_GAMEPAD_RIGHT_TRIGGER (MP_KEY_GAMEPAD+10)
#define MP_KEY_GAMEPAD_LEFT_STICK (MP_KEY_GAMEPAD+11)
#define MP_KEY_GAMEPAD_RIGHT_STICK (MP_KEY_GAMEPAD+12)
#define MP_KEY_GAMEPAD_DPAD_UP (MP_KEY_GAMEPAD+13)
#define MP_KEY_GAMEPAD_DPAD_DOWN (MP_KEY_GAMEPAD+14)
#define MP_KEY_GAMEPAD_DPAD_LEFT (MP_KEY_GAMEPAD+15)
#define MP_KEY_GAMEPAD_DPAD_RIGHT (MP_KEY_GAMEPAD+16)
#define MP_KEY_GAMEPAD_LEFT_STICK_UP (MP_KEY_GAMEPAD+17)
#define MP_KEY_GAMEPAD_LEFT_STICK_DOWN (MP_KEY_GAMEPAD+18)
#define MP_KEY_GAMEPAD_LEFT_STICK_LEFT (MP_KEY_GAMEPAD+19)
#define MP_KEY_GAMEPAD_LEFT_STICK_RIGHT (MP_KEY_GAMEPAD+20)
#define MP_KEY_GAMEPAD_RIGHT_STICK_UP (MP_KEY_GAMEPAD+21)
#define MP_KEY_GAMEPAD_RIGHT_STICK_DOWN (MP_KEY_GAMEPAD+22)
#define MP_KEY_GAMEPAD_RIGHT_STICK_LEFT (MP_KEY_GAMEPAD+23)
#define MP_KEY_GAMEPAD_RIGHT_STICK_RIGHT (MP_KEY_GAMEPAD+24)

// Reserved area. Can be used for keys that have no explicit names assigned,
// but should be mappable by the user anyway.
#define MP_KEY_UNKNOWN_RESERVED_START (MP_KEY_BASE+0x10000)
Expand Down
Loading

0 comments on commit 899e0bd

Please sign in to comment.