From ce52398dc50ff10b8c668933408e723d3febda19 Mon Sep 17 00:00:00 2001 From: utopiafallen Date: Sun, 23 Oct 2022 19:49:35 +0000 Subject: [PATCH] Validate controllers when handling rumble events from GameStream Rumble events may be received for controllers that are no longer present or attached so they should be dropped instead of being forwarded to JS for handling. --- gamepad.cpp | 8 ++++++++ moonlight.hpp | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/gamepad.cpp b/gamepad.cpp index eac6979..c18dff8 100644 --- a/gamepad.cpp +++ b/gamepad.cpp @@ -132,6 +132,14 @@ void MoonlightInstance::PollGamepads() { void MoonlightInstance::ClControllerRumble(unsigned short controllerNumber, unsigned short lowFreqMotor, unsigned short highFreqMotor) { + PP_GamepadsSampleData gamepadData; + g_Instance->m_GamepadApi->Sample(g_Instance->pp_instance(), &gamepadData); + + // We must determine which gamepads are connected before sending rumble events. + const unsigned short activeGamepadMask = static_cast(GetActiveGamepadMask(gamepadData)); + if ((activeGamepadMask & (1 << controllerNumber)) == 0) + return; + const float weakMagnitude = static_cast(highFreqMotor) / static_cast(UINT16_MAX); const float strongMagnitude = static_cast(lowFreqMotor) / static_cast(UINT16_MAX); diff --git a/moonlight.hpp b/moonlight.hpp index 8af689b..ae3e72d 100644 --- a/moonlight.hpp +++ b/moonlight.hpp @@ -166,6 +166,9 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock { void NvHTTPInit(int32_t callbackId, pp::VarArray args); void NvHTTPRequest(int32_t, int32_t callbackId, pp::VarArray args); + public: + const PPB_Gamepad* m_GamepadApi; + private: static CONNECTION_LISTENER_CALLBACKS s_ClCallbacks; static DECODER_RENDERER_CALLBACKS s_DrCallbacks; @@ -198,7 +201,6 @@ class MoonlightInstance : public pp::Instance, public pp::MouseLock { pp::Audio m_AudioPlayer; double m_LastPadTimestamps[4]; - const PPB_Gamepad* m_GamepadApi; pp::CompletionCallbackFactory m_CallbackFactory; bool m_MouseLocked; bool m_WaitingForAllModifiersUp;