|
|
@@ -3,6 +3,7 @@
|
|
|
|
|
|
#include <set>
|
|
|
#include <common/settings_input.h>
|
|
|
+#include <common/thread.h>
|
|
|
#include <jni.h>
|
|
|
#include "common/android/android_common.h"
|
|
|
#include "common/android/id_cache.h"
|
|
|
@@ -10,7 +11,18 @@
|
|
|
|
|
|
namespace InputCommon {
|
|
|
|
|
|
-Android::Android(std::string input_engine_) : InputEngine(std::move(input_engine_)) {}
|
|
|
+Android::Android(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
|
|
|
+ vibration_thread = std::jthread([this](std::stop_token token) {
|
|
|
+ Common::SetCurrentThreadName("Android_Vibration");
|
|
|
+ auto env = Common::Android::GetEnvForThread();
|
|
|
+ using namespace std::chrono_literals;
|
|
|
+ while (!token.stop_requested()) {
|
|
|
+ SendVibrations(env, token);
|
|
|
+ }
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+Android::~Android() = default;
|
|
|
|
|
|
void Android::RegisterController(jobject j_input_device) {
|
|
|
auto env = Common::Android::GetEnvForThread();
|
|
|
@@ -57,17 +69,11 @@ void Android::SetMotionState(std::string guid, size_t port, u64 delta_timestamp,
|
|
|
Common::Input::DriverResult Android::SetVibration(
|
|
|
[[maybe_unused]] const PadIdentifier& identifier,
|
|
|
[[maybe_unused]] const Common::Input::VibrationStatus& vibration) {
|
|
|
- auto device = input_devices.find(identifier);
|
|
|
- if (device != input_devices.end()) {
|
|
|
- Common::Android::RunJNIOnFiber<void>([&](JNIEnv* env) {
|
|
|
- float average_intensity =
|
|
|
- static_cast<float>((vibration.high_amplitude + vibration.low_amplitude) / 2.0);
|
|
|
- env->CallVoidMethod(device->second, Common::Android::GetYuzuDeviceVibrate(),
|
|
|
- average_intensity);
|
|
|
- });
|
|
|
- return Common::Input::DriverResult::Success;
|
|
|
- }
|
|
|
- return Common::Input::DriverResult::NotSupported;
|
|
|
+ vibration_queue.Push(VibrationRequest{
|
|
|
+ .identifier = identifier,
|
|
|
+ .vibration = vibration,
|
|
|
+ });
|
|
|
+ return Common::Input::DriverResult::Success;
|
|
|
}
|
|
|
|
|
|
bool Android::IsVibrationEnabled([[maybe_unused]] const PadIdentifier& identifier) {
|
|
|
@@ -347,4 +353,15 @@ PadIdentifier Android::GetIdentifier(const std::string& guid, size_t port) const
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+void Android::SendVibrations(JNIEnv* env, std::stop_token token) {
|
|
|
+ VibrationRequest request = vibration_queue.PopWait(token);
|
|
|
+ auto device = input_devices.find(request.identifier);
|
|
|
+ if (device != input_devices.end()) {
|
|
|
+ float average_intensity = static_cast<float>(
|
|
|
+ (request.vibration.high_amplitude + request.vibration.low_amplitude) / 2.0);
|
|
|
+ env->CallVoidMethod(device->second, Common::Android::GetYuzuDeviceVibrate(),
|
|
|
+ average_intensity);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
} // namespace InputCommon
|