summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/frontend/applets/controller.cpp51
-rw-r--r--src/core/frontend/applets/controller.h8
-rw-r--r--src/core/hid/emulated_console.cpp2
-rw-r--r--src/core/hid/emulated_controller.cpp12
-rw-r--r--src/core/hid/emulated_controller.h1
-rw-r--r--src/core/hid/hid_core.cpp4
-rw-r--r--src/core/hid/hid_core.h3
-rw-r--r--src/core/hle/service/am/applets/applets.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/npad.cpp10
-rw-r--r--src/core/hle/service/hid/controllers/npad.h2
-rw-r--r--src/core/hle/service/hid/hid.cpp3
-rw-r--r--src/input_common/drivers/udp_client.cpp2
-rw-r--r--src/input_common/drivers/udp_client.h4
-rw-r--r--src/input_common/helpers/stick_from_buttons.h1
-rw-r--r--src/input_common/main.cpp7
15 files changed, 56 insertions, 56 deletions
diff --git a/src/core/frontend/applets/controller.cpp b/src/core/frontend/applets/controller.cpp
index ca1edce15..30500ef1e 100644
--- a/src/core/frontend/applets/controller.cpp
+++ b/src/core/frontend/applets/controller.cpp
@@ -5,16 +5,16 @@
5#include "common/assert.h" 5#include "common/assert.h"
6#include "common/logging/log.h" 6#include "common/logging/log.h"
7#include "core/frontend/applets/controller.h" 7#include "core/frontend/applets/controller.h"
8#include "core/hle/service/hid/controllers/npad.h" 8#include "core/hid/emulated_controller.h"
9#include "core/hle/service/hid/hid.h" 9#include "core/hid/hid_core.h"
10#include "core/hle/service/sm/sm.h" 10#include "core/hid/hid_types.h"
11 11
12namespace Core::Frontend { 12namespace Core::Frontend {
13 13
14ControllerApplet::~ControllerApplet() = default; 14ControllerApplet::~ControllerApplet() = default;
15 15
16DefaultControllerApplet::DefaultControllerApplet(Service::SM::ServiceManager& service_manager_) 16DefaultControllerApplet::DefaultControllerApplet(HID::HIDCore& hid_core_)
17 : service_manager{service_manager_} {} 17 : hid_core{hid_core_} {}
18 18
19DefaultControllerApplet::~DefaultControllerApplet() = default; 19DefaultControllerApplet::~DefaultControllerApplet() = default;
20 20
@@ -22,24 +22,20 @@ void DefaultControllerApplet::ReconfigureControllers(std::function<void()> callb
22 const ControllerParameters& parameters) const { 22 const ControllerParameters& parameters) const {
23 LOG_INFO(Service_HID, "called, deducing the best configuration based on the given parameters!"); 23 LOG_INFO(Service_HID, "called, deducing the best configuration based on the given parameters!");
24 24
25 auto& npad =
26 service_manager.GetService<Service::HID::Hid>("hid")
27 ->GetAppletResource()
28 ->GetController<Service::HID::Controller_NPad>(Service::HID::HidController::NPad);
29
30 auto& players = Settings::values.players.GetValue();
31
32 const std::size_t min_supported_players = 25 const std::size_t min_supported_players =
33 parameters.enable_single_mode ? 1 : parameters.min_players; 26 parameters.enable_single_mode ? 1 : parameters.min_players;
34 27
35 // Disconnect Handheld first. 28 // Disconnect Handheld first.
36 npad.DisconnectNpadAtIndex(8); 29 auto* handheld =hid_core.GetEmulatedController(Core::HID::NpadIdType::Handheld);
30 handheld->Disconnect();
37 31
38 // Deduce the best configuration based on the input parameters. 32 // Deduce the best configuration based on the input parameters.
39 for (std::size_t index = 0; index < players.size() - 2; ++index) { 33 for (std::size_t index = 0; index < hid_core.available_controllers - 2; ++index) {
34 auto* controller = hid_core.GetEmulatedControllerByIndex(index);
35
40 // First, disconnect all controllers regardless of the value of keep_controllers_connected. 36 // First, disconnect all controllers regardless of the value of keep_controllers_connected.
41 // This makes it easy to connect the desired controllers. 37 // This makes it easy to connect the desired controllers.
42 npad.DisconnectNpadAtIndex(index); 38 controller->Disconnect();
43 39
44 // Only connect the minimum number of required players. 40 // Only connect the minimum number of required players.
45 if (index >= min_supported_players) { 41 if (index >= min_supported_players) {
@@ -49,32 +45,27 @@ void DefaultControllerApplet::ReconfigureControllers(std::function<void()> callb
49 // Connect controllers based on the following priority list from highest to lowest priority: 45 // Connect controllers based on the following priority list from highest to lowest priority:
50 // Pro Controller -> Dual Joycons -> Left Joycon/Right Joycon -> Handheld 46 // Pro Controller -> Dual Joycons -> Left Joycon/Right Joycon -> Handheld
51 if (parameters.allow_pro_controller) { 47 if (parameters.allow_pro_controller) {
52 npad.AddNewControllerAt(Core::HID::EmulatedController::MapSettingsTypeToNPad( 48 controller->SetNpadType(Core::HID::NpadType::ProController);
53 Settings::ControllerType::ProController), 49 controller->Connect();
54 index);
55 } else if (parameters.allow_dual_joycons) { 50 } else if (parameters.allow_dual_joycons) {
56 npad.AddNewControllerAt(Core::HID::EmulatedController::MapSettingsTypeToNPad( 51 controller->SetNpadType(Core::HID::NpadType::JoyconDual);
57 Settings::ControllerType::DualJoyconDetached), 52 controller->Connect();
58 index);
59 } else if (parameters.allow_left_joycon && parameters.allow_right_joycon) { 53 } else if (parameters.allow_left_joycon && parameters.allow_right_joycon) {
60 // Assign left joycons to even player indices and right joycons to odd player indices. 54 // Assign left joycons to even player indices and right joycons to odd player indices.
61 // We do this since Captain Toad Treasure Tracker expects a left joycon for Player 1 and 55 // We do this since Captain Toad Treasure Tracker expects a left joycon for Player 1 and
62 // a right Joycon for Player 2 in 2 Player Assist mode. 56 // a right Joycon for Player 2 in 2 Player Assist mode.
63 if (index % 2 == 0) { 57 if (index % 2 == 0) {
64 npad.AddNewControllerAt(Core::HID::EmulatedController::MapSettingsTypeToNPad( 58 controller->SetNpadType(Core::HID::NpadType::JoyconLeft);
65 Settings::ControllerType::LeftJoycon), 59 controller->Connect();
66 index);
67 } else { 60 } else {
68 npad.AddNewControllerAt(Core::HID::EmulatedController::MapSettingsTypeToNPad( 61 controller->SetNpadType(Core::HID::NpadType::JoyconRight);
69 Settings::ControllerType::RightJoycon), 62 controller->Connect();
70 index);
71 } 63 }
72 } else if (index == 0 && parameters.enable_single_mode && parameters.allow_handheld && 64 } else if (index == 0 && parameters.enable_single_mode && parameters.allow_handheld &&
73 !Settings::values.use_docked_mode.GetValue()) { 65 !Settings::values.use_docked_mode.GetValue()) {
74 // We should *never* reach here under any normal circumstances. 66 // We should *never* reach here under any normal circumstances.
75 npad.AddNewControllerAt(Core::HID::EmulatedController::MapSettingsTypeToNPad( 67 controller->SetNpadType(Core::HID::NpadType::Handheld);
76 Settings::ControllerType::Handheld), 68 controller->Connect();
77 index);
78 } else { 69 } else {
79 UNREACHABLE_MSG("Unable to add a new controller based on the given parameters!"); 70 UNREACHABLE_MSG("Unable to add a new controller based on the given parameters!");
80 } 71 }
diff --git a/src/core/frontend/applets/controller.h b/src/core/frontend/applets/controller.h
index b0626a0f9..014bc8901 100644
--- a/src/core/frontend/applets/controller.h
+++ b/src/core/frontend/applets/controller.h
@@ -8,8 +8,8 @@
8 8
9#include "common/common_types.h" 9#include "common/common_types.h"
10 10
11namespace Service::SM { 11namespace Core::HID {
12class ServiceManager; 12class HIDCore;
13} 13}
14 14
15namespace Core::Frontend { 15namespace Core::Frontend {
@@ -44,14 +44,14 @@ public:
44 44
45class DefaultControllerApplet final : public ControllerApplet { 45class DefaultControllerApplet final : public ControllerApplet {
46public: 46public:
47 explicit DefaultControllerApplet(Service::SM::ServiceManager& service_manager_); 47 explicit DefaultControllerApplet(HID::HIDCore& hid_core_);
48 ~DefaultControllerApplet() override; 48 ~DefaultControllerApplet() override;
49 49
50 void ReconfigureControllers(std::function<void()> callback, 50 void ReconfigureControllers(std::function<void()> callback,
51 const ControllerParameters& parameters) const override; 51 const ControllerParameters& parameters) const override;
52 52
53private: 53private:
54 Service::SM::ServiceManager& service_manager; 54 HID::HIDCore& hid_core;
55}; 55};
56 56
57} // namespace Core::Frontend 57} // namespace Core::Frontend
diff --git a/src/core/hid/emulated_console.cpp b/src/core/hid/emulated_console.cpp
index e82cf5990..540fd107b 100644
--- a/src/core/hid/emulated_console.cpp
+++ b/src/core/hid/emulated_console.cpp
@@ -2,8 +2,6 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included 3// Refer to the license.txt file included
4 4
5#include <fmt/format.h>
6
7#include "core/hid/emulated_console.h" 5#include "core/hid/emulated_console.h"
8#include "core/hid/input_converter.h" 6#include "core/hid/input_converter.h"
9 7
diff --git a/src/core/hid/emulated_controller.cpp b/src/core/hid/emulated_controller.cpp
index 1ff3022c5..d59758e99 100644
--- a/src/core/hid/emulated_controller.cpp
+++ b/src/core/hid/emulated_controller.cpp
@@ -2,8 +2,6 @@
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included 3// Refer to the license.txt file included
4 4
5#include <fmt/format.h>
6
7#include "core/hid/emulated_controller.h" 5#include "core/hid/emulated_controller.h"
8#include "core/hid/input_converter.h" 6#include "core/hid/input_converter.h"
9 7
@@ -635,6 +633,9 @@ void EmulatedController::SetBattery(Input::CallbackStatus callback, std::size_t
635} 633}
636 634
637bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) { 635bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue vibration) {
636 if (device_index >= output_devices.size()) {
637 return false;
638 }
638 if (!output_devices[device_index]) { 639 if (!output_devices[device_index]) {
639 return false; 640 return false;
640 } 641 }
@@ -659,6 +660,9 @@ bool EmulatedController::SetVibration(std::size_t device_index, VibrationValue v
659} 660}
660 661
661bool EmulatedController::TestVibration(std::size_t device_index) { 662bool EmulatedController::TestVibration(std::size_t device_index) {
663 if (device_index >= output_devices.size()) {
664 return false;
665 }
662 if (!output_devices[device_index]) { 666 if (!output_devices[device_index]) {
663 return false; 667 return false;
664 } 668 }
@@ -733,7 +737,9 @@ bool EmulatedController::IsConnected(bool temporary) const {
733} 737}
734 738
735bool EmulatedController::IsVibrationEnabled() const { 739bool EmulatedController::IsVibrationEnabled() const {
736 return is_vibration_enabled; 740 const auto player_index = NpadIdTypeToIndex(npad_id_type);
741 const auto& player = Settings::values.players.GetValue()[player_index];
742 return player.vibration_enabled;
737} 743}
738 744
739NpadIdType EmulatedController::GetNpadIdType() const { 745NpadIdType EmulatedController::GetNpadIdType() const {
diff --git a/src/core/hid/emulated_controller.h b/src/core/hid/emulated_controller.h
index f3ee70726..50f21ccd9 100644
--- a/src/core/hid/emulated_controller.h
+++ b/src/core/hid/emulated_controller.h
@@ -337,7 +337,6 @@ private:
337 bool is_connected{false}; 337 bool is_connected{false};
338 bool temporary_is_connected{false}; 338 bool temporary_is_connected{false};
339 bool is_configuring{false}; 339 bool is_configuring{false};
340 bool is_vibration_enabled{true};
341 f32 motion_sensitivity{0.01f}; 340 f32 motion_sensitivity{0.01f};
342 341
343 ButtonParams button_params; 342 ButtonParams button_params;
diff --git a/src/core/hid/hid_core.cpp b/src/core/hid/hid_core.cpp
index bd17081bd..cc1b3c295 100644
--- a/src/core/hid/hid_core.cpp
+++ b/src/core/hid/hid_core.cpp
@@ -113,7 +113,7 @@ NpadStyleTag HIDCore::GetSupportedStyleTag() const {
113 113
114s8 HIDCore::GetPlayerCount() const { 114s8 HIDCore::GetPlayerCount() const {
115 s8 active_players = 0; 115 s8 active_players = 0;
116 for (std::size_t player_index = 0; player_index < 8; player_index++) { 116 for (std::size_t player_index = 0; player_index < available_controllers -2; player_index++) {
117 const auto* controller = GetEmulatedControllerByIndex(player_index); 117 const auto* controller = GetEmulatedControllerByIndex(player_index);
118 if (controller->IsConnected()) { 118 if (controller->IsConnected()) {
119 active_players++; 119 active_players++;
@@ -123,7 +123,7 @@ s8 HIDCore::GetPlayerCount() const {
123} 123}
124 124
125NpadIdType HIDCore::GetFirstNpadId() const { 125NpadIdType HIDCore::GetFirstNpadId() const {
126 for (std::size_t player_index = 0; player_index < 10; player_index++) { 126 for (std::size_t player_index = 0; player_index < available_controllers; player_index++) {
127 const auto* controller = GetEmulatedControllerByIndex(player_index); 127 const auto* controller = GetEmulatedControllerByIndex(player_index);
128 if (controller->IsConnected()) { 128 if (controller->IsConnected()) {
129 return controller->GetNpadIdType(); 129 return controller->GetNpadIdType();
diff --git a/src/core/hid/hid_core.h b/src/core/hid/hid_core.h
index 196466a72..a4a66a3a4 100644
--- a/src/core/hid/hid_core.h
+++ b/src/core/hid/hid_core.h
@@ -47,6 +47,9 @@ public:
47 /// Removes all callbacks from input common 47 /// Removes all callbacks from input common
48 void UnloadInputDevices(); 48 void UnloadInputDevices();
49 49
50 /// Number of emulated controllers
51 const std::size_t available_controllers{10};
52
50private: 53private:
51 std::unique_ptr<EmulatedController> player_1; 54 std::unique_ptr<EmulatedController> player_1;
52 std::unique_ptr<EmulatedController> player_2; 55 std::unique_ptr<EmulatedController> player_2;
diff --git a/src/core/hle/service/am/applets/applets.cpp b/src/core/hle/service/am/applets/applets.cpp
index 7320b1c0f..134ac1ee2 100644
--- a/src/core/hle/service/am/applets/applets.cpp
+++ b/src/core/hle/service/am/applets/applets.cpp
@@ -231,7 +231,7 @@ void AppletManager::SetDefaultAppletFrontendSet() {
231void AppletManager::SetDefaultAppletsIfMissing() { 231void AppletManager::SetDefaultAppletsIfMissing() {
232 if (frontend.controller == nullptr) { 232 if (frontend.controller == nullptr) {
233 frontend.controller = 233 frontend.controller =
234 std::make_unique<Core::Frontend::DefaultControllerApplet>(system.ServiceManager()); 234 std::make_unique<Core::Frontend::DefaultControllerApplet>(system.HIDCore());
235 } 235 }
236 236
237 if (frontend.error == nullptr) { 237 if (frontend.error == nullptr) {
diff --git a/src/core/hle/service/hid/controllers/npad.cpp b/src/core/hle/service/hid/controllers/npad.cpp
index 6b9d6d11c..62b324080 100644
--- a/src/core/hle/service/hid/controllers/npad.cpp
+++ b/src/core/hle/service/hid/controllers/npad.cpp
@@ -608,15 +608,15 @@ void Controller_NPad::OnMotionUpdate(const Core::Timing::CoreTiming& core_timing
608 sixaxis_fullkey_state.sampling_number = 608 sixaxis_fullkey_state.sampling_number =
609 npad.sixaxis_fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1; 609 npad.sixaxis_fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1;
610 sixaxis_handheld_state.sampling_number = 610 sixaxis_handheld_state.sampling_number =
611 npad.sixaxis_fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1; 611 npad.sixaxis_handheld_lifo.ReadCurrentEntry().state.sampling_number + 1;
612 sixaxis_dual_left_state.sampling_number = 612 sixaxis_dual_left_state.sampling_number =
613 npad.sixaxis_fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1; 613 npad.sixaxis_dual_left_lifo.ReadCurrentEntry().state.sampling_number + 1;
614 sixaxis_dual_right_state.sampling_number = 614 sixaxis_dual_right_state.sampling_number =
615 npad.sixaxis_fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1; 615 npad.sixaxis_dual_right_lifo.ReadCurrentEntry().state.sampling_number + 1;
616 sixaxis_left_lifo_state.sampling_number = 616 sixaxis_left_lifo_state.sampling_number =
617 npad.sixaxis_fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1; 617 npad.sixaxis_left_lifo.ReadCurrentEntry().state.sampling_number + 1;
618 sixaxis_right_lifo_state.sampling_number = 618 sixaxis_right_lifo_state.sampling_number =
619 npad.sixaxis_fullkey_lifo.ReadCurrentEntry().state.sampling_number + 1; 619 npad.sixaxis_right_lifo.ReadCurrentEntry().state.sampling_number + 1;
620 620
621 npad.sixaxis_fullkey_lifo.WriteNextEntry(sixaxis_fullkey_state); 621 npad.sixaxis_fullkey_lifo.WriteNextEntry(sixaxis_fullkey_state);
622 npad.sixaxis_handheld_lifo.WriteNextEntry(sixaxis_handheld_state); 622 npad.sixaxis_handheld_lifo.WriteNextEntry(sixaxis_handheld_state);
diff --git a/src/core/hle/service/hid/controllers/npad.h b/src/core/hle/service/hid/controllers/npad.h
index d805ccb97..1c6ea6f88 100644
--- a/src/core/hle/service/hid/controllers/npad.h
+++ b/src/core/hle/service/hid/controllers/npad.h
@@ -342,7 +342,7 @@ private:
342 INSERT_PADDING_BYTES(0x4); 342 INSERT_PADDING_BYTES(0x4);
343 }; 343 };
344 344
345 // This is nn::hid::server::NpadGcTriggerState 345 // This is nn::hid::system::AppletFooterUiType
346 enum class AppletFooterUiType : u8 { 346 enum class AppletFooterUiType : u8 {
347 None = 0, 347 None = 0,
348 HandheldNone = 1, 348 HandheldNone = 1,
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 5391334f4..ac48f96d3 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -8,7 +8,6 @@
8#include "common/settings.h" 8#include "common/settings.h"
9#include "core/core.h" 9#include "core/core.h"
10#include "core/core_timing.h" 10#include "core/core_timing.h"
11#include "core/hardware_properties.h"
12#include "core/hle/ipc_helpers.h" 11#include "core/hle/ipc_helpers.h"
13#include "core/hle/kernel/k_readable_event.h" 12#include "core/hle/kernel/k_readable_event.h"
14#include "core/hle/kernel/k_shared_memory.h" 13#include "core/hle/kernel/k_shared_memory.h"
@@ -34,7 +33,7 @@
34namespace Service::HID { 33namespace Service::HID {
35 34
36// Updating period for each HID device. 35// Updating period for each HID device.
37// Period time is obtained by measuring the number of samples in a second 36// Period time is obtained by measuring the number of samples in a second on HW using a homebrew
38constexpr auto pad_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; // (4ms, 250Hz) 37constexpr auto pad_update_ns = std::chrono::nanoseconds{4 * 1000 * 1000}; // (4ms, 250Hz)
39constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz) 38constexpr auto motion_update_ns = std::chrono::nanoseconds{5 * 1000 * 1000}; // (5ms, 200Hz)
40constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000; 39constexpr std::size_t SHARED_MEMORY_SIZE = 0x40000;
diff --git a/src/input_common/drivers/udp_client.cpp b/src/input_common/drivers/udp_client.cpp
index f0c0a6b8b..192ab336b 100644
--- a/src/input_common/drivers/udp_client.cpp
+++ b/src/input_common/drivers/udp_client.cpp
@@ -268,6 +268,8 @@ void UDPClient::OnPadData(Response::PadData data, std::size_t client) {
268 SetButton(identifier, touch_id, true); 268 SetButton(identifier, touch_id, true);
269 continue; 269 continue;
270 } 270 }
271 SetAxis(identifier, touch_id * 2, 0);
272 SetAxis(identifier, touch_id * 2 + 1, 0);
271 SetButton(identifier, touch_id, false); 273 SetButton(identifier, touch_id, false);
272 } 274 }
273} 275}
diff --git a/src/input_common/drivers/udp_client.h b/src/input_common/drivers/udp_client.h
index 58b2e921d..639325b17 100644
--- a/src/input_common/drivers/udp_client.h
+++ b/src/input_common/drivers/udp_client.h
@@ -1,6 +1,6 @@
1// Copyright 2021 yuzu Emulator Project 1// Copyright 2018 Citra Emulator Project
2// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included 3// Refer to the license.txt file included.
4 4
5#pragma once 5#pragma once
6 6
diff --git a/src/input_common/helpers/stick_from_buttons.h b/src/input_common/helpers/stick_from_buttons.h
index 1d6e24c98..82dff5ca8 100644
--- a/src/input_common/helpers/stick_from_buttons.h
+++ b/src/input_common/helpers/stick_from_buttons.h
@@ -1,4 +1,3 @@
1
2// Copyright 2017 Citra Emulator Project 1// Copyright 2017 Citra Emulator Project
3// Licensed under GPLv2 or any later version 2// Licensed under GPLv2 or any later version
4// Refer to the license.txt file included. 3// Refer to the license.txt file included.
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp
index b048783c9..8f7ce59b7 100644
--- a/src/input_common/main.cpp
+++ b/src/input_common/main.cpp
@@ -87,25 +87,30 @@ struct InputSubsystem::Impl {
87 87
88 void Shutdown() { 88 void Shutdown() {
89 Input::UnregisterFactory<Input::InputDevice>(keyboard->GetEngineName()); 89 Input::UnregisterFactory<Input::InputDevice>(keyboard->GetEngineName());
90 Input::UnregisterFactory<Input::OutputDevice>(keyboard->GetEngineName());
90 keyboard.reset(); 91 keyboard.reset();
91 92
92 Input::UnregisterFactory<Input::InputDevice>(mouse->GetEngineName()); 93 Input::UnregisterFactory<Input::InputDevice>(mouse->GetEngineName());
94 Input::UnregisterFactory<Input::OutputDevice>(mouse->GetEngineName());
93 mouse.reset(); 95 mouse.reset();
94 96
95 Input::UnregisterFactory<Input::InputDevice>(touch_screen->GetEngineName()); 97 Input::UnregisterFactory<Input::InputDevice>(touch_screen->GetEngineName());
96 touch_screen.reset(); 98 touch_screen.reset();
97 99
98 Input::UnregisterFactory<Input::InputDevice>(gcadapter->GetEngineName()); 100 Input::UnregisterFactory<Input::InputDevice>(gcadapter->GetEngineName());
101 Input::UnregisterFactory<Input::OutputDevice>(gcadapter->GetEngineName());
99 gcadapter.reset(); 102 gcadapter.reset();
100 103
101 Input::UnregisterFactory<Input::InputDevice>(udp_client->GetEngineName()); 104 Input::UnregisterFactory<Input::InputDevice>(udp_client->GetEngineName());
102 udp_client.reset(); 105 udp_client.reset();
103 106
104 Input::UnregisterFactory<Input::InputDevice>(tas_input->GetEngineName()); 107 Input::UnregisterFactory<Input::InputDevice>(tas_input->GetEngineName());
108 Input::UnregisterFactory<Input::OutputDevice>(tas_input->GetEngineName());
105 tas_input.reset(); 109 tas_input.reset();
106 110
107#ifdef HAVE_SDL2 111#ifdef HAVE_SDL2
108 Input::UnregisterFactory<Input::InputDevice>(sdl->GetEngineName()); 112 Input::UnregisterFactory<Input::InputDevice>(sdl->GetEngineName());
113 Input::UnregisterFactory<Input::OutputDevice>(sdl->GetEngineName());
109 sdl.reset(); 114 sdl.reset();
110#endif 115#endif
111 116
@@ -124,8 +129,6 @@ struct InputSubsystem::Impl {
124 devices.insert(devices.end(), mouse_devices.begin(), mouse_devices.end()); 129 devices.insert(devices.end(), mouse_devices.begin(), mouse_devices.end());
125 auto gcadapter_devices = gcadapter->GetInputDevices(); 130 auto gcadapter_devices = gcadapter->GetInputDevices();
126 devices.insert(devices.end(), gcadapter_devices.begin(), gcadapter_devices.end()); 131 devices.insert(devices.end(), gcadapter_devices.begin(), gcadapter_devices.end());
127 auto tas_input_devices = tas_input->GetInputDevices();
128 devices.insert(devices.end(), tas_input_devices.begin(), tas_input_devices.end());
129#ifdef HAVE_SDL2 132#ifdef HAVE_SDL2
130 auto sdl_devices = sdl->GetInputDevices(); 133 auto sdl_devices = sdl->GetInputDevices();
131 devices.insert(devices.end(), sdl_devices.begin(), sdl_devices.end()); 134 devices.insert(devices.end(), sdl_devices.begin(), sdl_devices.end());