summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/core/frontend/input.h2
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp51
2 files changed, 47 insertions, 6 deletions
diff --git a/src/core/frontend/input.h b/src/core/frontend/input.h
index 277b70e53..fb2ce2514 100644
--- a/src/core/frontend/input.h
+++ b/src/core/frontend/input.h
@@ -33,7 +33,7 @@ public:
virtual bool GetAnalogDirectionStatus(AnalogDirection direction) const {
return {};
}
- virtual bool SetRumblePlay(f32 amp_high, f32 amp_low, f32 freq_high, f32 freq_low) const {
+ virtual bool SetRumblePlay(f32 amp_low, f32 freq_low, f32 amp_high, f32 freq_high) const {
return {};
}
};
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 924f209c0..cc54b164d 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -698,16 +698,57 @@ void Controller_NPad::VibrateController(const std::vector<DeviceHandle>& vibrati
continue;
}
+ // Filter out vibrations with equivalent values to reduce unnecessary state changes.
+ if (vibration_values[i].amp_low ==
+ latest_vibration_values[npad_index][device_index].amp_low &&
+ vibration_values[i].amp_high ==
+ latest_vibration_values[npad_index][device_index].amp_high) {
+ continue;
+ }
+
+ // Filter out non-zero vibrations that are within 0.015625 absolute amplitude of each other.
+ if ((vibration_values[i].amp_low != 0.0f || vibration_values[i].amp_high != 0.0f) &&
+ (latest_vibration_values[npad_index][device_index].amp_low != 0.0f ||
+ latest_vibration_values[npad_index][device_index].amp_high != 0.0f) &&
+ (abs(vibration_values[i].amp_low -
+ latest_vibration_values[npad_index][device_index].amp_low) < 0.015625f &&
+ abs(vibration_values[i].amp_high -
+ latest_vibration_values[npad_index][device_index].amp_high) < 0.015625f)) {
+ continue;
+ }
+
using namespace Settings::NativeButton;
const auto& button_state = buttons[npad_index];
// TODO: Vibrate left/right vibration motors independently if possible.
- button_state[A - BUTTON_HID_BEGIN]->SetRumblePlay(
- vibration_values[i].amp_high * Settings::values.vibration_strength.GetValue() / 100,
+ const bool success = button_state[A - BUTTON_HID_BEGIN]->SetRumblePlay(
vibration_values[i].amp_low * Settings::values.vibration_strength.GetValue() / 100,
- vibration_values[i].freq_high, vibration_values[i].freq_low);
-
- latest_vibration_values[npad_index][device_index] = vibration_values[i];
+ vibration_values[i].freq_low,
+ vibration_values[i].amp_high * Settings::values.vibration_strength.GetValue() / 100,
+ vibration_values[i].freq_high);
+
+ if (success) {
+ switch (connected_controllers[npad_index].type) {
+ case NPadControllerType::None:
+ UNREACHABLE();
+ break;
+ case NPadControllerType::ProController:
+ case NPadControllerType::Handheld:
+ case NPadControllerType::JoyDual:
+ // Since we can't vibrate motors independently yet, we can reduce state changes by
+ // assigning all 3 device indices the current vibration value.
+ latest_vibration_values[npad_index][0] = vibration_values[i];
+ latest_vibration_values[npad_index][1] = vibration_values[i];
+ latest_vibration_values[npad_index][2] = vibration_values[i];
+ break;
+ case NPadControllerType::JoyLeft:
+ case NPadControllerType::JoyRight:
+ case NPadControllerType::Pokeball:
+ default:
+ latest_vibration_values[npad_index][device_index] = vibration_values[i];
+ break;
+ }
+ }
}
}