From bf9980d8bc96cff5f0ff8fda802944469f414f76 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Fri, 27 Jul 2012 15:46:15 +0200 Subject: [PATCH] (RARCH_CONSOLE) Control refactor - add post_init and set_analog_to_dpad_mapping members --- 360/xenon360_input.c | 12 +++++- 360/xinput_360_input.c | 20 ++++++--- 360/xinput_360_input.h | 2 - driver.h | 3 ++ input/null.c | 12 +++++- ps3/frontend/main.c | 2 + ps3/ps3_input.c | 43 +++++++++++-------- ps3/ps3_input.h | 2 - wii/frontend/main.c | 2 + wii/gx_input.c | 21 ++++++--- xbox1/xinput_xbox_input.c | 89 +++++++++++++++++++++++---------------- xdk/frontend/main.c | 2 + 12 files changed, 136 insertions(+), 74 deletions(-) diff --git a/360/xenon360_input.c b/360/xenon360_input.c index be1c1e345c..dc1ee8f682 100644 --- a/360/xenon360_input.c +++ b/360/xenon360_input.c @@ -24,11 +24,13 @@ #include #include -static struct controller_data_s pad[4]; +#define MAX_PADS + +static struct controller_data_s pad[MAX_PADS]; static void xenon360_input_poll(void *data) { (void)data; - for (unsigned i = 0; i < 4; i++) + for (unsigned i = 0; i < MAX_PADS; i++) { usb_do_poll(); get_controller_data(&pad[i], i); @@ -117,12 +119,18 @@ static bool xenon360_key_pressed(void *data, int key) return false; } +static void xenon360_input_set_default_keybind_lut(void) {} +static void xenon360_input_set_analog_dpad_mapping(unsigned map_dpad_enum, unsigned controller_id) {} + const input_driver_t input_xenon360 = { .init = xenon360_input_init, .poll = xenon360_input_poll, .input_state = xenon360_input_state, .key_pressed = xenon360_key_pressed, .free = xenon360_free_input, + .set_default_keybind_lut = xenon360_input_set_default_keybind_lut, + .set_analog_dpad_mapping = xenon360_input_set_analog_dpad_mapping, + .max_pads = MAX_PADS, .ident = "xenon360", }; diff --git a/360/xinput_360_input.c b/360/xinput_360_input.c index 7b9b6aed62..4b55996f4c 100644 --- a/360/xinput_360_input.c +++ b/360/xinput_360_input.c @@ -19,12 +19,14 @@ #include +#define MAX_PADS 4 + #include "../driver.h" #include "../general.h" #include "../libretro.h" #include "xinput_360_input.h" -static uint64_t state[4]; +static uint64_t state[MAX_PADS]; static unsigned pads_connected; const struct platform_bind platform_keys[] = { @@ -70,7 +72,7 @@ static void xinput_input_poll(void *data) pads_connected = 0; - for (unsigned i = 0; i < 4; i++) + for (unsigned i = 0; i < MAX_PADS; i++) { XINPUT_STATE state_tmp; unsigned long retval; @@ -110,7 +112,7 @@ static void xinput_input_free_input(void *data) #include "../console/retroarch_console.h" -void xdk360_input_map_dpad_to_stick(uint32_t map_dpad_enum, uint32_t controller_id) +static void xinput_input_set_analog_dpad_mapping(unsigned map_dpad_enum, unsigned controller_id) { switch(map_dpad_enum) { @@ -137,12 +139,15 @@ void xdk360_input_map_dpad_to_stick(uint32_t map_dpad_enum, uint32_t controller_ static void* xinput_input_init(void) { - for(unsigned i = 0; i < 4; i++) - xdk360_input_map_dpad_to_stick(g_settings.input.dpad_emulation[i], i); - return (void*)-1; } +static void xinput_input_post_init(void) +{ + for(unsigned i = 0; i < MAX_PADS; i++) + xinput_input_analog_pad_mapping(g_settings.input.dpad_emulation[i], i); +} + static bool xinput_input_key_pressed(void *data, int key) { (void)data; @@ -232,5 +237,8 @@ const input_driver_t input_xinput = xinput_input_key_pressed, xinput_input_free_input, xinput_set_default_keybind_lut, + xinput_input_set_analog_dpad_mapping, + xinput_input_post_init, + MAX_PADS, "xinput" }; diff --git a/360/xinput_360_input.h b/360/xinput_360_input.h index 1c83129cd7..9e4e1d2cd2 100644 --- a/360/xinput_360_input.h +++ b/360/xinput_360_input.h @@ -70,6 +70,4 @@ enum xdk_device_id #define DEADZONE (16000) -extern void xdk360_input_map_dpad_to_stick(uint32_t map_dpad_enum, uint32_t controller_id); - #endif diff --git a/driver.h b/driver.h index a532f56300..32f50b2246 100644 --- a/driver.h +++ b/driver.h @@ -161,6 +161,9 @@ typedef struct input_driver void (*free)(void *data); #ifdef RARCH_CONSOLE void (*set_default_keybind_lut)(void); + void (*set_analog_dpad_mapping)(unsigned map_dpad_enum, unsigned controller_id); + void (*post_init)(void); + unsigned max_pads; #endif const char *ident; } input_driver_t; diff --git a/input/null.c b/input/null.c index 07818f4b1c..3b8f724eec 100644 --- a/input/null.c +++ b/input/null.c @@ -21,6 +21,12 @@ static void *null_input_init(void) return (void*)-1; } +#ifdef RARCH_CONSOLE +static void null_input_post_init(void) +{ +} +#endif + static void null_input_poll(void *data) { (void)data; @@ -52,7 +58,8 @@ static void null_input_free(void *data) } #ifdef RARCH_CONSOLE -static void null_set_default_keybind_lut(void) {} +static void null_set_default_keybind_lut(void) { } +static void null_set_analog_dpad_mapping(unsigned map_dpad_enum, unsigned controller_id) { } #endif const input_driver_t input_null = { @@ -63,6 +70,9 @@ const input_driver_t input_null = { null_input_free, #ifdef RARCH_CONSOLE null_set_default_keybind_lut, + null_set_analog_dpad_mapping, + null_input_post_init, + 2, #endif "null", }; diff --git a/ps3/frontend/main.c b/ps3/frontend/main.c index 4cf8691ca9..1971faf253 100644 --- a/ps3/frontend/main.c +++ b/ps3/frontend/main.c @@ -251,6 +251,8 @@ int main(int argc, char *argv[]) snprintf(tmp_path, sizeof(tmp_path), "%s/", default_paths.core_dir); rarch_configure_libretro(&input_ps3, tmp_path, default_paths.executable_extension); + input_ps3.post_init(); + #if(CELL_SDK_VERSION > 0x340000) if (g_console.screenshots_enable) { diff --git a/ps3/ps3_input.c b/ps3/ps3_input.c index 9a6454a484..95061227ba 100644 --- a/ps3/ps3_input.c +++ b/ps3/ps3_input.c @@ -373,24 +373,7 @@ void oskutil_unload(oskutil_params *params) RetroArch PS3 INPUT DRIVER ============================================================ */ -static void ps3_free_input(void *data) -{ - (void)data; - //cellPadEnd(); -} - -static void* ps3_input_initialize(void) -{ - cellPadInit(MAX_PADS); -#ifdef HAVE_MOUSE - cellMouseInit(MAX_MICE); -#endif - for(unsigned i = 0; i < MAX_PADS; i++) - ps3_input_map_dpad_to_stick(g_settings.input.dpad_emulation[i], i); - return (void*)-1; -} - -void ps3_input_map_dpad_to_stick(uint32_t map_dpad_enum, uint32_t controller_id) +static void ps3_input_set_analog_dpad_mapping(unsigned map_dpad_enum, unsigned controller_id) { switch(map_dpad_enum) { @@ -415,6 +398,27 @@ void ps3_input_map_dpad_to_stick(uint32_t map_dpad_enum, uint32_t controller_id) } } +static void ps3_free_input(void *data) +{ + (void)data; + //cellPadEnd(); +} + +static void* ps3_input_initialize(void) +{ + cellPadInit(MAX_PADS); +#ifdef HAVE_MOUSE + cellMouseInit(MAX_MICE); +#endif + return (void*)-1; +} + +static void ps3_input_post_init(void) +{ + for(unsigned i = 0; i < MAX_PADS; i++) + ps3_input_set_analog_dpad_mapping(g_settings.input.dpad_emulation[i], i); +} + static bool ps3_key_pressed(void *data, int key) { (void)data; @@ -497,6 +501,9 @@ const input_driver_t input_ps3 = { .key_pressed = ps3_key_pressed, .free = ps3_free_input, .set_default_keybind_lut = ps3_set_default_keybind_lut, + .set_analog_dpad_mapping = ps3_input_set_analog_dpad_mapping, + .post_init = ps3_input_post_init, + .max_pads = MAX_PADS, .ident = "ps3", }; diff --git a/ps3/ps3_input.h b/ps3/ps3_input.h index 5e4436168a..49f9530059 100644 --- a/ps3/ps3_input.h +++ b/ps3/ps3_input.h @@ -135,8 +135,6 @@ uint64_t cell_pad_input_poll_device(uint32_t id); -void ps3_input_map_dpad_to_stick(uint32_t map_dpad_enum, uint32_t controller_id); - #ifdef HAVE_OSKUTIL typedef struct diff --git a/wii/frontend/main.c b/wii/frontend/main.c index 3b132c0934..6c93a50162 100644 --- a/wii/frontend/main.c +++ b/wii/frontend/main.c @@ -214,6 +214,8 @@ int main(void) input_wii.init(); rarch_input_set_controls_default(&input_wii); + input_wii.post_init(); + rgui_handle_t *rgui = rgui_init("", menu_framebuf, RGUI_WIDTH * sizeof(uint16_t), _binary_console_font_bmp_start, folder_cb, NULL); diff --git a/wii/gx_input.c b/wii/gx_input.c index cbcc279009..f4949597ab 100644 --- a/wii/gx_input.c +++ b/wii/gx_input.c @@ -35,7 +35,9 @@ #define JOYSTICK_THRESHOLD 64 -static uint64_t pad_state[4]; +#define MAX_PADS 4 + +static uint64_t pad_state[MAX_PADS]; const struct platform_bind platform_keys[] = { { WII_GC_A, "GC A button" }, @@ -136,7 +138,7 @@ static int16_t wii_input_state(void *data, const struct retro_keybind **binds, (void)data; (void)index; - if (port >= 4 || device != RETRO_DEVICE_JOYPAD) + if (port >= MAX_PADS || device != RETRO_DEVICE_JOYPAD) return 0; return (binds[port][id].joykey & pad_state[port]) ? 1 : 0; @@ -152,7 +154,7 @@ static void reset_callback(void) g_quit = true; } -void wii_input_map_dpad_to_stick(uint32_t map_dpad_enum, uint32_t controller_id) +static void wii_input_set_analog_dpad_mapping(unsigned map_dpad_enum, unsigned controller_id) { // TODO: how do we choose a classic controller configuration over a gc controller one? switch(map_dpad_enum) @@ -186,11 +188,15 @@ static void *wii_input_initialize(void) #endif SYS_SetResetCallback(reset_callback); SYS_SetPowerCallback(reset_callback); - for(unsigned i = 0; i < 4; i++) - wii_input_map_dpad_to_stick(g_settings.input.dpad_emulation[i], i); return (void*)-1; } +static void wii_input_post_init(void) +{ + for(unsigned i = 0; i < MAX_PADS; i++) + wii_input_set_analog_dpad_mapping(g_settings.input.dpad_emulation[i], i); +} + #define wii_stick_x(x) ((s8)((sin((x).ang * M_PI / 180.0f)) * (x).mag * 128.0f)) #define wii_stick_y(x) ((s8)((cos((x).ang * M_PI / 180.0f)) * (x).mag * 128.0f)) @@ -203,7 +209,7 @@ static void wii_input_poll(void *data) unsigned wpads = WPAD_ScanPads(); #endif - for (unsigned port = 0; port < 4; port++) + for (unsigned port = 0; port < MAX_PADS; port++) { uint64_t state = 0; if (port < pads) @@ -395,5 +401,8 @@ const input_driver_t input_wii = { .key_pressed = wii_key_pressed, .free = wii_free_input, .set_default_keybind_lut = wii_set_default_keybind_lut, + .set_analog_dpad_mapping = wii_input_set_analog_dpad_mapping, + .post_init = wii_input_post_init, + .max_pads = MAX_PADS, .ident = "wii", }; diff --git a/xbox1/xinput_xbox_input.c b/xbox1/xinput_xbox_input.c index f9af267ba2..e877dcc46f 100644 --- a/xbox1/xinput_xbox_input.c +++ b/xbox1/xinput_xbox_input.c @@ -21,16 +21,18 @@ #include #endif +#define MAX_PADS 4 + #include "../driver.h" #include "../general.h" #include "../libretro.h" #include "xinput_xbox_input.h" -static uint64_t real_state[4]; -HANDLE gamepads[4]; +static uint64_t real_state[MAX_PADS]; +HANDLE gamepads[MAX_PADS]; DWORD dwDeviceMask; -bool bInserted[4]; -bool bRemoved[4]; +bool bInserted[MAX_PADS]; +bool bRemoved[MAX_PADS]; const struct platform_bind platform_keys[] = { { XINPUT1_GAMEPAD_B, "B button" }, @@ -82,10 +84,10 @@ static void xinput_input_poll(void *data) pads_connected = 0; - for (unsigned i = 0; i < 4; i++) + for (unsigned i = 0; i < MAX_PADS; i++) { - XINPUT_STATE state[4]; - XINPUT_CAPABILITIES caps[4]; + XINPUT_STATE state[MAX_PADS]; + XINPUT_CAPABILITIES caps[MAX_PADS]; (void)caps; real_state[i] = 0; // handle removed devices @@ -162,36 +164,6 @@ static void xinput_input_free_input(void *data) (void)data; } -static void* xinput_input_init(void) -{ - XInitDevices(0, NULL); - - dwDeviceMask = XGetDevices(XDEVICE_TYPE_GAMEPAD); - - //Check the device status - switch(XGetDeviceEnumerationStatus()) - { - case XDEVICE_ENUMERATION_IDLE: - RARCH_LOG("Input state status: XDEVICE_ENUMERATION_IDLE\n"); - break; - case XDEVICE_ENUMERATION_BUSY: - RARCH_LOG("Input state status: XDEVICE_ENUMERATION_BUSY\n"); - break; - } - - while(XGetDeviceEnumerationStatus() == XDEVICE_ENUMERATION_BUSY) {} - - return (void*)-1; -} - -static bool xinput_input_key_pressed(void *data, int key) -{ - (void)data; - bool retval = false; - - return retval; -} - static void xinput_set_default_keybind_lut(void) { rarch_default_keybind_lut[RETRO_DEVICE_ID_JOYPAD_B] = platform_keys[XDK_DEVICE_ID_JOYPAD_A].joykey; @@ -219,6 +191,46 @@ static void xinput_set_default_keybind_lut(void) rarch_default_keybind_lut[RETRO_DEVICE_ID_JOYPAD_R3] = platform_keys[XDK_DEVICE_ID_RSTICK_THUMB].joykey; } +static void xinput_input_set_analog_dpad_mapping(unsigned map_dpad_enum, unsigned controller_id) +{ +} + +static void* xinput_input_init(void) +{ + XInitDevices(0, NULL); + + dwDeviceMask = XGetDevices(XDEVICE_TYPE_GAMEPAD); + + //Check the device status + switch(XGetDeviceEnumerationStatus()) + { + case XDEVICE_ENUMERATION_IDLE: + RARCH_LOG("Input state status: XDEVICE_ENUMERATION_IDLE\n"); + break; + case XDEVICE_ENUMERATION_BUSY: + RARCH_LOG("Input state status: XDEVICE_ENUMERATION_BUSY\n"); + break; + } + + while(XGetDeviceEnumerationStatus() == XDEVICE_ENUMERATION_BUSY) {} + + return (void*)-1; +} + +static void xinput_input_post_init(void) +{ + for(unsigned i = 0; i < MAX_PADS; i++) + xinput_input_set_analog_pad_mapping(g_settings.input.dpad_emulation[i], i); +} + +static bool xinput_input_key_pressed(void *data, int key) +{ + (void)data; + bool retval = false; + + return retval; +} + const input_driver_t input_xinput = { xinput_input_init, @@ -227,5 +239,8 @@ const input_driver_t input_xinput = xinput_input_key_pressed, xinput_input_free_input, xinput_set_default_keybind_lut, + xinput_input_set_analog_dpad_mapping, + xinput_input_post_init, + MAX_PADS, "xinput" }; diff --git a/xdk/frontend/main.c b/xdk/frontend/main.c index 7d7ba6585f..0e6c0be7ea 100644 --- a/xdk/frontend/main.c +++ b/xdk/frontend/main.c @@ -128,6 +128,8 @@ int main(int argc, char *argv[]) input_xinput.init(); rarch_configure_libretro(&input_xinput, default_paths.filesystem_root_dir, default_paths.executable_extension); + input_xinput.post_init(); + #if defined(HAVE_D3D8) || defined(HAVE_D3D9) video_xdk_d3d.start(); #else