Add joypad_rumble function in Android joypad driver
This commit is contained in:
parent
71fb5ac941
commit
1e223733fc
|
@ -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 = {
|
||||
|
|
|
@ -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",
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue