summaryrefslogtreecommitdiff
path: root/src/input_common/drivers/android.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/drivers/android.cpp')
-rw-r--r--src/input_common/drivers/android.cpp41
1 files changed, 29 insertions, 12 deletions
diff --git a/src/input_common/drivers/android.cpp b/src/input_common/drivers/android.cpp
index e859cc538..d40fa66ae 100644
--- a/src/input_common/drivers/android.cpp
+++ b/src/input_common/drivers/android.cpp
@@ -3,6 +3,7 @@
3 3
4#include <set> 4#include <set>
5#include <common/settings_input.h> 5#include <common/settings_input.h>
6#include <common/thread.h>
6#include <jni.h> 7#include <jni.h>
7#include "common/android/android_common.h" 8#include "common/android/android_common.h"
8#include "common/android/id_cache.h" 9#include "common/android/id_cache.h"
@@ -10,7 +11,18 @@
10 11
11namespace InputCommon { 12namespace InputCommon {
12 13
13Android::Android(std::string input_engine_) : InputEngine(std::move(input_engine_)) {} 14Android::Android(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
15 vibration_thread = std::jthread([this](std::stop_token token) {
16 Common::SetCurrentThreadName("Android_Vibration");
17 auto env = Common::Android::GetEnvForThread();
18 using namespace std::chrono_literals;
19 while (!token.stop_requested()) {
20 SendVibrations(env, token);
21 }
22 });
23}
24
25Android::~Android() = default;
14 26
15void Android::RegisterController(jobject j_input_device) { 27void Android::RegisterController(jobject j_input_device) {
16 auto env = Common::Android::GetEnvForThread(); 28 auto env = Common::Android::GetEnvForThread();
@@ -57,17 +69,11 @@ void Android::SetMotionState(std::string guid, size_t port, u64 delta_timestamp,
57Common::Input::DriverResult Android::SetVibration( 69Common::Input::DriverResult Android::SetVibration(
58 [[maybe_unused]] const PadIdentifier& identifier, 70 [[maybe_unused]] const PadIdentifier& identifier,
59 [[maybe_unused]] const Common::Input::VibrationStatus& vibration) { 71 [[maybe_unused]] const Common::Input::VibrationStatus& vibration) {
60 auto device = input_devices.find(identifier); 72 vibration_queue.Push(VibrationRequest{
61 if (device != input_devices.end()) { 73 .identifier = identifier,
62 Common::Android::RunJNIOnFiber<void>([&](JNIEnv* env) { 74 .vibration = vibration,
63 float average_intensity = 75 });
64 static_cast<float>((vibration.high_amplitude + vibration.low_amplitude) / 2.0); 76 return Common::Input::DriverResult::Success;
65 env->CallVoidMethod(device->second, Common::Android::GetYuzuDeviceVibrate(),
66 average_intensity);
67 });
68 return Common::Input::DriverResult::Success;
69 }
70 return Common::Input::DriverResult::NotSupported;
71} 77}
72 78
73bool Android::IsVibrationEnabled([[maybe_unused]] const PadIdentifier& identifier) { 79bool Android::IsVibrationEnabled([[maybe_unused]] const PadIdentifier& identifier) {
@@ -347,4 +353,15 @@ PadIdentifier Android::GetIdentifier(const std::string& guid, size_t port) const
347 }; 353 };
348} 354}
349 355
356void Android::SendVibrations(JNIEnv* env, std::stop_token token) {
357 VibrationRequest request = vibration_queue.PopWait(token);
358 auto device = input_devices.find(request.identifier);
359 if (device != input_devices.end()) {
360 float average_intensity = static_cast<float>(
361 (request.vibration.high_amplitude + request.vibration.low_amplitude) / 2.0);
362 env->CallVoidMethod(device->second, Common::Android::GetYuzuDeviceVibrate(),
363 average_intensity);
364 }
365}
366
350} // namespace InputCommon 367} // namespace InputCommon