diff options
| author | 2022-07-24 13:31:28 -0400 | |
|---|---|---|
| committer | 2022-07-24 13:31:28 -0400 | |
| commit | 5af06d14337a61d9ed1093079d13f68cbb1f5451 (patch) | |
| tree | 88df3fada076b04c2ab2da8972d1d785f492b520 /src/core/hid/emulated_controller.cpp | |
| parent | Merge pull request #8545 from Kelebek1/Audio (diff) | |
| parent | yuzu: Add webcam support and rebase to latest master (diff) | |
| download | yuzu-5af06d14337a61d9ed1093079d13f68cbb1f5451.tar.gz yuzu-5af06d14337a61d9ed1093079d13f68cbb1f5451.tar.xz yuzu-5af06d14337a61d9ed1093079d13f68cbb1f5451.zip | |
Merge pull request #8484 from german77/irs_release
service: irs: Add camera support, split processors and implement ImageTransferProcessor
Diffstat (limited to 'src/core/hid/emulated_controller.cpp')
| -rw-r--r-- | src/core/hid/emulated_controller.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp index bd2384515..8c3895937 100644 --- a/src/core/hid/emulated_controller.cpp +++ b/src/core/hid/emulated_controller.cpp | |||
| @@ -126,10 +126,14 @@ void EmulatedController::LoadDevices() { | |||
| 126 | battery_params[LeftIndex].Set("battery", true); | 126 | battery_params[LeftIndex].Set("battery", true); |
| 127 | battery_params[RightIndex].Set("battery", true); | 127 | battery_params[RightIndex].Set("battery", true); |
| 128 | 128 | ||
| 129 | camera_params = Common::ParamPackage{"engine:camera,camera:1"}; | ||
| 130 | |||
| 129 | output_params[LeftIndex] = left_joycon; | 131 | output_params[LeftIndex] = left_joycon; |
| 130 | output_params[RightIndex] = right_joycon; | 132 | output_params[RightIndex] = right_joycon; |
| 133 | output_params[2] = camera_params; | ||
| 131 | output_params[LeftIndex].Set("output", true); | 134 | output_params[LeftIndex].Set("output", true); |
| 132 | output_params[RightIndex].Set("output", true); | 135 | output_params[RightIndex].Set("output", true); |
| 136 | output_params[2].Set("output", true); | ||
| 133 | 137 | ||
| 134 | LoadTASParams(); | 138 | LoadTASParams(); |
| 135 | 139 | ||
| @@ -146,6 +150,7 @@ void EmulatedController::LoadDevices() { | |||
| 146 | Common::Input::CreateDevice<Common::Input::InputDevice>); | 150 | Common::Input::CreateDevice<Common::Input::InputDevice>); |
| 147 | std::transform(battery_params.begin(), battery_params.end(), battery_devices.begin(), | 151 | std::transform(battery_params.begin(), battery_params.end(), battery_devices.begin(), |
| 148 | Common::Input::CreateDevice<Common::Input::InputDevice>); | 152 | Common::Input::CreateDevice<Common::Input::InputDevice>); |
| 153 | camera_devices = Common::Input::CreateDevice<Common::Input::InputDevice>(camera_params); | ||
| 149 | std::transform(output_params.begin(), output_params.end(), output_devices.begin(), | 154 | std::transform(output_params.begin(), output_params.end(), output_devices.begin(), |
| 150 | Common::Input::CreateDevice<Common::Input::OutputDevice>); | 155 | Common::Input::CreateDevice<Common::Input::OutputDevice>); |
| 151 | 156 | ||
| @@ -267,6 +272,14 @@ void EmulatedController::ReloadInput() { | |||
| 267 | motion_devices[index]->ForceUpdate(); | 272 | motion_devices[index]->ForceUpdate(); |
| 268 | } | 273 | } |
| 269 | 274 | ||
| 275 | if (camera_devices) { | ||
| 276 | camera_devices->SetCallback({ | ||
| 277 | .on_change = | ||
| 278 | [this](const Common::Input::CallbackStatus& callback) { SetCamera(callback); }, | ||
| 279 | }); | ||
| 280 | camera_devices->ForceUpdate(); | ||
| 281 | } | ||
| 282 | |||
| 270 | // Use a common UUID for TAS | 283 | // Use a common UUID for TAS |
| 271 | static constexpr Common::UUID TAS_UUID = Common::UUID{ | 284 | static constexpr Common::UUID TAS_UUID = Common::UUID{ |
| 272 | {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xA5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; | 285 | {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xA5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}}; |
| @@ -851,6 +864,25 @@ void EmulatedController::SetBattery(const Common::Input::CallbackStatus& callbac | |||
| 851 | TriggerOnChange(ControllerTriggerType::Battery, true); | 864 | TriggerOnChange(ControllerTriggerType::Battery, true); |
| 852 | } | 865 | } |
| 853 | 866 | ||
| 867 | void EmulatedController::SetCamera(const Common::Input::CallbackStatus& callback) { | ||
| 868 | std::unique_lock lock{mutex}; | ||
| 869 | controller.camera_values = TransformToCamera(callback); | ||
| 870 | |||
| 871 | if (is_configuring) { | ||
| 872 | lock.unlock(); | ||
| 873 | TriggerOnChange(ControllerTriggerType::IrSensor, false); | ||
| 874 | return; | ||
| 875 | } | ||
| 876 | |||
| 877 | controller.camera_state.sample++; | ||
| 878 | controller.camera_state.format = | ||
| 879 | static_cast<Core::IrSensor::ImageTransferProcessorFormat>(controller.camera_values.format); | ||
| 880 | controller.camera_state.data = controller.camera_values.data; | ||
| 881 | |||
| 882 | lock.unlock(); | ||
| 883 | TriggerOnChange(ControllerTriggerType::IrSensor, true); | ||
| 884 | } | ||
| 885 | |||
| 854 | bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { | 886 | bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { |
| 855 | if (device_index >= output_devices.size()) { | 887 | if (device_index >= output_devices.size()) { |
| 856 | return false; | 888 | return false; |
| @@ -928,6 +960,23 @@ bool EmulatedController::SetPollingMode(Common::Input::PollingMode polling_mode) | |||
| 928 | return output_device->SetPollingMode(polling_mode) == Common::Input::PollingError::None; | 960 | return output_device->SetPollingMode(polling_mode) == Common::Input::PollingError::None; |
| 929 | } | 961 | } |
| 930 | 962 | ||
| 963 | bool EmulatedController::SetCameraFormat( | ||
| 964 | Core::IrSensor::ImageTransferProcessorFormat camera_format) { | ||
| 965 | LOG_INFO(Service_HID, "Set camera format {}", camera_format); | ||
| 966 | |||
| 967 | auto& right_output_device = output_devices[static_cast<std::size_t>(DeviceIndex::Right)]; | ||
| 968 | auto& camera_output_device = output_devices[2]; | ||
| 969 | |||
| 970 | if (right_output_device->SetCameraFormat(static_cast<Common::Input::CameraFormat>( | ||
| 971 | camera_format)) == Common::Input::CameraError::None) { | ||
| 972 | return true; | ||
| 973 | } | ||
| 974 | |||
| 975 | // Fallback to Qt camera if native device doesn't have support | ||
| 976 | return camera_output_device->SetCameraFormat(static_cast<Common::Input::CameraFormat>( | ||
| 977 | camera_format)) == Common::Input::CameraError::None; | ||
| 978 | } | ||
| 979 | |||
| 931 | void EmulatedController::SetLedPattern() { | 980 | void EmulatedController::SetLedPattern() { |
| 932 | for (auto& device : output_devices) { | 981 | for (auto& device : output_devices) { |
| 933 | if (!device) { | 982 | if (!device) { |
| @@ -1163,6 +1212,11 @@ BatteryValues EmulatedController::GetBatteryValues() const { | |||
| 1163 | return controller.battery_values; | 1212 | return controller.battery_values; |
| 1164 | } | 1213 | } |
| 1165 | 1214 | ||
| 1215 | CameraValues EmulatedController::GetCameraValues() const { | ||
| 1216 | std::scoped_lock lock{mutex}; | ||
| 1217 | return controller.camera_values; | ||
| 1218 | } | ||
| 1219 | |||
| 1166 | HomeButtonState EmulatedController::GetHomeButtons() const { | 1220 | HomeButtonState EmulatedController::GetHomeButtons() const { |
| 1167 | std::scoped_lock lock{mutex}; | 1221 | std::scoped_lock lock{mutex}; |
| 1168 | if (is_configuring) { | 1222 | if (is_configuring) { |
| @@ -1251,6 +1305,11 @@ BatteryLevelState EmulatedController::GetBattery() const { | |||
| 1251 | return controller.battery_state; | 1305 | return controller.battery_state; |
| 1252 | } | 1306 | } |
| 1253 | 1307 | ||
| 1308 | const CameraState& EmulatedController::GetCamera() const { | ||
| 1309 | std::scoped_lock lock{mutex}; | ||
| 1310 | return controller.camera_state; | ||
| 1311 | } | ||
| 1312 | |||
| 1254 | void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_npad_service_update) { | 1313 | void EmulatedController::TriggerOnChange(ControllerTriggerType type, bool is_npad_service_update) { |
| 1255 | std::scoped_lock lock{callback_mutex}; | 1314 | std::scoped_lock lock{callback_mutex}; |
| 1256 | for (const auto& poller_pair : callback_list) { | 1315 | for (const auto& poller_pair : callback_list) { |