Add joypad_rumble function in Android joypad driver

This commit is contained in:
twinaphex 2020-08-29 23:47:56 +02:00
parent 71fb5ac941
commit 1e223733fc
2 changed files with 85 additions and 75 deletions

View File

@ -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 = {

View File

@ -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",
};