mirror of
https://git.sr.ht/~thestr4ng3r/chiaki
synced 2025-08-19 21:13:12 -07:00
Connect all available controllers in GUI (#380)
This commit is contained in:
parent
fc5306cfdd
commit
dff9844132
4 changed files with 28 additions and 19 deletions
|
@ -41,7 +41,7 @@ class ControllerManager : public QObject
|
||||||
ControllerManager(QObject *parent = nullptr);
|
ControllerManager(QObject *parent = nullptr);
|
||||||
~ControllerManager();
|
~ControllerManager();
|
||||||
|
|
||||||
QList<int> GetAvailableControllers();
|
QSet<int> GetAvailableControllers();
|
||||||
Controller *OpenController(int device_id);
|
Controller *OpenController(int device_id);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
|
@ -68,7 +68,7 @@ class StreamSession : public QObject
|
||||||
ChiakiOpusDecoder opus_decoder;
|
ChiakiOpusDecoder opus_decoder;
|
||||||
bool connected;
|
bool connected;
|
||||||
|
|
||||||
Controller *controller;
|
QHash<int, Controller *> controllers;
|
||||||
#if CHIAKI_GUI_ENABLE_SETSU
|
#if CHIAKI_GUI_ENABLE_SETSU
|
||||||
Setsu *setsu;
|
Setsu *setsu;
|
||||||
QMap<QPair<QString, SetsuTrackingId>, uint8_t> setsu_ids;
|
QMap<QPair<QString, SetsuTrackingId>, uint8_t> setsu_ids;
|
||||||
|
@ -111,7 +111,7 @@ class StreamSession : public QObject
|
||||||
|
|
||||||
void SetLoginPIN(const QString &pin);
|
void SetLoginPIN(const QString &pin);
|
||||||
|
|
||||||
Controller *GetController() { return controller; }
|
QList<Controller *> GetControllers() { return controllers.values(); }
|
||||||
VideoDecoder *GetVideoDecoder() { return video_decoder; }
|
VideoDecoder *GetVideoDecoder() { return video_decoder; }
|
||||||
#if CHIAKI_LIB_ENABLE_PI_DECODER
|
#if CHIAKI_LIB_ENABLE_PI_DECODER
|
||||||
ChiakiPiDecoder *GetPiDecoder() { return pi_decoder; }
|
ChiakiPiDecoder *GetPiDecoder() { return pi_decoder; }
|
||||||
|
|
|
@ -114,7 +114,7 @@ void ControllerManager::UpdateAvailableControllers()
|
||||||
{
|
{
|
||||||
if(!SDL_IsGameController(i))
|
if(!SDL_IsGameController(i))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// We'll try to identify pads with Motion Control
|
// We'll try to identify pads with Motion Control
|
||||||
SDL_JoystickGUID guid = SDL_JoystickGetGUID(SDL_JoystickOpen(i));
|
SDL_JoystickGUID guid = SDL_JoystickGetGUID(SDL_JoystickOpen(i));
|
||||||
char guid_str[256];
|
char guid_str[256];
|
||||||
|
@ -174,10 +174,10 @@ void ControllerManager::ControllerEvent(int device_id)
|
||||||
open_controllers[device_id]->UpdateState();
|
open_controllers[device_id]->UpdateState();
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<int> ControllerManager::GetAvailableControllers()
|
QSet<int> ControllerManager::GetAvailableControllers()
|
||||||
{
|
{
|
||||||
#ifdef CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
|
#ifdef CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
|
||||||
return available_controllers.values();
|
return available_controllers;
|
||||||
#else
|
#else
|
||||||
return {};
|
return {};
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -43,7 +43,6 @@ static void SessionSetsuCb(SetsuEvent *event, void *user);
|
||||||
StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent)
|
StreamSession::StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
log(this, connect_info.log_level_mask, connect_info.log_file),
|
log(this, connect_info.log_level_mask, connect_info.log_file),
|
||||||
controller(nullptr),
|
|
||||||
video_decoder(nullptr),
|
video_decoder(nullptr),
|
||||||
#if CHIAKI_LIB_ENABLE_PI_DECODER
|
#if CHIAKI_LIB_ENABLE_PI_DECODER
|
||||||
pi_decoder(nullptr),
|
pi_decoder(nullptr),
|
||||||
|
@ -146,7 +145,8 @@ StreamSession::~StreamSession()
|
||||||
chiaki_session_fini(&session);
|
chiaki_session_fini(&session);
|
||||||
chiaki_opus_decoder_fini(&opus_decoder);
|
chiaki_opus_decoder_fini(&opus_decoder);
|
||||||
#if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
|
#if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
|
||||||
delete controller;
|
for(auto controller : controllers)
|
||||||
|
delete controller;
|
||||||
#endif
|
#endif
|
||||||
#if CHIAKI_GUI_ENABLE_SETSU
|
#if CHIAKI_GUI_ENABLE_SETSU
|
||||||
setsu_free(setsu);
|
setsu_free(setsu);
|
||||||
|
@ -253,25 +253,31 @@ void StreamSession::HandleKeyboardEvent(QKeyEvent *event)
|
||||||
void StreamSession::UpdateGamepads()
|
void StreamSession::UpdateGamepads()
|
||||||
{
|
{
|
||||||
#if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
|
#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());
|
CHIAKI_LOGI(log.GetChiakiLog(), "Controller %d disconnected", controller->GetDeviceID());
|
||||||
|
controllers.remove(controller_id);
|
||||||
delete controller;
|
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)
|
if(!controller)
|
||||||
{
|
{
|
||||||
CHIAKI_LOGE(log.GetChiakiLog(), "Failed to open controller %d", available_controllers[0]);
|
CHIAKI_LOGE(log.GetChiakiLog(), "Failed to open controller %d", controller_id);
|
||||||
return;
|
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);
|
connect(controller, &Controller::StateChanged, this, &StreamSession::SendFeedbackState);
|
||||||
|
controllers[controller_id] = controller;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -285,8 +291,11 @@ void StreamSession::SendFeedbackState()
|
||||||
chiaki_controller_state_set_idle(&state);
|
chiaki_controller_state_set_idle(&state);
|
||||||
|
|
||||||
#if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
|
#if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER
|
||||||
if(controller)
|
for(auto controller : controllers)
|
||||||
state = controller->GetState();
|
{
|
||||||
|
auto controller_state = controller->GetState();
|
||||||
|
chiaki_controller_state_or(&state, &state, &controller_state);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CHIAKI_GUI_ENABLE_SETSU
|
#if CHIAKI_GUI_ENABLE_SETSU
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue