From 3b1c2896d9bc0f9f1bdfddc3820dc7d2483f4486 Mon Sep 17 00:00:00 2001 From: Narr the Reg Date: Tue, 23 Jan 2024 11:01:35 -0600 Subject: [PATCH 1/2] core: hid: Only set polling mode if needed --- src/hid_core/frontend/emulated_controller.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/hid_core/frontend/emulated_controller.cpp b/src/hid_core/frontend/emulated_controller.cpp index e12e5a77e..063f5b15a 100644 --- a/src/hid_core/frontend/emulated_controller.cpp +++ b/src/hid_core/frontend/emulated_controller.cpp @@ -110,7 +110,11 @@ void EmulatedController::ReloadFromSettings() { original_npad_type = npad_type; } - SetPollingMode(EmulatedDeviceIndex::RightIndex, Common::Input::PollingMode::Active); + // Disable special features before disconnecting + if (controller.right_polling_mode != Common::Input::PollingMode::Active) { + SetPollingMode(EmulatedDeviceIndex::RightIndex, Common::Input::PollingMode::Active); + } + Disconnect(); if (player.connected) { Connect(); From ad4622da2cad626b1acdbf1c3985d4d5b6e86bb0 Mon Sep 17 00:00:00 2001 From: Narr the Reg Date: Tue, 23 Jan 2024 11:10:34 -0600 Subject: [PATCH 2/2] core: hid: Skip duplicated vibrations --- src/hid_core/frontend/emulated_controller.cpp | 12 ++++++++++-- src/hid_core/frontend/emulated_controller.h | 3 ++- src/hid_core/hid_types.h | 9 +++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/hid_core/frontend/emulated_controller.cpp b/src/hid_core/frontend/emulated_controller.cpp index 063f5b15a..819460eb5 100644 --- a/src/hid_core/frontend/emulated_controller.cpp +++ b/src/hid_core/frontend/emulated_controller.cpp @@ -1245,7 +1245,12 @@ bool EmulatedController::SetVibration(DeviceIndex device_index, const VibrationV return false; } - last_vibration_value = vibration; + // Skip duplicated vibrations + if (last_vibration_value[index] == vibration) { + return Settings::values.vibration_enabled.GetValue(); + } + + last_vibration_value[index] = vibration; if (!Settings::values.vibration_enabled) { return false; @@ -1276,7 +1281,10 @@ bool EmulatedController::SetVibration(DeviceIndex device_index, const VibrationV } VibrationValue EmulatedController::GetActualVibrationValue(DeviceIndex device_index) const { - return last_vibration_value; + if (device_index >= DeviceIndex::MaxDeviceIndex) { + return Core::HID::DEFAULT_VIBRATION_VALUE; + } + return last_vibration_value[static_cast(device_index)]; } bool EmulatedController::IsVibrationEnabled(std::size_t device_index) { diff --git a/src/hid_core/frontend/emulated_controller.h b/src/hid_core/frontend/emulated_controller.h index 168abe089..701b38300 100644 --- a/src/hid_core/frontend/emulated_controller.h +++ b/src/hid_core/frontend/emulated_controller.h @@ -581,7 +581,8 @@ private: f32 motion_sensitivity{Core::HID::MotionInput::IsAtRestStandard}; u32 turbo_button_state{0}; std::size_t nfc_handles{0}; - VibrationValue last_vibration_value{DEFAULT_VIBRATION_VALUE}; + std::array last_vibration_value{DEFAULT_VIBRATION_VALUE, + DEFAULT_VIBRATION_VALUE}; // Temporary values to avoid doing changes while the controller is in configuring mode NpadStyleIndex tmp_npad_type{NpadStyleIndex::None}; diff --git a/src/hid_core/hid_types.h b/src/hid_core/hid_types.h index 2c3f02f34..a01292a70 100644 --- a/src/hid_core/hid_types.h +++ b/src/hid_core/hid_types.h @@ -639,6 +639,15 @@ struct VibrationValue { f32 low_frequency{}; f32 high_amplitude{}; f32 high_frequency{}; + bool operator==(const VibrationValue& b) { + if (low_amplitude != b.low_amplitude || high_amplitude != b.high_amplitude) { + return false; + } + if (low_frequency != b.low_amplitude || high_frequency != b.high_frequency) { + return false; + } + return true; + } }; static_assert(sizeof(VibrationValue) == 0x10, "VibrationValue has incorrect size.");