Browse Source
Merge pull request #13154 from german77/vibration-filter
core: hid: Reintroduce vibration filter
pull/15/merge
liamwhite
2 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with
23 additions and
2 deletions
-
src/hid_core/frontend/emulated_controller.cpp
-
src/hid_core/frontend/emulated_controller.h
-
src/hid_core/hid_types.h
-
src/hid_core/resources/npad/npad.cpp
|
|
|
@ -2,6 +2,7 @@ |
|
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <chrono>
|
|
|
|
#include <common/scope_exit.h>
|
|
|
|
|
|
|
|
#include "common/polyfill_ranges.h"
|
|
|
|
@ -1287,6 +1288,22 @@ bool EmulatedController::SetVibration(DeviceIndex device_index, const VibrationV |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
if (!Settings::values.enable_accurate_vibrations.GetValue()) { |
|
|
|
using std::chrono::duration_cast; |
|
|
|
using std::chrono::milliseconds; |
|
|
|
using std::chrono::steady_clock; |
|
|
|
|
|
|
|
const auto now = steady_clock::now(); |
|
|
|
|
|
|
|
// Filter out non-zero vibrations that are within 15ms of each other.
|
|
|
|
if ((vibration.low_amplitude != 0.0f || vibration.high_amplitude != 0.0f) && |
|
|
|
duration_cast<milliseconds>(now - last_vibration_timepoint[index]) < milliseconds(15)) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
last_vibration_timepoint[index] = now; |
|
|
|
} |
|
|
|
|
|
|
|
// Exponential amplification is too strong at low amplitudes. Switch to a linear
|
|
|
|
// amplification if strength is set below 0.7f
|
|
|
|
const Common::Input::VibrationAmplificationType type = |
|
|
|
|
|
|
|
@ -583,6 +583,7 @@ private: |
|
|
|
std::size_t nfc_handles{0}; |
|
|
|
std::array<VibrationValue, 2> last_vibration_value{DEFAULT_VIBRATION_VALUE, |
|
|
|
DEFAULT_VIBRATION_VALUE}; |
|
|
|
std::array<std::chrono::steady_clock::time_point, 2> last_vibration_timepoint{}; |
|
|
|
|
|
|
|
// Temporary values to avoid doing changes while the controller is in configuring mode |
|
|
|
NpadStyleIndex tmp_npad_type{NpadStyleIndex::None}; |
|
|
|
|
|
|
|
@ -638,7 +638,11 @@ struct VibrationValue { |
|
|
|
if (low_amplitude != b.low_amplitude || high_amplitude != b.high_amplitude) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
if (low_frequency != b.low_amplitude || high_frequency != b.high_frequency) { |
|
|
|
// Changes in frequency without amplitude don't have any effect |
|
|
|
if (low_amplitude == 0 && high_amplitude == 0) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
if (low_frequency != b.low_frequency || high_frequency != b.high_frequency) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
return true; |
|
|
|
|
|
|
|
@ -3,7 +3,6 @@ |
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
#include <array>
|
|
|
|
#include <chrono>
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
#include "common/assert.h"
|
|
|
|
|