summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/hid/active_vibration_device_list.cpp
diff options
context:
space:
mode:
authorliamwhite <liamwhite@users.noreply.github.com>2024-02-27 18:26:26 +0100
committerGitHub <noreply@github.com>2024-02-27 18:26:26 +0100
commitdc94882c9062ab88d3d5de35dcb8731111baaea2 (patch)
treeb00be6f4a4b2c826f116e212e15f4498e4b50504 /src/core/hle/service/hid/active_vibration_device_list.cpp
parentMerge pull request #13175 from liamwhite/asan (diff)
parentservice: hid: Migrate HidServer to new IPC (diff)
downloadyuzu-dc94882c9062ab88d3d5de35dcb8731111baaea2.tar
yuzu-dc94882c9062ab88d3d5de35dcb8731111baaea2.tar.gz
yuzu-dc94882c9062ab88d3d5de35dcb8731111baaea2.tar.bz2
yuzu-dc94882c9062ab88d3d5de35dcb8731111baaea2.tar.lz
yuzu-dc94882c9062ab88d3d5de35dcb8731111baaea2.tar.xz
yuzu-dc94882c9062ab88d3d5de35dcb8731111baaea2.tar.zst
yuzu-dc94882c9062ab88d3d5de35dcb8731111baaea2.zip
Diffstat (limited to 'src/core/hle/service/hid/active_vibration_device_list.cpp')
-rw-r--r--src/core/hle/service/hid/active_vibration_device_list.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/core/hle/service/hid/active_vibration_device_list.cpp b/src/core/hle/service/hid/active_vibration_device_list.cpp
new file mode 100644
index 000000000..c440f8382
--- /dev/null
+++ b/src/core/hle/service/hid/active_vibration_device_list.cpp
@@ -0,0 +1,53 @@
+// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "common/logging/log.h"
+#include "core/hle/service/cmif_serialization.h"
+#include "core/hle/service/hid/active_vibration_device_list.h"
+#include "hid_core/hid_result.h"
+#include "hid_core/hid_util.h"
+#include "hid_core/resource_manager.h"
+#include "hid_core/resources/vibration/vibration_device.h"
+
+namespace Service::HID {
+
+IActiveVibrationDeviceList::IActiveVibrationDeviceList(Core::System& system_,
+ std::shared_ptr<ResourceManager> resource)
+ : ServiceFramework{system_, "IActiveVibrationDeviceList"}, resource_manager(resource) {
+ // clang-format off
+ static const FunctionInfo functions[] = {
+ {0, C<&IActiveVibrationDeviceList::ActivateVibrationDevice>, "ActivateVibrationDevice"},
+ };
+ // clang-format on
+
+ RegisterHandlers(functions);
+}
+
+IActiveVibrationDeviceList::~IActiveVibrationDeviceList() = default;
+
+Result IActiveVibrationDeviceList::ActivateVibrationDevice(
+ Core::HID::VibrationDeviceHandle vibration_device_handle) {
+ LOG_DEBUG(Service_HID, "called, npad_type={}, npad_id={}, device_index={}",
+ vibration_device_handle.npad_type, vibration_device_handle.npad_id,
+ vibration_device_handle.device_index);
+
+ std::scoped_lock lock{mutex};
+
+ R_TRY(IsVibrationHandleValid(vibration_device_handle));
+
+ for (std::size_t i = 0; i < list_size; i++) {
+ if (vibration_device_handle.device_index == vibration_device_list[i].device_index &&
+ vibration_device_handle.npad_id == vibration_device_list[i].npad_id &&
+ vibration_device_handle.npad_type == vibration_device_list[i].npad_type) {
+ R_SUCCEED();
+ }
+ }
+
+ R_UNLESS(list_size < MaxVibrationDevicesHandles, ResultVibrationDeviceIndexOutOfRange);
+ R_TRY(resource_manager->GetVibrationDevice(vibration_device_handle)->Activate());
+
+ vibration_device_list[list_size++] = vibration_device_handle;
+ R_SUCCEED();
+}
+
+} // namespace Service::HID