107 lines
2.9 KiB
C++
107 lines
2.9 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#include "hid_core/hid_result.h"
|
|
#include "hid_core/resources/npad/npad_types.h"
|
|
#include "hid_core/resources/npad/npad_vibration.h"
|
|
#include "hid_core/resources/vibration/gc_vibration_device.h"
|
|
|
|
namespace Service::HID {
|
|
|
|
NpadGcVibrationDevice::NpadGcVibrationDevice() {}
|
|
|
|
Result NpadGcVibrationDevice::IncrementRefCounter() {
|
|
if (ref_counter == 0 && is_mounted) {
|
|
f32 volume = 1.0f;
|
|
const auto result = vibration_handler->GetVibrationVolume(volume);
|
|
if (result.IsSuccess()) {
|
|
// TODO: SendVibrationGcErmCommand
|
|
}
|
|
}
|
|
ref_counter++;
|
|
return ResultSuccess;
|
|
}
|
|
|
|
Result NpadGcVibrationDevice::DecrementRefCounter() {
|
|
if (ref_counter == 1 && !is_mounted) {
|
|
f32 volume = 1.0f;
|
|
const auto result = vibration_handler->GetVibrationVolume(volume);
|
|
if (result.IsSuccess()) {
|
|
// TODO: SendVibrationGcErmCommand
|
|
}
|
|
}
|
|
|
|
if (ref_counter > 0) {
|
|
ref_counter--;
|
|
}
|
|
|
|
return ResultSuccess;
|
|
}
|
|
|
|
Result NpadGcVibrationDevice::SendVibrationGcErmCommand(Core::HID::VibrationGcErmCommand command) {
|
|
if (!is_mounted) {
|
|
return ResultSuccess;
|
|
}
|
|
f32 volume = 1.0f;
|
|
const auto result = vibration_handler->GetVibrationVolume(volume);
|
|
if (result.IsError()) {
|
|
return result;
|
|
}
|
|
if (volume == 0.0) {
|
|
command = Core::HID::VibrationGcErmCommand::Stop;
|
|
} else {
|
|
if (command > Core::HID::VibrationGcErmCommand::StopHard) {
|
|
// Abort
|
|
return ResultSuccess;
|
|
}
|
|
}
|
|
// TODO: SendVibrationGcErmCommand
|
|
return ResultSuccess;
|
|
}
|
|
|
|
Result NpadGcVibrationDevice::GetActualVibrationGcErmCommand(
|
|
Core::HID::VibrationGcErmCommand& out_command) {
|
|
if (!is_mounted) {
|
|
out_command = Core::HID::VibrationGcErmCommand::Stop;
|
|
return ResultSuccess;
|
|
}
|
|
|
|
f32 volume = 1.0f;
|
|
const auto result = vibration_handler->GetVibrationVolume(volume);
|
|
if (result.IsError()) {
|
|
return result;
|
|
}
|
|
if (volume == 0.0f) {
|
|
out_command = Core::HID::VibrationGcErmCommand::Stop;
|
|
return ResultSuccess;
|
|
}
|
|
|
|
// TODO: GetActualVibrationGcErmCommand
|
|
return ResultSuccess;
|
|
}
|
|
|
|
Result NpadGcVibrationDevice::SendVibrationNotificationPattern(
|
|
Core::HID::VibrationGcErmCommand command) {
|
|
if (!is_mounted) {
|
|
return ResultSuccess;
|
|
}
|
|
|
|
f32 volume = 1.0f;
|
|
const auto result = vibration_handler->GetVibrationVolume(volume);
|
|
if (result.IsError()) {
|
|
return result;
|
|
}
|
|
if (volume <= 0.0f) {
|
|
command = Core::HID::VibrationGcErmCommand::Stop;
|
|
}
|
|
if (command > Core::HID::VibrationGcErmCommand::StopHard) {
|
|
// Abort
|
|
return ResultSuccess;
|
|
}
|
|
|
|
// TODO: SendVibrationNotificationPattern
|
|
return ResultSuccess;
|
|
}
|
|
|
|
} // namespace Service::HID
|