From dff98441323eccad435e1c68ed2a82d2a8f4e311 Mon Sep 17 00:00:00 2001 From: Tom <26638278+tomblind@users.noreply.github.com> Date: Thu, 3 Dec 2020 13:04:05 -0700 Subject: [PATCH] Connect all available controllers in GUI (#380) --- gui/include/controllermanager.h | 2 +- gui/include/streamsession.h | 4 ++-- gui/src/controllermanager.cpp | 6 +++--- gui/src/streamsession.cpp | 35 +++++++++++++++++++++------------ 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/gui/include/controllermanager.h b/gui/include/controllermanager.h index a4e6f99..b409a50 100644 --- a/gui/include/controllermanager.h +++ b/gui/include/controllermanager.h @@ -41,7 +41,7 @@ class ControllerManager : public QObject ControllerManager(QObject *parent = nullptr); ~ControllerManager(); - QList GetAvailableControllers(); + QSet GetAvailableControllers(); Controller *OpenController(int device_id); signals: diff --git a/gui/include/streamsession.h b/gui/include/streamsession.h index 01becf5..0035aef 100644 --- a/gui/include/streamsession.h +++ b/gui/include/streamsession.h @@ -68,7 +68,7 @@ class StreamSession : public QObject ChiakiOpusDecoder opus_decoder; bool connected; - Controller *controller; + QHash controllers; #if CHIAKI_GUI_ENABLE_SETSU Setsu *setsu; QMap, uint8_t> setsu_ids; @@ -111,7 +111,7 @@ class StreamSession : public QObject void SetLoginPIN(const QString &pin); - Controller *GetController() { return controller; } + QList GetControllers() { return controllers.values(); } VideoDecoder *GetVideoDecoder() { return video_decoder; } #if CHIAKI_LIB_ENABLE_PI_DECODER ChiakiPiDecoder *GetPiDecoder() { return pi_decoder; } diff --git a/gui/src/controllermanager.cpp b/gui/src/controllermanager.cpp index 4f0e5f4..cf31a5a 100644 --- a/gui/src/controllermanager.cpp +++ b/gui/src/controllermanager.cpp @@ -114,7 +114,7 @@ void ControllerManager::UpdateAvailableControllers() { if(!SDL_IsGameController(i)) continue; - + // We'll try to identify pads with Motion Control SDL_JoystickGUID guid = SDL_JoystickGetGUID(SDL_JoystickOpen(i)); char guid_str[256]; @@ -174,10 +174,10 @@ void ControllerManager::ControllerEvent(int device_id) open_controllers[device_id]->UpdateState(); } -QList ControllerManager::GetAvailableControllers() +QSet ControllerManager::GetAvailableControllers() { #ifdef CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER - return available_controllers.values(); + return available_controllers; #else return {}; #endif diff --git a/gui/src/streamsession.cpp b/gui/src/streamsession.cpp index d8f5147..23f7f80 100644 --- a/gui/src/streamsession.cpp +++ b/gui/src/streamsession.cpp @@ -43,7 +43,6 @@ static void SessionSetsuCb(SetsuEvent *event, void *user); StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent) : QObject(parent), log(this, connect_info.log_level_mask, connect_info.log_file), - controller(nullptr), video_decoder(nullptr), #if CHIAKI_LIB_ENABLE_PI_DECODER pi_decoder(nullptr), @@ -146,7 +145,8 @@ StreamSession::~StreamSession() chiaki_session_fini(&session); chiaki_opus_decoder_fini(&opus_decoder); #if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER - delete controller; + for(auto controller : controllers) + delete controller; #endif #if CHIAKI_GUI_ENABLE_SETSU setsu_free(setsu); @@ -253,25 +253,31 @@ void StreamSession::HandleKeyboardEvent(QKeyEvent *event) void StreamSession::UpdateGamepads() { #if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER - if(!controller || !controller->IsConnected()) + for(auto controller_id : controllers.keys()) { - if(controller) + auto controller = controllers[controller_id]; + if(!controller->IsConnected()) { CHIAKI_LOGI(log.GetChiakiLog(), "Controller %d disconnected", controller->GetDeviceID()); + controllers.remove(controller_id); delete controller; - controller = nullptr; } - const auto available_controllers = ControllerManager::GetInstance()->GetAvailableControllers(); - if(!available_controllers.isEmpty()) + } + + const auto available_controllers = ControllerManager::GetInstance()->GetAvailableControllers(); + for(auto controller_id : available_controllers) + { + if(!controllers.contains(controller_id)) { - controller = ControllerManager::GetInstance()->OpenController(available_controllers[0]); + auto controller = ControllerManager::GetInstance()->OpenController(controller_id); if(!controller) { - CHIAKI_LOGE(log.GetChiakiLog(), "Failed to open controller %d", available_controllers[0]); - return; + CHIAKI_LOGE(log.GetChiakiLog(), "Failed to open controller %d", controller_id); + continue; } - CHIAKI_LOGI(log.GetChiakiLog(), "Controller %d opened: \"%s\"", available_controllers[0], controller->GetName().toLocal8Bit().constData()); + CHIAKI_LOGI(log.GetChiakiLog(), "Controller %d opened: \"%s\"", controller_id, controller->GetName().toLocal8Bit().constData()); connect(controller, &Controller::StateChanged, this, &StreamSession::SendFeedbackState); + controllers[controller_id] = controller; } } @@ -285,8 +291,11 @@ void StreamSession::SendFeedbackState() chiaki_controller_state_set_idle(&state); #if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER - if(controller) - state = controller->GetState(); + for(auto controller : controllers) + { + auto controller_state = controller->GetState(); + chiaki_controller_state_or(&state, &state, &controller_state); + } #endif #if CHIAKI_GUI_ENABLE_SETSU