Merge pull request #8510 from german77/vibration

input_common: sdl: lower vibration frequency and use it's own unique thread
merge-requests/60/head
liamwhite 2022-07-14 20:41:29 +07:00 committed by GitHub
commit 9627c550a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 3 deletions

@ -838,11 +838,11 @@ bool Controller_NPad::VibrateControllerAtIndex(Core::HID::NpadIdType npad_id,
const auto now = steady_clock::now(); const auto now = steady_clock::now();
// Filter out non-zero vibrations that are within 10ms of each other. // Filter out non-zero vibrations that are within 15ms of each other.
if ((vibration_value.low_amplitude != 0.0f || vibration_value.high_amplitude != 0.0f) && if ((vibration_value.low_amplitude != 0.0f || vibration_value.high_amplitude != 0.0f) &&
duration_cast<milliseconds>( duration_cast<milliseconds>(
now - controller.vibration[device_index].last_vibration_timepoint) < now - controller.vibration[device_index].last_vibration_timepoint) <
milliseconds(10)) { milliseconds(15)) {
return false; return false;
} }

@ -438,10 +438,17 @@ SDLDriver::SDLDriver(std::string input_engine_) : InputEngine(std::move(input_en
using namespace std::chrono_literals; using namespace std::chrono_literals;
while (initialized) { while (initialized) {
SDL_PumpEvents(); SDL_PumpEvents();
SendVibrations();
std::this_thread::sleep_for(1ms); std::this_thread::sleep_for(1ms);
} }
}); });
vibration_thread = std::thread([this] {
Common::SetCurrentThreadName("yuzu:input:SDL_Vibration");
using namespace std::chrono_literals;
while (initialized) {
SendVibrations();
std::this_thread::sleep_for(10ms);
}
});
} }
// Because the events for joystick connection happens before we have our event watcher added, we // Because the events for joystick connection happens before we have our event watcher added, we
// can just open all the joysticks right here // can just open all the joysticks right here
@ -457,6 +464,7 @@ SDLDriver::~SDLDriver() {
initialized = false; initialized = false;
if (start_thread) { if (start_thread) {
poll_thread.join(); poll_thread.join();
vibration_thread.join();
SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER); SDL_QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER);
} }
} }

@ -128,5 +128,6 @@ private:
std::atomic<bool> initialized = false; std::atomic<bool> initialized = false;
std::thread poll_thread; std::thread poll_thread;
std::thread vibration_thread;
}; };
} // namespace InputCommon } // namespace InputCommon