1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-22 02:32:36 +01:00

Input: fix pad initialization

This commit is contained in:
Megamouse 2022-08-05 14:49:32 +02:00
parent fd1968dd22
commit c4b38869ab
3 changed files with 26 additions and 10 deletions

View File

@ -28,6 +28,7 @@ namespace pad
atomic_t<pad_thread*> g_current = nullptr;
shared_mutex g_pad_mutex;
std::string g_title_id;
atomic_t<bool> g_started{false};
atomic_t<bool> g_reset{false};
atomic_t<bool> g_enabled{true};
}
@ -40,11 +41,11 @@ struct pad_setting
s32 ldd_handle = -1;
};
pad_thread::pad_thread(void *_curthread, void *_curwindow, std::string_view title_id) : curthread(_curthread), curwindow(_curwindow)
pad_thread::pad_thread(void* curthread, void* curwindow, std::string_view title_id) : m_curthread(curthread), m_curwindow(curwindow)
{
pad::g_title_id = title_id;
pad::g_current = this;
pad::g_reset = true;
pad::g_started = false;
}
pad_thread::~pad_thread()
@ -138,8 +139,8 @@ void pad_thread::Init()
{
case pad_handler::keyboard:
keyptr = std::make_shared<keyboard_pad_handler>();
keyptr->moveToThread(static_cast<QThread*>(curthread));
keyptr->SetTargetWindow(static_cast<QWindow*>(curwindow));
keyptr->moveToThread(static_cast<QThread*>(m_curthread));
keyptr->SetTargetWindow(static_cast<QWindow*>(m_curwindow));
cur_pad_handler = keyptr;
break;
case pad_handler::ds3:
@ -216,13 +217,19 @@ void pad_thread::SetIntercepted(bool intercepted)
void pad_thread::operator()()
{
Init();
pad::g_reset = false;
pad::g_started = true;
bool mode_changed = true;
atomic_t<pad_handler_mode> pad_mode{g_cfg.io.pad_mode.get()};
std::vector<std::unique_ptr<named_thread<std::function<void()>>>> threads;
const auto stop_threads = [&threads]()
{
input_log.notice("Stopping pad threads...");
for (auto& thread : threads)
{
if (thread)
@ -233,6 +240,8 @@ void pad_thread::operator()()
}
}
threads.clear();
input_log.notice("Pad threads stopped");
};
const auto start_threads = [this, &threads, &pad_mode]()
@ -242,13 +251,15 @@ void pad_thread::operator()()
return;
}
input_log.notice("Starting pad threads...");
for (const auto& handler : handlers)
{
if (handler.first == pad_handler::null)
{
continue;
}
threads.push_back(std::make_unique<named_thread<std::function<void()>>>(fmt::format("%s Thread", handler.second->m_type), [&handler = handler.second, &pad_mode]()
{
while (thread_ctrl::state() != thread_state::aborting)
@ -265,6 +276,8 @@ void pad_thread::operator()()
}
}));
}
input_log.notice("Pad threads started");
};
while (thread_ctrl::state() != thread_state::aborting)
@ -277,11 +290,13 @@ void pad_thread::operator()()
// Update variables
const bool needs_reset = pad::g_reset && pad::g_reset.exchange(false);
const bool mode_changed = pad_mode != pad_mode.exchange(g_cfg.io.pad_mode.get());
mode_changed |= pad_mode != pad_mode.exchange(g_cfg.io.pad_mode.get());
// Reset pad handlers if necessary
if (needs_reset || mode_changed)
{
mode_changed = false;
stop_threads();
if (needs_reset)

View File

@ -17,7 +17,7 @@ class PadHandlerBase;
class pad_thread
{
public:
pad_thread(void* _curthread, void* _curwindow, std::string_view title_id); // void * instead of QThread * and QWindow * because of include in emucore
pad_thread(void* curthread, void* curwindow, std::string_view title_id); // void * instead of QThread * and QWindow * because of include in emucore
pad_thread(const pad_thread&) = delete;
pad_thread& operator=(const pad_thread&) = delete;
~pad_thread();
@ -45,8 +45,8 @@ protected:
std::map<pad_handler, std::shared_ptr<PadHandlerBase>> handlers;
// Used for pad_handler::keyboard
void *curthread;
void *curwindow;
void* m_curthread = nullptr;
void* m_curwindow = nullptr;
PadInfo m_info{ 0, 0, false };
std::array<std::shared_ptr<Pad>, CELL_PAD_MAX_PORT_NUM> m_pads;
@ -61,6 +61,7 @@ namespace pad
extern std::string g_title_id;
extern atomic_t<bool> g_enabled;
extern atomic_t<bool> g_reset;
extern atomic_t<bool> g_started;
static inline class pad_thread* get_current_handler(bool relaxed = false)
{

View File

@ -106,7 +106,7 @@ EmuCallbacks main_application::CreateCallbacks()
callbacks.init_pad_handler = [this](std::string_view title_id)
{
ensure(g_fxo->init<named_thread<pad_thread>>(get_thread(), m_game_window, title_id));
while (pad::g_reset) std::this_thread::yield();
while (!pad::g_started) std::this_thread::yield();
};
callbacks.get_audio = []() -> std::shared_ptr<AudioBackend>