diff options
Diffstat (limited to 'src/input_common/input_engine.cpp')
| -rw-r--r-- | src/input_common/input_engine.cpp | 51 |
1 files changed, 25 insertions, 26 deletions
diff --git a/src/input_common/input_engine.cpp b/src/input_common/input_engine.cpp index 738022ece..12214d146 100644 --- a/src/input_common/input_engine.cpp +++ b/src/input_common/input_engine.cpp | |||
| @@ -1,6 +1,5 @@ | |||
| 1 | // Copyright 2021 yuzu Emulator Project | 1 | // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project |
| 2 | // Licensed under GPLv2 or any later version | 2 | // SPDX-License-Identifier: GPL-2.0-or-later |
| 3 | // Refer to the license.txt file included | ||
| 4 | 3 | ||
| 5 | #include "common/logging/log.h" | 4 | #include "common/logging/log.h" |
| 6 | #include "input_common/input_engine.h" | 5 | #include "input_common/input_engine.h" |
| @@ -8,37 +7,37 @@ | |||
| 8 | namespace InputCommon { | 7 | namespace InputCommon { |
| 9 | 8 | ||
| 10 | void InputEngine::PreSetController(const PadIdentifier& identifier) { | 9 | void InputEngine::PreSetController(const PadIdentifier& identifier) { |
| 11 | std::lock_guard lock{mutex}; | 10 | std::scoped_lock lock{mutex}; |
| 12 | controller_list.try_emplace(identifier); | 11 | controller_list.try_emplace(identifier); |
| 13 | } | 12 | } |
| 14 | 13 | ||
| 15 | void InputEngine::PreSetButton(const PadIdentifier& identifier, int button) { | 14 | void InputEngine::PreSetButton(const PadIdentifier& identifier, int button) { |
| 16 | std::lock_guard lock{mutex}; | 15 | std::scoped_lock lock{mutex}; |
| 17 | ControllerData& controller = controller_list.at(identifier); | 16 | ControllerData& controller = controller_list.at(identifier); |
| 18 | controller.buttons.try_emplace(button, false); | 17 | controller.buttons.try_emplace(button, false); |
| 19 | } | 18 | } |
| 20 | 19 | ||
| 21 | void InputEngine::PreSetHatButton(const PadIdentifier& identifier, int button) { | 20 | void InputEngine::PreSetHatButton(const PadIdentifier& identifier, int button) { |
| 22 | std::lock_guard lock{mutex}; | 21 | std::scoped_lock lock{mutex}; |
| 23 | ControllerData& controller = controller_list.at(identifier); | 22 | ControllerData& controller = controller_list.at(identifier); |
| 24 | controller.hat_buttons.try_emplace(button, u8{0}); | 23 | controller.hat_buttons.try_emplace(button, u8{0}); |
| 25 | } | 24 | } |
| 26 | 25 | ||
| 27 | void InputEngine::PreSetAxis(const PadIdentifier& identifier, int axis) { | 26 | void InputEngine::PreSetAxis(const PadIdentifier& identifier, int axis) { |
| 28 | std::lock_guard lock{mutex}; | 27 | std::scoped_lock lock{mutex}; |
| 29 | ControllerData& controller = controller_list.at(identifier); | 28 | ControllerData& controller = controller_list.at(identifier); |
| 30 | controller.axes.try_emplace(axis, 0.0f); | 29 | controller.axes.try_emplace(axis, 0.0f); |
| 31 | } | 30 | } |
| 32 | 31 | ||
| 33 | void InputEngine::PreSetMotion(const PadIdentifier& identifier, int motion) { | 32 | void InputEngine::PreSetMotion(const PadIdentifier& identifier, int motion) { |
| 34 | std::lock_guard lock{mutex}; | 33 | std::scoped_lock lock{mutex}; |
| 35 | ControllerData& controller = controller_list.at(identifier); | 34 | ControllerData& controller = controller_list.at(identifier); |
| 36 | controller.motions.try_emplace(motion); | 35 | controller.motions.try_emplace(motion); |
| 37 | } | 36 | } |
| 38 | 37 | ||
| 39 | void InputEngine::SetButton(const PadIdentifier& identifier, int button, bool value) { | 38 | void InputEngine::SetButton(const PadIdentifier& identifier, int button, bool value) { |
| 40 | { | 39 | { |
| 41 | std::lock_guard lock{mutex}; | 40 | std::scoped_lock lock{mutex}; |
| 42 | ControllerData& controller = controller_list.at(identifier); | 41 | ControllerData& controller = controller_list.at(identifier); |
| 43 | if (!configuring) { | 42 | if (!configuring) { |
| 44 | controller.buttons.insert_or_assign(button, value); | 43 | controller.buttons.insert_or_assign(button, value); |
| @@ -49,7 +48,7 @@ void InputEngine::SetButton(const PadIdentifier& identifier, int button, bool va | |||
| 49 | 48 | ||
| 50 | void InputEngine::SetHatButton(const PadIdentifier& identifier, int button, u8 value) { | 49 | void InputEngine::SetHatButton(const PadIdentifier& identifier, int button, u8 value) { |
| 51 | { | 50 | { |
| 52 | std::lock_guard lock{mutex}; | 51 | std::scoped_lock lock{mutex}; |
| 53 | ControllerData& controller = controller_list.at(identifier); | 52 | ControllerData& controller = controller_list.at(identifier); |
| 54 | if (!configuring) { | 53 | if (!configuring) { |
| 55 | controller.hat_buttons.insert_or_assign(button, value); | 54 | controller.hat_buttons.insert_or_assign(button, value); |
| @@ -60,7 +59,7 @@ void InputEngine::SetHatButton(const PadIdentifier& identifier, int button, u8 v | |||
| 60 | 59 | ||
| 61 | void InputEngine::SetAxis(const PadIdentifier& identifier, int axis, f32 value) { | 60 | void InputEngine::SetAxis(const PadIdentifier& identifier, int axis, f32 value) { |
| 62 | { | 61 | { |
| 63 | std::lock_guard lock{mutex}; | 62 | std::scoped_lock lock{mutex}; |
| 64 | ControllerData& controller = controller_list.at(identifier); | 63 | ControllerData& controller = controller_list.at(identifier); |
| 65 | if (!configuring) { | 64 | if (!configuring) { |
| 66 | controller.axes.insert_or_assign(axis, value); | 65 | controller.axes.insert_or_assign(axis, value); |
| @@ -71,7 +70,7 @@ void InputEngine::SetAxis(const PadIdentifier& identifier, int axis, f32 value) | |||
| 71 | 70 | ||
| 72 | void InputEngine::SetBattery(const PadIdentifier& identifier, Common::Input::BatteryLevel value) { | 71 | void InputEngine::SetBattery(const PadIdentifier& identifier, Common::Input::BatteryLevel value) { |
| 73 | { | 72 | { |
| 74 | std::lock_guard lock{mutex}; | 73 | std::scoped_lock lock{mutex}; |
| 75 | ControllerData& controller = controller_list.at(identifier); | 74 | ControllerData& controller = controller_list.at(identifier); |
| 76 | if (!configuring) { | 75 | if (!configuring) { |
| 77 | controller.battery = value; | 76 | controller.battery = value; |
| @@ -82,7 +81,7 @@ void InputEngine::SetBattery(const PadIdentifier& identifier, Common::Input::Bat | |||
| 82 | 81 | ||
| 83 | void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const BasicMotion& value) { | 82 | void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const BasicMotion& value) { |
| 84 | { | 83 | { |
| 85 | std::lock_guard lock{mutex}; | 84 | std::scoped_lock lock{mutex}; |
| 86 | ControllerData& controller = controller_list.at(identifier); | 85 | ControllerData& controller = controller_list.at(identifier); |
| 87 | if (!configuring) { | 86 | if (!configuring) { |
| 88 | controller.motions.insert_or_assign(motion, value); | 87 | controller.motions.insert_or_assign(motion, value); |
| @@ -92,7 +91,7 @@ void InputEngine::SetMotion(const PadIdentifier& identifier, int motion, const B | |||
| 92 | } | 91 | } |
| 93 | 92 | ||
| 94 | bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const { | 93 | bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const { |
| 95 | std::lock_guard lock{mutex}; | 94 | std::scoped_lock lock{mutex}; |
| 96 | const auto controller_iter = controller_list.find(identifier); | 95 | const auto controller_iter = controller_list.find(identifier); |
| 97 | if (controller_iter == controller_list.cend()) { | 96 | if (controller_iter == controller_list.cend()) { |
| 98 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), | 97 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), |
| @@ -109,7 +108,7 @@ bool InputEngine::GetButton(const PadIdentifier& identifier, int button) const { | |||
| 109 | } | 108 | } |
| 110 | 109 | ||
| 111 | bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const { | 110 | bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 direction) const { |
| 112 | std::lock_guard lock{mutex}; | 111 | std::scoped_lock lock{mutex}; |
| 113 | const auto controller_iter = controller_list.find(identifier); | 112 | const auto controller_iter = controller_list.find(identifier); |
| 114 | if (controller_iter == controller_list.cend()) { | 113 | if (controller_iter == controller_list.cend()) { |
| 115 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), | 114 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), |
| @@ -126,7 +125,7 @@ bool InputEngine::GetHatButton(const PadIdentifier& identifier, int button, u8 d | |||
| 126 | } | 125 | } |
| 127 | 126 | ||
| 128 | f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const { | 127 | f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const { |
| 129 | std::lock_guard lock{mutex}; | 128 | std::scoped_lock lock{mutex}; |
| 130 | const auto controller_iter = controller_list.find(identifier); | 129 | const auto controller_iter = controller_list.find(identifier); |
| 131 | if (controller_iter == controller_list.cend()) { | 130 | if (controller_iter == controller_list.cend()) { |
| 132 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), | 131 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), |
| @@ -143,7 +142,7 @@ f32 InputEngine::GetAxis(const PadIdentifier& identifier, int axis) const { | |||
| 143 | } | 142 | } |
| 144 | 143 | ||
| 145 | Common::Input::BatteryLevel InputEngine::GetBattery(const PadIdentifier& identifier) const { | 144 | Common::Input::BatteryLevel InputEngine::GetBattery(const PadIdentifier& identifier) const { |
| 146 | std::lock_guard lock{mutex}; | 145 | std::scoped_lock lock{mutex}; |
| 147 | const auto controller_iter = controller_list.find(identifier); | 146 | const auto controller_iter = controller_list.find(identifier); |
| 148 | if (controller_iter == controller_list.cend()) { | 147 | if (controller_iter == controller_list.cend()) { |
| 149 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), | 148 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), |
| @@ -155,7 +154,7 @@ Common::Input::BatteryLevel InputEngine::GetBattery(const PadIdentifier& identif | |||
| 155 | } | 154 | } |
| 156 | 155 | ||
| 157 | BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const { | 156 | BasicMotion InputEngine::GetMotion(const PadIdentifier& identifier, int motion) const { |
| 158 | std::lock_guard lock{mutex}; | 157 | std::scoped_lock lock{mutex}; |
| 159 | const auto controller_iter = controller_list.find(identifier); | 158 | const auto controller_iter = controller_list.find(identifier); |
| 160 | if (controller_iter == controller_list.cend()) { | 159 | if (controller_iter == controller_list.cend()) { |
| 161 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), | 160 | LOG_ERROR(Input, "Invalid identifier guid={}, pad={}, port={}", identifier.guid.RawString(), |
| @@ -186,7 +185,7 @@ void InputEngine::ResetAnalogState() { | |||
| 186 | } | 185 | } |
| 187 | 186 | ||
| 188 | void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int button, bool value) { | 187 | void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int button, bool value) { |
| 189 | std::lock_guard lock{mutex_callback}; | 188 | std::scoped_lock lock{mutex_callback}; |
| 190 | for (const auto& poller_pair : callback_list) { | 189 | for (const auto& poller_pair : callback_list) { |
| 191 | const InputIdentifier& poller = poller_pair.second; | 190 | const InputIdentifier& poller = poller_pair.second; |
| 192 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Button, button)) { | 191 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Button, button)) { |
| @@ -214,7 +213,7 @@ void InputEngine::TriggerOnButtonChange(const PadIdentifier& identifier, int but | |||
| 214 | } | 213 | } |
| 215 | 214 | ||
| 216 | void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int button, u8 value) { | 215 | void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int button, u8 value) { |
| 217 | std::lock_guard lock{mutex_callback}; | 216 | std::scoped_lock lock{mutex_callback}; |
| 218 | for (const auto& poller_pair : callback_list) { | 217 | for (const auto& poller_pair : callback_list) { |
| 219 | const InputIdentifier& poller = poller_pair.second; | 218 | const InputIdentifier& poller = poller_pair.second; |
| 220 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::HatButton, button)) { | 219 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::HatButton, button)) { |
| @@ -243,7 +242,7 @@ void InputEngine::TriggerOnHatButtonChange(const PadIdentifier& identifier, int | |||
| 243 | } | 242 | } |
| 244 | 243 | ||
| 245 | void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis, f32 value) { | 244 | void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis, f32 value) { |
| 246 | std::lock_guard lock{mutex_callback}; | 245 | std::scoped_lock lock{mutex_callback}; |
| 247 | for (const auto& poller_pair : callback_list) { | 246 | for (const auto& poller_pair : callback_list) { |
| 248 | const InputIdentifier& poller = poller_pair.second; | 247 | const InputIdentifier& poller = poller_pair.second; |
| 249 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Analog, axis)) { | 248 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Analog, axis)) { |
| @@ -270,7 +269,7 @@ void InputEngine::TriggerOnAxisChange(const PadIdentifier& identifier, int axis, | |||
| 270 | 269 | ||
| 271 | void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier, | 270 | void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier, |
| 272 | [[maybe_unused]] Common::Input::BatteryLevel value) { | 271 | [[maybe_unused]] Common::Input::BatteryLevel value) { |
| 273 | std::lock_guard lock{mutex_callback}; | 272 | std::scoped_lock lock{mutex_callback}; |
| 274 | for (const auto& poller_pair : callback_list) { | 273 | for (const auto& poller_pair : callback_list) { |
| 275 | const InputIdentifier& poller = poller_pair.second; | 274 | const InputIdentifier& poller = poller_pair.second; |
| 276 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Battery, 0)) { | 275 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Battery, 0)) { |
| @@ -284,7 +283,7 @@ void InputEngine::TriggerOnBatteryChange(const PadIdentifier& identifier, | |||
| 284 | 283 | ||
| 285 | void InputEngine::TriggerOnMotionChange(const PadIdentifier& identifier, int motion, | 284 | void InputEngine::TriggerOnMotionChange(const PadIdentifier& identifier, int motion, |
| 286 | const BasicMotion& value) { | 285 | const BasicMotion& value) { |
| 287 | std::lock_guard lock{mutex_callback}; | 286 | std::scoped_lock lock{mutex_callback}; |
| 288 | for (const auto& poller_pair : callback_list) { | 287 | for (const auto& poller_pair : callback_list) { |
| 289 | const InputIdentifier& poller = poller_pair.second; | 288 | const InputIdentifier& poller = poller_pair.second; |
| 290 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Motion, motion)) { | 289 | if (!IsInputIdentifierEqual(poller, identifier, EngineInputType::Motion, motion)) { |
| @@ -346,18 +345,18 @@ const std::string& InputEngine::GetEngineName() const { | |||
| 346 | } | 345 | } |
| 347 | 346 | ||
| 348 | int InputEngine::SetCallback(InputIdentifier input_identifier) { | 347 | int InputEngine::SetCallback(InputIdentifier input_identifier) { |
| 349 | std::lock_guard lock{mutex_callback}; | 348 | std::scoped_lock lock{mutex_callback}; |
| 350 | callback_list.insert_or_assign(last_callback_key, std::move(input_identifier)); | 349 | callback_list.insert_or_assign(last_callback_key, std::move(input_identifier)); |
| 351 | return last_callback_key++; | 350 | return last_callback_key++; |
| 352 | } | 351 | } |
| 353 | 352 | ||
| 354 | void InputEngine::SetMappingCallback(MappingCallback callback) { | 353 | void InputEngine::SetMappingCallback(MappingCallback callback) { |
| 355 | std::lock_guard lock{mutex_callback}; | 354 | std::scoped_lock lock{mutex_callback}; |
| 356 | mapping_callback = std::move(callback); | 355 | mapping_callback = std::move(callback); |
| 357 | } | 356 | } |
| 358 | 357 | ||
| 359 | void InputEngine::DeleteCallback(int key) { | 358 | void InputEngine::DeleteCallback(int key) { |
| 360 | std::lock_guard lock{mutex_callback}; | 359 | std::scoped_lock lock{mutex_callback}; |
| 361 | const auto& iterator = callback_list.find(key); | 360 | const auto& iterator = callback_list.find(key); |
| 362 | if (iterator == callback_list.end()) { | 361 | if (iterator == callback_list.end()) { |
| 363 | LOG_ERROR(Input, "Tried to delete non-existent callback {}", key); | 362 | LOG_ERROR(Input, "Tried to delete non-existent callback {}", key); |