From d40ae9f56958af830821e9c58e1c70460c17b3ba Mon Sep 17 00:00:00 2001 From: Kekker-git Date: Sun, 25 Mar 2018 22:23:46 -0400 Subject: [PATCH] Fix indefinite rumble on emulation pause --- Source/Core/Core/Core.cpp | 24 +++++++++++++++--------- Source/Core/Core/HW/GCPad.cpp | 5 +++++ Source/Core/Core/HW/GCPad.h | 1 + 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 1c7bdac8c9..74ae5d3e5f 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -244,6 +244,17 @@ bool Init(std::unique_ptr boot) return true; } +static void ResetRumble() +{ +#if defined(__LIBUSB__) + GCAdapter::ResetRumble(); +#endif +#if defined(CIFACE_USE_XINPUT) || defined(CIFACE_USE_DINPUT) + for (int i = 0; i < 4; ++i) + Pad::ResetRumble(i); +#endif +} + // Called from GUI thread void Stop() // - Hammertime! { @@ -274,9 +285,8 @@ void Stop() // - Hammertime! g_video_backend->Video_ExitLoop(); } -#if defined(__LIBUSB__) - GCAdapter::ResetRumble(); -#endif + + ResetRumble(); #ifdef USE_MEMORYWATCHER MemoryWatcher::Shutdown(); @@ -605,9 +615,7 @@ void SetState(State state) // stopped (including the CPU). CPU::EnableStepping(true); // Break Wiimote::Pause(); -#if defined(__LIBUSB__) - GCAdapter::ResetRumble(); -#endif + ResetRumble(); break; case State::Running: CPU::EnableStepping(false); @@ -726,9 +734,7 @@ static bool PauseAndLock(bool do_lock, bool unpause_on_unlock) // (s_efbAccessRequested). Fifo::PauseAndLock(do_lock, false); -#if defined(__LIBUSB__) - GCAdapter::ResetRumble(); -#endif + ResetRumble(); // CPU is unlocked last because CPU::PauseAndLock contains the synchronization // mechanism that prevents CPU::Break from racing. diff --git a/Source/Core/Core/HW/GCPad.cpp b/Source/Core/Core/HW/GCPad.cpp index 9cefbb4db1..170e2b4f0e 100644 --- a/Source/Core/Core/HW/GCPad.cpp +++ b/Source/Core/Core/HW/GCPad.cpp @@ -60,6 +60,11 @@ void Rumble(const int pad_num, const ControlState strength) static_cast(s_config.GetController(pad_num))->SetOutput(strength); } +void ResetRumble(const int pad_num) +{ + static_cast(s_config.GetController(pad_num))->SetOutput(0.0); +} + bool GetMicButton(const int pad_num) { return static_cast(s_config.GetController(pad_num))->GetMicButton(); diff --git a/Source/Core/Core/HW/GCPad.h b/Source/Core/Core/HW/GCPad.h index 728f68e7f9..d3a9572d8c 100644 --- a/Source/Core/Core/HW/GCPad.h +++ b/Source/Core/Core/HW/GCPad.h @@ -27,6 +27,7 @@ InputConfig* GetConfig(); GCPadStatus GetStatus(int pad_num); ControllerEmu::ControlGroup* GetGroup(int pad_num, PadGroup group); void Rumble(int pad_num, ControlState strength); +void ResetRumble(int pad_num); bool GetMicButton(int pad_num); }