From 042e02eb3eac4ebc6594fd586b0850734354f980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Fri, 1 Jan 2021 13:56:30 +0100 Subject: [PATCH] Add Rumble to GUI --- gui/include/controllermanager.h | 1 + gui/include/streamsession.h | 2 +- gui/src/controllermanager.cpp | 9 +++++++++ gui/src/streamsession.cpp | 14 ++++++++------ lib/include/chiaki/session.h | 4 ++-- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/gui/include/controllermanager.h b/gui/include/controllermanager.h index 6ec6efb..18d9d72 100644 --- a/gui/include/controllermanager.h +++ b/gui/include/controllermanager.h @@ -73,6 +73,7 @@ class Controller : public QObject int GetDeviceID(); QString GetName(); ChiakiControllerState GetState(); + void SetRumble(uint8_t left, uint8_t right); signals: void StateChanged(); diff --git a/gui/include/streamsession.h b/gui/include/streamsession.h index c98758e..47dc217 100644 --- a/gui/include/streamsession.h +++ b/gui/include/streamsession.h @@ -92,13 +92,13 @@ class StreamSession : public QObject QMap key_map; void PushAudioFrame(int16_t *buf, size_t samples_count); - void Event(ChiakiEvent *event); #if CHIAKI_GUI_ENABLE_SETSU void HandleSetsuEvent(SetsuEvent *event); #endif private slots: void InitAudio(unsigned int channels, unsigned int rate); + void Event(ChiakiEvent *event); public: explicit StreamSession(const StreamSessionConnectInfo &connect_info, QObject *parent = nullptr); diff --git a/gui/src/controllermanager.cpp b/gui/src/controllermanager.cpp index 2f9a2aa..16804af 100644 --- a/gui/src/controllermanager.cpp +++ b/gui/src/controllermanager.cpp @@ -291,3 +291,12 @@ ChiakiControllerState Controller::GetState() #endif return state; } + +void Controller::SetRumble(uint8_t left, uint8_t right) +{ +#ifdef CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER + if(!controller) + return; + SDL_GameControllerRumble(controller, (uint16_t)left << 8, (uint16_t)right << 8, 5000); +#endif +} diff --git a/gui/src/streamsession.cpp b/gui/src/streamsession.cpp index 886806f..b1cbb47 100644 --- a/gui/src/streamsession.cpp +++ b/gui/src/streamsession.cpp @@ -313,13 +313,11 @@ void StreamSession::SendFeedbackState() ChiakiControllerState state; chiaki_controller_state_set_idle(&state); -#if CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER for(auto controller : controllers) { auto controller_state = controller->GetState(); chiaki_controller_state_or(&state, &state, &controller_state); } -#endif #if CHIAKI_GUI_ENABLE_SETSU chiaki_controller_state_or(&state, &state, &setsu_state); @@ -381,11 +379,15 @@ void StreamSession::Event(ChiakiEvent *event) case CHIAKI_EVENT_LOGIN_PIN_REQUEST: emit LoginPINRequested(event->login_pin_request.pin_incorrect); break; - case CHIAKI_EVENT_RUMBLE: - // TODO - //CHIAKI_LOGD(GetChiakiLog(), "Rumble %#02x, %#02x, %#02x", - // event->rumble.unknown, event->rumble.left, event->rumble.right); + case CHIAKI_EVENT_RUMBLE: { + uint8_t left = event->rumble.left; + uint8_t right = event->rumble.right; + QMetaObject::invokeMethod(this, [this, left, right]() { + for(auto controller : controllers) + controller->SetRumble(left, right); + }); break; + } default: break; } diff --git a/lib/include/chiaki/session.h b/lib/include/chiaki/session.h index a3480c1..3a60417 100644 --- a/lib/include/chiaki/session.h +++ b/lib/include/chiaki/session.h @@ -117,8 +117,8 @@ typedef struct chiaki_audio_stream_info_event_t typedef struct chiaki_rumble_event_t { uint8_t unknown; - uint8_t left; - uint8_t right; + uint8_t left; // low-frequency + uint8_t right; // high-frequency } ChiakiRumbleEvent; typedef enum {