From 73784585a84d0301c5f6f4cd41da804de9f86ecc Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 15 Jul 2021 19:51:08 -0500 Subject: [PATCH] Fix new Android 12 rumble code based on real hardware testing Independent rumble motor controller tested working on: - DualShock 4 (USB and BT) - DualShock 3 (USB) - Xbox Series X (USB) --- .../limelight/binding/input/ControllerHandler.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/limelight/binding/input/ControllerHandler.java b/app/src/main/java/com/limelight/binding/input/ControllerHandler.java index 28fcf4bc..131f0e2b 100644 --- a/app/src/main/java/com/limelight/binding/input/ControllerHandler.java +++ b/app/src/main/java/com/limelight/binding/input/ControllerHandler.java @@ -1316,11 +1316,21 @@ public class ControllerHandler implements InputManager.InputDeviceListener, UsbD return; } + // There's no documentation that states that vibrators for FF_RUMBLE input devices will + // always be enumerated in this order, but it seems consistent between Xbox Series X (USB), + // PS3 (USB), and PS4 (USB+BT) controllers on Android 12 Beta 3. int[] vibratorIds = vm.getVibratorIds(); + int[] vibratorAmplitudes = new int[] { (highFreqMotor >> 8) & 0xFF, (lowFreqMotor >> 8) & 0xFF }; CombinedVibration.ParallelCombination combo = CombinedVibration.startParallel(); - combo.addVibrator(vibratorIds[0], VibrationEffect.createOneShot(60000, (lowFreqMotor >> 8) & 0xFF)); - combo.addVibrator(vibratorIds[1], VibrationEffect.createOneShot(60000, (highFreqMotor >> 8) & 0xFF)); + + for (int i = 0; i < vibratorIds.length; i++) { + // It's illegal to create a VibrationEffect with an amplitude of 0. + // Simply excluding that vibrator from our ParallelCombination will turn it off. + if (vibratorAmplitudes[i] != 0) { + combo.addVibrator(vibratorIds[i], VibrationEffect.createOneShot(60000, vibratorAmplitudes[i])); + } + } vm.vibrate(combo.combine()); }