Connect all available controllers in GUI (#380)

This commit is contained in:
Tom 2020-12-03 13:04:05 -07:00 committed by GitHub
commit dff9844132
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 28 additions and 19 deletions

View file

@ -41,7 +41,7 @@ class ControllerManager : public QObject
ControllerManager(QObject *parent = nullptr);
~ControllerManager();
QList<int> GetAvailableControllers();
QSet<int> GetAvailableControllers();
Controller *OpenController(int device_id);
signals:

View file

@ -68,7 +68,7 @@ class StreamSession : public QObject
ChiakiOpusDecoder opus_decoder;
bool connected;
Controller *controller;
QHash<int, Controller *> controllers;
#if CHIAKI_GUI_ENABLE_SETSU
Setsu *setsu;
QMap<QPair<QString, SetsuTrackingId>, uint8_t> setsu_ids;
@ -111,7 +111,7 @@ class StreamSession : public QObject
void SetLoginPIN(const QString &pin);
Controller *GetController() { return controller; }
QList<Controller *> GetControllers() { return controllers.values(); }
VideoDecoder *GetVideoDecoder() { return video_decoder; }
#if CHIAKI_LIB_ENABLE_PI_DECODER
ChiakiPiDecoder *GetPiDecoder() { return pi_decoder; }

View file

@ -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<int> ControllerManager::GetAvailableControllers()
QSet<int> ControllerManager::GetAvailableControllers()
{
#ifdef CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
return available_controllers.values();
return available_controllers;
#else
return {};
#endif

View file

@ -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