From 923433ead745e316c1edcea2780269fa75473474 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 2 Dec 2015 22:33:27 +0100 Subject: [PATCH] Move engine_handle_dpad code to android_input.c - copy hat and analog state to intermediary on android_app during poll time --- frontend/drivers/platform_linux.h | 10 +++ input/drivers/android_input.c | 90 +++++++++++++++++++++++++-- input/drivers_joypad/android_joypad.c | 84 ++++--------------------- 3 files changed, 107 insertions(+), 77 deletions(-) diff --git a/frontend/drivers/platform_linux.h b/frontend/drivers/platform_linux.h index 7fb399da26..d4941d44ec 100644 --- a/frontend/drivers/platform_linux.h +++ b/frontend/drivers/platform_linux.h @@ -48,6 +48,14 @@ enum CPU_X86_FEATURE_MOVBE = (1 << 2) }; +#ifndef MAX_PADS +#define MAX_PADS 8 +#endif + +#ifndef MAX_AXIS +#define MAX_AXIS 10 +#endif + cpu_family linux_get_cpu_family(void); uint64_t linux_get_cpu_features(void); @@ -165,6 +173,8 @@ struct android_app const ASensor* accelerometerSensor; uint64_t sensor_state_mask; char current_ime[PATH_MAX_LENGTH]; + int16_t analog_state[MAX_PADS][MAX_AXIS]; + int8_t hat_state[MAX_PADS][2]; jmethodID getIntent; jmethodID onRetroArchExit; jmethodID getStringExtra; diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index b51e172c68..567c01877c 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -17,6 +17,7 @@ */ #include +#include #include @@ -61,8 +62,6 @@ enum AXIS_BRAKE = 23 }; -#define MAX_AXIS 10 - typedef struct state_device { int id; @@ -73,6 +72,8 @@ typedef struct state_device typedef struct android_input_data { state_device_t pad_states[MAX_PADS]; + int16_t analog_state[MAX_PADS][MAX_AXIS]; + int8_t hat_state[MAX_PADS][2]; unsigned pads_connected; sensor_t accelerometer_state; @@ -92,7 +93,7 @@ static void frontend_android_get_version_sdk(int32_t *sdk); bool (*engine_lookup_name)(char *buf, int *vendorId, int *productId, size_t size, int id); -void (*engine_handle_dpad)(AInputEvent*, int, int); +void (*engine_handle_dpad)(android_input_data_t *, AInputEvent*, int, int); static bool android_input_set_sensor_state(void *data, unsigned port, enum retro_sensor_action action, unsigned event_rate); @@ -358,6 +359,53 @@ static void android_input_poll_main_cmd(void) } } +static void engine_handle_dpad_default(android_input_data_t *android_data, + AInputEvent *event, int port, int source) +{ + size_t motion_ptr = AMotionEvent_getAction(event) >> + AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; + float x = AMotionEvent_getX(event, motion_ptr); + float y = AMotionEvent_getY(event, motion_ptr); + + android_data->analog_state[port][0] = (int16_t)(x * 32767.0f); + android_data->analog_state[port][1] = (int16_t)(y * 32767.0f); +} + +static void engine_handle_dpad_getaxisvalue(android_input_data_t *android_data, + AInputEvent *event, int port, int source) +{ + size_t motion_ptr = AMotionEvent_getAction(event) >> + AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; + float x = AMotionEvent_getAxisValue(event, AXIS_X, motion_ptr); + float y = AMotionEvent_getAxisValue(event, AXIS_Y, motion_ptr); + float z = AMotionEvent_getAxisValue(event, AXIS_Z, motion_ptr); + float rz = AMotionEvent_getAxisValue(event, AXIS_RZ, motion_ptr); + float hatx = AMotionEvent_getAxisValue(event, AXIS_HAT_X, motion_ptr); + float haty = AMotionEvent_getAxisValue(event, AXIS_HAT_Y, motion_ptr); + float ltrig = AMotionEvent_getAxisValue(event, AXIS_LTRIGGER, motion_ptr); + float rtrig = AMotionEvent_getAxisValue(event, AXIS_RTRIGGER, motion_ptr); + float brake = AMotionEvent_getAxisValue(event, AXIS_BRAKE, motion_ptr); + float gas = AMotionEvent_getAxisValue(event, AXIS_GAS, motion_ptr); + + android_data->hat_state[port][0] = (int)hatx; + android_data->hat_state[port][1] = (int)haty; + + /* XXX: this could be a loop instead, but do we really want to + * loop through every axis? */ + android_data->analog_state[port][0] = (int16_t)(x * 32767.0f); + android_data->analog_state[port][1] = (int16_t)(y * 32767.0f); + android_data->analog_state[port][2] = (int16_t)(z * 32767.0f); + android_data->analog_state[port][3] = (int16_t)(rz * 32767.0f); +#if 0 + android_data->analog_state[port][4] = (int16_t)(hatx * 32767.0f); + android_data->analog_state[port][5] = (int16_t)(haty * 32767.0f); +#endif + android_data->analog_state[port][6] = (int16_t)(ltrig * 32767.0f); + android_data->analog_state[port][7] = (int16_t)(rtrig * 32767.0f); + android_data->analog_state[port][8] = (int16_t)(brake * 32767.0f); + android_data->analog_state[port][9] = (int16_t)(gas * 32767.0f); +} + static void *android_input_init(void) { int32_t sdk; @@ -381,6 +429,22 @@ static void *android_input_init(void) else engine_lookup_name = android_input_lookup_name_prekitkat; + engine_handle_dpad = engine_handle_dpad_default; + + if ((dlopen("/system/lib/libandroid.so", RTLD_LOCAL | RTLD_LAZY)) == 0) + { + RARCH_WARN("Unable to open libandroid.so\n"); + goto end; + } + + if ((p_AMotionEvent_getAxisValue = dlsym(RTLD_DEFAULT, + "AMotionEvent_getAxisValue"))) + { + RARCH_LOG("Set engine_handle_dpad to 'Get Axis Value' (for reading extra analog sticks)"); + engine_handle_dpad = engine_handle_dpad_getaxisvalue; + } + +end: return android; } @@ -749,7 +813,7 @@ static void android_input_poll_input(void *data) case AINPUT_EVENT_TYPE_MOTION: if (android_input_poll_event_type_motion(android, event, port, source)) - engine_handle_dpad(event, port, source); + engine_handle_dpad(android_data, event, port, source); break; case AINPUT_EVENT_TYPE_KEY: { @@ -787,6 +851,22 @@ static void android_input_poll_user(void *data) } } +static void android_input_poll_memcpy(void *data) +{ + unsigned i, j; + android_input_t *android = (android_input_t*)data; + android_input_data_t *android_data = (android_input_data_t*)&android->copy; + struct android_app *android_app = (struct android_app*)g_android; + + for (i = 0; i < MAX_PADS; i++) + { + for (j = 0; j < 2; j++) + android_app->hat_state[i][j] = android_data->hat_state[i][j]; + for (j = 0; j < MAX_AXIS; j++) + android_app->analog_state[i][j] = android_data->analog_state[i][j]; + } +} + /* Handle all events. If our activity is in pause state, * block until we're unpaused. */ @@ -820,6 +900,8 @@ static void android_input_poll(void *data) return; } } + + android_input_poll_memcpy(data); } bool android_run_events(void *data) diff --git a/input/drivers_joypad/android_joypad.c b/input/drivers_joypad/android_joypad.c index a2e929cf1a..5bb937b30d 100644 --- a/input/drivers_joypad/android_joypad.c +++ b/input/drivers_joypad/android_joypad.c @@ -15,58 +15,8 @@ * If not, see . */ -#include - #include "../drivers_keyboard/keyboard_event_android.h" -static int16_t analog_state[MAX_PADS][MAX_AXIS]; -static int8_t hat_state[MAX_PADS][2]; - -static void engine_handle_dpad_default(AInputEvent *event, int port, int source) -{ - size_t motion_ptr = AMotionEvent_getAction(event) >> - AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; - float x = AMotionEvent_getX(event, motion_ptr); - float y = AMotionEvent_getY(event, motion_ptr); - - analog_state[port][0] = (int16_t)(x * 32767.0f); - analog_state[port][1] = (int16_t)(y * 32767.0f); -} - -static void engine_handle_dpad_getaxisvalue(AInputEvent *event, int port, int source) -{ - size_t motion_ptr = AMotionEvent_getAction(event) >> - AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; - float x = AMotionEvent_getAxisValue(event, AXIS_X, motion_ptr); - float y = AMotionEvent_getAxisValue(event, AXIS_Y, motion_ptr); - float z = AMotionEvent_getAxisValue(event, AXIS_Z, motion_ptr); - float rz = AMotionEvent_getAxisValue(event, AXIS_RZ, motion_ptr); - float hatx = AMotionEvent_getAxisValue(event, AXIS_HAT_X, motion_ptr); - float haty = AMotionEvent_getAxisValue(event, AXIS_HAT_Y, motion_ptr); - float ltrig = AMotionEvent_getAxisValue(event, AXIS_LTRIGGER, motion_ptr); - float rtrig = AMotionEvent_getAxisValue(event, AXIS_RTRIGGER, motion_ptr); - float brake = AMotionEvent_getAxisValue(event, AXIS_BRAKE, motion_ptr); - float gas = AMotionEvent_getAxisValue(event, AXIS_GAS, motion_ptr); - - hat_state[port][0] = (int)hatx; - hat_state[port][1] = (int)haty; - - /* XXX: this could be a loop instead, but do we really want to - * loop through every axis? */ - analog_state[port][0] = (int16_t)(x * 32767.0f); - analog_state[port][1] = (int16_t)(y * 32767.0f); - analog_state[port][2] = (int16_t)(z * 32767.0f); - analog_state[port][3] = (int16_t)(rz * 32767.0f); -#if 0 - analog_state[port][4] = (int16_t)(hatx * 32767.0f); - analog_state[port][5] = (int16_t)(haty * 32767.0f); -#endif - analog_state[port][6] = (int16_t)(ltrig * 32767.0f); - analog_state[port][7] = (int16_t)(rtrig * 32767.0f); - analog_state[port][8] = (int16_t)(brake * 32767.0f); - analog_state[port][9] = (int16_t)(gas * 32767.0f); -} - static const char *android_joypad_name(unsigned pad) { settings_t *settings = config_get_ptr(); @@ -75,27 +25,13 @@ static const char *android_joypad_name(unsigned pad) static bool android_joypad_init(void *data) { - engine_handle_dpad = engine_handle_dpad_default; - - if ((dlopen("/system/lib/libandroid.so", RTLD_LOCAL | RTLD_LAZY)) == 0) - { - RARCH_WARN("Unable to open libandroid.so\n"); - return true; - } - - if ((p_AMotionEvent_getAxisValue = dlsym(RTLD_DEFAULT, - "AMotionEvent_getAxisValue"))) - { - RARCH_LOG("Set engine_handle_dpad to 'Get Axis Value' (for reading extra analog sticks)"); - engine_handle_dpad = engine_handle_dpad_getaxisvalue; - } - return true; } static bool android_joypad_button(unsigned port, uint16_t joykey) { uint8_t *buf = android_keyboard_state_get(port); + struct android_app *android_app = (struct android_app*)g_android; if (port >= MAX_PADS) return false; @@ -109,13 +45,13 @@ static bool android_joypad_button(unsigned port, uint16_t joykey) switch (GET_HAT_DIR(joykey)) { case HAT_LEFT_MASK: - return hat_state[port][0] == -1; + return android_app->hat_state[port][0] == -1; case HAT_RIGHT_MASK: - return hat_state[port][0] == 1; + return android_app->hat_state[port][0] == 1; case HAT_UP_MASK: - return hat_state[port][1] == -1; + return android_app->hat_state[port][1] == -1; case HAT_DOWN_MASK: - return hat_state[port][1] == 1; + return android_app->hat_state[port][1] == 1; default: return false; } @@ -127,19 +63,20 @@ static bool android_joypad_button(unsigned port, uint16_t joykey) static int16_t android_joypad_axis(unsigned port, uint32_t joyaxis) { int val = 0; + struct android_app *android_app = (struct android_app*)g_android; if (joyaxis == AXIS_NONE) return 0; if (AXIS_NEG_GET(joyaxis) < MAX_AXIS) { - val = analog_state[port][AXIS_NEG_GET(joyaxis)]; + val = android_app->analog_state[port][AXIS_NEG_GET(joyaxis)]; if (val > 0) val = 0; } else if (AXIS_POS_GET(joyaxis) < MAX_AXIS) { - val = analog_state[port][AXIS_POS_GET(joyaxis)]; + val = android_app->analog_state[port][AXIS_POS_GET(joyaxis)]; if (val < 0) val = 0; } @@ -160,13 +97,14 @@ static bool android_joypad_query_pad(unsigned pad) static void android_joypad_destroy(void) { unsigned i, j; + struct android_app *android_app = (struct android_app*)g_android; for (i = 0; i < MAX_PADS; i++) { for (j = 0; j < 2; j++) - hat_state[i][j] = 0; + android_app->hat_state[i][j] = 0; for (j = 0; j < MAX_AXIS; j++) - analog_state[i][j] = 0; + android_app->analog_state[i][j] = 0; } }