summaryrefslogtreecommitdiff
path: root/src/input_common/main.cpp
diff options
context:
space:
mode:
authorGravatar MonsterDruide12021-06-18 16:15:42 +0200
committerGravatar MonsterDruide12021-09-18 23:22:00 +0200
commitb42c3ce21db249d5e3bc04b4f73202e757da317c (patch)
treec5ccf9e311d2a675b0e2afff3d85ed4654047b5e /src/input_common/main.cpp
parentMerge pull request #7020 from Moonlacer/remove_audio_stretching (diff)
downloadyuzu-b42c3ce21db249d5e3bc04b4f73202e757da317c.tar.gz
yuzu-b42c3ce21db249d5e3bc04b4f73202e757da317c.tar.xz
yuzu-b42c3ce21db249d5e3bc04b4f73202e757da317c.zip
input_common/tas: Base playback & recording system
The base playback system supports up to 8 controllers (specified by `PLAYER_NUMBER` in `tas_input.h`), which all change their inputs simulataneously when `TAS::UpdateThread` is called. The recording system uses the controller debugger to read the state of the first controller and forwards that data to the TASing system for recording. Currently, this process sadly is not frame-perfect and pixel-accurate. Co-authored-by: Naii-the-Baf <sfabian200@gmail.com> Co-authored-by: Narr-the-Reg <juangerman-13@hotmail.com>
Diffstat (limited to 'src/input_common/main.cpp')
-rw-r--r--src/input_common/main.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp
index ff23230f0..4f170493e 100644
--- a/src/input_common/main.cpp
+++ b/src/input_common/main.cpp
@@ -13,6 +13,8 @@
13#include "input_common/motion_from_button.h" 13#include "input_common/motion_from_button.h"
14#include "input_common/mouse/mouse_input.h" 14#include "input_common/mouse/mouse_input.h"
15#include "input_common/mouse/mouse_poller.h" 15#include "input_common/mouse/mouse_poller.h"
16#include "input_common/tas/tas_input.h"
17#include "input_common/tas/tas_poller.h"
16#include "input_common/touch_from_button.h" 18#include "input_common/touch_from_button.h"
17#include "input_common/udp/client.h" 19#include "input_common/udp/client.h"
18#include "input_common/udp/udp.h" 20#include "input_common/udp/udp.h"
@@ -60,6 +62,12 @@ struct InputSubsystem::Impl {
60 Input::RegisterFactory<Input::MotionDevice>("mouse", mousemotion); 62 Input::RegisterFactory<Input::MotionDevice>("mouse", mousemotion);
61 mousetouch = std::make_shared<MouseTouchFactory>(mouse); 63 mousetouch = std::make_shared<MouseTouchFactory>(mouse);
62 Input::RegisterFactory<Input::TouchDevice>("mouse", mousetouch); 64 Input::RegisterFactory<Input::TouchDevice>("mouse", mousetouch);
65
66 tas = std::make_shared<TasInput::Tas>();
67 tasbuttons = std::make_shared<TasButtonFactory>(tas);
68 Input::RegisterFactory<Input::ButtonDevice>("tas", tasbuttons);
69 tasanalog = std::make_shared<TasAnalogFactory>(tas);
70 Input::RegisterFactory<Input::AnalogDevice>("tas", tasanalog);
63 } 71 }
64 72
65 void Shutdown() { 73 void Shutdown() {
@@ -94,12 +102,19 @@ struct InputSubsystem::Impl {
94 mouseanalog.reset(); 102 mouseanalog.reset();
95 mousemotion.reset(); 103 mousemotion.reset();
96 mousetouch.reset(); 104 mousetouch.reset();
105
106 Input::UnregisterFactory<Input::ButtonDevice>("tas");
107 Input::UnregisterFactory<Input::AnalogDevice>("tas");
108
109 tasbuttons.reset();
110 tasanalog.reset();
97 } 111 }
98 112
99 [[nodiscard]] std::vector<Common::ParamPackage> GetInputDevices() const { 113 [[nodiscard]] std::vector<Common::ParamPackage> GetInputDevices() const {
100 std::vector<Common::ParamPackage> devices = { 114 std::vector<Common::ParamPackage> devices = {
101 Common::ParamPackage{{"display", "Any"}, {"class", "any"}}, 115 Common::ParamPackage{{"display", "Any"}, {"class", "any"}},
102 Common::ParamPackage{{"display", "Keyboard/Mouse"}, {"class", "keyboard"}}, 116 Common::ParamPackage{{"display", "Keyboard/Mouse"}, {"class", "keyboard"}},
117 Common::ParamPackage{{"display", "TAS"}, {"class", "tas"}},
103 }; 118 };
104#ifdef HAVE_SDL2 119#ifdef HAVE_SDL2
105 auto sdl_devices = sdl->GetInputDevices(); 120 auto sdl_devices = sdl->GetInputDevices();
@@ -120,6 +135,9 @@ struct InputSubsystem::Impl {
120 if (params.Get("class", "") == "gcpad") { 135 if (params.Get("class", "") == "gcpad") {
121 return gcadapter->GetAnalogMappingForDevice(params); 136 return gcadapter->GetAnalogMappingForDevice(params);
122 } 137 }
138 if (params.Get("class", "") == "tas") {
139 return tas->GetAnalogMappingForDevice(params);
140 }
123#ifdef HAVE_SDL2 141#ifdef HAVE_SDL2
124 if (params.Get("class", "") == "sdl") { 142 if (params.Get("class", "") == "sdl") {
125 return sdl->GetAnalogMappingForDevice(params); 143 return sdl->GetAnalogMappingForDevice(params);
@@ -136,6 +154,9 @@ struct InputSubsystem::Impl {
136 if (params.Get("class", "") == "gcpad") { 154 if (params.Get("class", "") == "gcpad") {
137 return gcadapter->GetButtonMappingForDevice(params); 155 return gcadapter->GetButtonMappingForDevice(params);
138 } 156 }
157 if (params.Get("class", "") == "tas") {
158 return tas->GetButtonMappingForDevice(params);
159 }
139#ifdef HAVE_SDL2 160#ifdef HAVE_SDL2
140 if (params.Get("class", "") == "sdl") { 161 if (params.Get("class", "") == "sdl") {
141 return sdl->GetButtonMappingForDevice(params); 162 return sdl->GetButtonMappingForDevice(params);
@@ -174,9 +195,12 @@ struct InputSubsystem::Impl {
174 std::shared_ptr<MouseAnalogFactory> mouseanalog; 195 std::shared_ptr<MouseAnalogFactory> mouseanalog;
175 std::shared_ptr<MouseMotionFactory> mousemotion; 196 std::shared_ptr<MouseMotionFactory> mousemotion;
176 std::shared_ptr<MouseTouchFactory> mousetouch; 197 std::shared_ptr<MouseTouchFactory> mousetouch;
198 std::shared_ptr<TasButtonFactory> tasbuttons;
199 std::shared_ptr<TasAnalogFactory> tasanalog;
177 std::shared_ptr<CemuhookUDP::Client> udp; 200 std::shared_ptr<CemuhookUDP::Client> udp;
178 std::shared_ptr<GCAdapter::Adapter> gcadapter; 201 std::shared_ptr<GCAdapter::Adapter> gcadapter;
179 std::shared_ptr<MouseInput::Mouse> mouse; 202 std::shared_ptr<MouseInput::Mouse> mouse;
203 std::shared_ptr<TasInput::Tas> tas;
180}; 204};
181 205
182InputSubsystem::InputSubsystem() : impl{std::make_unique<Impl>()} {} 206InputSubsystem::InputSubsystem() : impl{std::make_unique<Impl>()} {}
@@ -207,6 +231,14 @@ const MouseInput::Mouse* InputSubsystem::GetMouse() const {
207 return impl->mouse.get(); 231 return impl->mouse.get();
208} 232}
209 233
234TasInput::Tas* InputSubsystem::GetTas() {
235 return impl->tas.get();
236}
237
238const TasInput::Tas* InputSubsystem::GetTas() const {
239 return impl->tas.get();
240}
241
210std::vector<Common::ParamPackage> InputSubsystem::GetInputDevices() const { 242std::vector<Common::ParamPackage> InputSubsystem::GetInputDevices() const {
211 return impl->GetInputDevices(); 243 return impl->GetInputDevices();
212} 244}
@@ -287,6 +319,22 @@ const MouseTouchFactory* InputSubsystem::GetMouseTouch() const {
287 return impl->mousetouch.get(); 319 return impl->mousetouch.get();
288} 320}
289 321
322TasButtonFactory* InputSubsystem::GetTasButtons() {
323 return impl->tasbuttons.get();
324}
325
326const TasButtonFactory* InputSubsystem::GetTasButtons() const {
327 return impl->tasbuttons.get();
328}
329
330TasAnalogFactory* InputSubsystem::GetTasAnalogs() {
331 return impl->tasanalog.get();
332}
333
334const TasAnalogFactory* InputSubsystem::GetTasAnalogs() const {
335 return impl->tasanalog.get();
336}
337
290void InputSubsystem::ReloadInputDevices() { 338void InputSubsystem::ReloadInputDevices() {
291 if (!impl->udp) { 339 if (!impl->udp) {
292 return; 340 return;