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;