From 1e223733fc17a290d503fae5de80928e444bcd9f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sat, 29 Aug 2020 23:47:56 +0200 Subject: [PATCH] Add joypad_rumble function in Android joypad driver --- input/drivers/android_input.c | 78 ++----------------------- input/drivers_joypad/android_joypad.c | 82 ++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 75 deletions(-) diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index 63a0753ae1..e00231ae65 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -1607,83 +1607,13 @@ static void android_input_grab_mouse(void *data, bool state) (void)state; } -static void android_input_set_rumble_internal( - uint16_t strength, - uint16_t *last_strength_strong, - uint16_t *last_strength_weak, - uint16_t *last_strength, - int8_t id, - enum retro_rumble_effect effect - ) -{ - JNIEnv *env = (JNIEnv*)jni_thread_getenv(); - uint16_t new_strength = 0; - - if (!env) - return; - - if (effect == RETRO_RUMBLE_STRONG) - { - new_strength = strength | *last_strength_weak; - *last_strength_strong = strength; - } - else if (effect == RETRO_RUMBLE_WEAK) - { - new_strength = strength | *last_strength_strong; - *last_strength_weak = strength; - } - - if (new_strength != *last_strength) - { - /* trying to send this value as a JNI param without - * storing it first was causing 0 to be seen on the other side ?? */ - int strength_final = (255.0f / 65535.0f) * (float)new_strength; - - CALL_VOID_METHOD_PARAM(env, g_android->activity->clazz, - g_android->doVibrate, (jint)id, (jint)RETRO_RUMBLE_STRONG, (jint)strength_final, (jint)0); - - *last_strength = new_strength; - } -} - static bool android_input_set_rumble(void *data, unsigned port, enum retro_rumble_effect effect, uint16_t strength) { - settings_t *settings = config_get_ptr(); - bool enable_device_vibration = settings->bools.enable_device_vibration; - - if (!g_android || !g_android->doVibrate) - return false; - - if (enable_device_vibration) - { - static uint16_t last_strength_strong = 0; - static uint16_t last_strength_weak = 0; - static uint16_t last_strength = 0; - - if (port != 0) - return false; - - android_input_set_rumble_internal( - strength, - &last_strength_strong, - &last_strength_weak, - &last_strength, - -1, - effect); - } - else - { - android_input_set_rumble_internal( - strength, - &g_android->rumble_last_strength_strong[port], - &g_android->rumble_last_strength_weak[port], - &g_android->rumble_last_strength[port], - g_android->id[port], - effect); - } - - return true; + android_input_t *android = (android_input_t*)data; + if (android) + return input_joypad_set_rumble(android->joypad, port, effect, strength); + return false; } input_driver_t input_android = { diff --git a/input/drivers_joypad/android_joypad.c b/input/drivers_joypad/android_joypad.c index 402d819e68..1f0864093a 100644 --- a/input/drivers_joypad/android_joypad.c +++ b/input/drivers_joypad/android_joypad.c @@ -163,6 +163,86 @@ static void android_joypad_destroy(void) } } +static void android_input_set_rumble_internal( + uint16_t strength, + uint16_t *last_strength_strong, + uint16_t *last_strength_weak, + uint16_t *last_strength, + int8_t id, + enum retro_rumble_effect effect + ) +{ + JNIEnv *env = (JNIEnv*)jni_thread_getenv(); + uint16_t new_strength = 0; + + if (!env) + return; + + if (effect == RETRO_RUMBLE_STRONG) + { + new_strength = strength | *last_strength_weak; + *last_strength_strong = strength; + } + else if (effect == RETRO_RUMBLE_WEAK) + { + new_strength = strength | *last_strength_strong; + *last_strength_weak = strength; + } + + if (new_strength != *last_strength) + { + /* trying to send this value as a JNI param without + * storing it first was causing 0 to be seen on the other side ?? */ + int strength_final = (255.0f / 65535.0f) * (float)new_strength; + + CALL_VOID_METHOD_PARAM(env, g_android->activity->clazz, + g_android->doVibrate, (jint)id, (jint)RETRO_RUMBLE_STRONG, (jint)strength_final, (jint)0); + + *last_strength = new_strength; + } +} + +static bool android_joypad_rumble(unsigned port, + enum retro_rumble_effect type, uint16_t strength) +{ + settings_t *settings = config_get_ptr(); + struct android_app *android_app = (struct android_app*)g_android; + bool enable_device_vibration = settings->bools.enable_device_vibration; + + if (!android_app || !android_app->doVibrate) + return false; + + if (enable_device_vibration) + { + static uint16_t last_strength_strong = 0; + static uint16_t last_strength_weak = 0; + static uint16_t last_strength = 0; + + if (port != 0) + return false; + + android_input_set_rumble_internal( + strength, + &last_strength_strong, + &last_strength_weak, + &last_strength, + -1, + type); + } + else + { + android_input_set_rumble_internal( + strength, + &android_app->rumble_last_strength_strong[port], + &android_app->rumble_last_strength_weak[port], + &android_app->rumble_last_strength[port], + android_app->id[port], + type); + } + + return true; +} + input_device_driver_t android_joypad = { android_joypad_init, android_joypad_query_pad, @@ -172,7 +252,7 @@ input_device_driver_t android_joypad = { NULL, android_joypad_axis, android_joypad_poll, - NULL, + android_joypad_rumble, android_joypad_name, "android", };