diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/yuzu/applets/qt_controller.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_vibration.cpp | 74 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_vibration.h | 18 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_vibration.ui | 7 |
5 files changed, 95 insertions, 8 deletions
diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp index 4239c17f5..4104928d1 100644 --- a/src/yuzu/applets/qt_controller.cpp +++ b/src/yuzu/applets/qt_controller.cpp | |||
| @@ -257,7 +257,7 @@ void QtControllerSelectorDialog::LoadConfiguration() { | |||
| 257 | } | 257 | } |
| 258 | 258 | ||
| 259 | void QtControllerSelectorDialog::CallConfigureVibrationDialog() { | 259 | void QtControllerSelectorDialog::CallConfigureVibrationDialog() { |
| 260 | ConfigureVibration dialog(this); | 260 | ConfigureVibration dialog(this, system.HIDCore()); |
| 261 | 261 | ||
| 262 | dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | | 262 | dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | |
| 263 | Qt::WindowSystemMenuHint); | 263 | Qt::WindowSystemMenuHint); |
diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index d53179dbb..7c5776189 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp | |||
| @@ -164,7 +164,7 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem, | |||
| 164 | }); | 164 | }); |
| 165 | 165 | ||
| 166 | connect(ui->vibrationButton, &QPushButton::clicked, | 166 | connect(ui->vibrationButton, &QPushButton::clicked, |
| 167 | [this] { CallConfigureDialog<ConfigureVibration>(*this); }); | 167 | [this, &hid_core] { CallConfigureDialog<ConfigureVibration>(*this, hid_core); }); |
| 168 | 168 | ||
| 169 | connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] { | 169 | connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] { |
| 170 | CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem); | 170 | CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem); |
diff --git a/src/yuzu/configuration/configure_vibration.cpp b/src/yuzu/configuration/configure_vibration.cpp index adce04b27..779b6401c 100644 --- a/src/yuzu/configuration/configure_vibration.cpp +++ b/src/yuzu/configuration/configure_vibration.cpp | |||
| @@ -9,11 +9,14 @@ | |||
| 9 | 9 | ||
| 10 | #include "common/param_package.h" | 10 | #include "common/param_package.h" |
| 11 | #include "common/settings.h" | 11 | #include "common/settings.h" |
| 12 | #include "core/hid/emulated_controller.h" | ||
| 13 | #include "core/hid/hid_core.h" | ||
| 14 | #include "core/hid/hid_types.h" | ||
| 12 | #include "ui_configure_vibration.h" | 15 | #include "ui_configure_vibration.h" |
| 13 | #include "yuzu/configuration/configure_vibration.h" | 16 | #include "yuzu/configuration/configure_vibration.h" |
| 14 | 17 | ||
| 15 | ConfigureVibration::ConfigureVibration(QWidget* parent) | 18 | ConfigureVibration::ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_) |
| 16 | : QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()) { | 19 | : QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()), hid_core{hid_core_} { |
| 17 | ui->setupUi(this); | 20 | ui->setupUi(this); |
| 18 | 21 | ||
| 19 | vibration_groupboxes = { | 22 | vibration_groupboxes = { |
| @@ -31,6 +34,13 @@ ConfigureVibration::ConfigureVibration(QWidget* parent) | |||
| 31 | const auto& players = Settings::values.players.GetValue(); | 34 | const auto& players = Settings::values.players.GetValue(); |
| 32 | 35 | ||
| 33 | for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { | 36 | for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { |
| 37 | auto controller = hid_core.GetEmulatedControllerByIndex(i); | ||
| 38 | Core::HID::ControllerUpdateCallback engine_callback{ | ||
| 39 | .on_change = [this, | ||
| 40 | i](Core::HID::ControllerTriggerType type) { VibrateController(type, i); }, | ||
| 41 | .is_npad_service = false, | ||
| 42 | }; | ||
| 43 | controller_callback_key[i] = controller->SetCallback(engine_callback); | ||
| 34 | vibration_groupboxes[i]->setChecked(players[i].vibration_enabled); | 44 | vibration_groupboxes[i]->setChecked(players[i].vibration_enabled); |
| 35 | vibration_spinboxes[i]->setValue(players[i].vibration_strength); | 45 | vibration_spinboxes[i]->setValue(players[i].vibration_strength); |
| 36 | } | 46 | } |
| @@ -45,7 +55,14 @@ ConfigureVibration::ConfigureVibration(QWidget* parent) | |||
| 45 | RetranslateUI(); | 55 | RetranslateUI(); |
| 46 | } | 56 | } |
| 47 | 57 | ||
| 48 | ConfigureVibration::~ConfigureVibration() = default; | 58 | ConfigureVibration::~ConfigureVibration() { |
| 59 | StopVibrations(); | ||
| 60 | |||
| 61 | for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { | ||
| 62 | auto controller = hid_core.GetEmulatedControllerByIndex(i); | ||
| 63 | controller->DeleteCallback(controller_callback_key[i]); | ||
| 64 | } | ||
| 65 | }; | ||
| 49 | 66 | ||
| 50 | void ConfigureVibration::ApplyConfiguration() { | 67 | void ConfigureVibration::ApplyConfiguration() { |
| 51 | auto& players = Settings::values.players.GetValue(); | 68 | auto& players = Settings::values.players.GetValue(); |
| @@ -70,3 +87,54 @@ void ConfigureVibration::changeEvent(QEvent* event) { | |||
| 70 | void ConfigureVibration::RetranslateUI() { | 87 | void ConfigureVibration::RetranslateUI() { |
| 71 | ui->retranslateUi(this); | 88 | ui->retranslateUi(this); |
| 72 | } | 89 | } |
| 90 | |||
| 91 | void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type, | ||
| 92 | std::size_t player_index) { | ||
| 93 | if (type != Core::HID::ControllerTriggerType::Button) { | ||
| 94 | return; | ||
| 95 | } | ||
| 96 | |||
| 97 | auto& player = Settings::values.players.GetValue()[player_index]; | ||
| 98 | auto controller = hid_core.GetEmulatedControllerByIndex(player_index); | ||
| 99 | const int vibration_strenght = vibration_spinboxes[player_index]->value(); | ||
| 100 | const auto& buttons = controller->GetButtonsValues(); | ||
| 101 | |||
| 102 | bool button_is_pressed = false; | ||
| 103 | for (std::size_t i = 0; i < buttons.size(); ++i) { | ||
| 104 | if (buttons[i].value) { | ||
| 105 | button_is_pressed = true; | ||
| 106 | break; | ||
| 107 | } | ||
| 108 | } | ||
| 109 | |||
| 110 | if (!button_is_pressed) { | ||
| 111 | StopVibrations(); | ||
| 112 | return; | ||
| 113 | } | ||
| 114 | |||
| 115 | const int old_vibration_enabled = player.vibration_enabled; | ||
| 116 | const bool old_vibration_strenght = player.vibration_strength; | ||
| 117 | player.vibration_enabled = true; | ||
| 118 | player.vibration_strength = vibration_strenght; | ||
| 119 | |||
| 120 | const Core::HID::VibrationValue vibration{ | ||
| 121 | .low_amplitude = 1.0f, | ||
| 122 | .low_frequency = 160.0f, | ||
| 123 | .high_amplitude = 1.0f, | ||
| 124 | .high_frequency = 320.0f, | ||
| 125 | }; | ||
| 126 | controller->SetVibration(0, vibration); | ||
| 127 | controller->SetVibration(1, vibration); | ||
| 128 | |||
| 129 | // Restore previous values | ||
| 130 | player.vibration_enabled = old_vibration_enabled; | ||
| 131 | player.vibration_strength = old_vibration_strenght; | ||
| 132 | } | ||
| 133 | |||
| 134 | void ConfigureVibration::StopVibrations() { | ||
| 135 | for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { | ||
| 136 | auto controller = hid_core.GetEmulatedControllerByIndex(i); | ||
| 137 | controller->SetVibration(0, Core::HID::DEFAULT_VIBRATION_VALUE); | ||
| 138 | controller->SetVibration(1, Core::HID::DEFAULT_VIBRATION_VALUE); | ||
| 139 | } | ||
| 140 | } | ||
diff --git a/src/yuzu/configuration/configure_vibration.h b/src/yuzu/configuration/configure_vibration.h index 37bbc2653..50b8195fa 100644 --- a/src/yuzu/configuration/configure_vibration.h +++ b/src/yuzu/configuration/configure_vibration.h | |||
| @@ -15,11 +15,16 @@ namespace Ui { | |||
| 15 | class ConfigureVibration; | 15 | class ConfigureVibration; |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | namespace Core::HID { | ||
| 19 | enum class ControllerTriggerType; | ||
| 20 | class HIDCore; | ||
| 21 | } // namespace Core::HID | ||
| 22 | |||
| 18 | class ConfigureVibration : public QDialog { | 23 | class ConfigureVibration : public QDialog { |
| 19 | Q_OBJECT | 24 | Q_OBJECT |
| 20 | 25 | ||
| 21 | public: | 26 | public: |
| 22 | explicit ConfigureVibration(QWidget* parent); | 27 | explicit ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_); |
| 23 | ~ConfigureVibration() override; | 28 | ~ConfigureVibration() override; |
| 24 | 29 | ||
| 25 | void ApplyConfiguration(); | 30 | void ApplyConfiguration(); |
| @@ -27,14 +32,21 @@ public: | |||
| 27 | private: | 32 | private: |
| 28 | void changeEvent(QEvent* event) override; | 33 | void changeEvent(QEvent* event) override; |
| 29 | void RetranslateUI(); | 34 | void RetranslateUI(); |
| 35 | void VibrateController(Core::HID::ControllerTriggerType type, std::size_t player_index); | ||
| 36 | void StopVibrations(); | ||
| 30 | 37 | ||
| 31 | std::unique_ptr<Ui::ConfigureVibration> ui; | 38 | std::unique_ptr<Ui::ConfigureVibration> ui; |
| 32 | 39 | ||
| 33 | static constexpr std::size_t NUM_PLAYERS = 8; | 40 | static constexpr std::size_t NUM_PLAYERS = 8; |
| 34 | 41 | ||
| 35 | // Groupboxes encapsulating the vibration strength spinbox. | 42 | /// Groupboxes encapsulating the vibration strength spinbox. |
| 36 | std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes; | 43 | std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes; |
| 37 | 44 | ||
| 38 | // Spinboxes representing the vibration strength percentage. | 45 | /// Spinboxes representing the vibration strength percentage. |
| 39 | std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes; | 46 | std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes; |
| 47 | |||
| 48 | /// Callback index to stop the controllers events | ||
| 49 | std::array<int, NUM_PLAYERS> controller_callback_key; | ||
| 50 | |||
| 51 | Core::HID::HIDCore& hid_core; | ||
| 40 | }; | 52 | }; |
diff --git a/src/yuzu/configuration/configure_vibration.ui b/src/yuzu/configuration/configure_vibration.ui index efdf317a9..447a18eb1 100644 --- a/src/yuzu/configuration/configure_vibration.ui +++ b/src/yuzu/configuration/configure_vibration.ui | |||
| @@ -17,6 +17,13 @@ | |||
| 17 | <string notr="true"/> | 17 | <string notr="true"/> |
| 18 | </property> | 18 | </property> |
| 19 | <layout class="QVBoxLayout"> | 19 | <layout class="QVBoxLayout"> |
| 20 | <item row="0" column="0" colspan="4"> | ||
| 21 | <widget class="QLabel" name="label_1"> | ||
| 22 | <property name="text"> | ||
| 23 | <string>Press any controller button to vibrate the controller.</string> | ||
| 24 | </property> | ||
| 25 | </widget> | ||
| 26 | </item> | ||
| 20 | <item> | 27 | <item> |
| 21 | <widget class="QGroupBox" name="vibrationStrengthGroup"> | 28 | <widget class="QGroupBox" name="vibrationStrengthGroup"> |
| 22 | <property name="title"> | 29 | <property name="title"> |