From 4755e164ad1944a61d57a5271d5b76ce5081ea97 Mon Sep 17 00:00:00 2001 From: isXander Date: Mon, 10 Jul 2023 16:59:10 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Optimize=20rumble=20driver?= =?UTF-8?q?=20calls=20+=20silence=20rumble=20when=20out=20of=20focus=20rat?= =?UTF-8?q?her=20than=20cancel=20all=20effects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/isxander/controlify/Controlify.java | 3 ++- .../controlify/rumble/RumbleManager.java | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/isxander/controlify/Controlify.java b/src/main/java/dev/isxander/controlify/Controlify.java index 018e320..f727e40 100644 --- a/src/main/java/dev/isxander/controlify/Controlify.java +++ b/src/main/java/dev/isxander/controlify/Controlify.java @@ -320,8 +320,9 @@ public class Controlify implements ControlifyApi { if (outOfFocus) { state = ControllerState.EMPTY; - controller.rumbleManager().clearEffects(); + controller.rumbleManager().setSilent(true); } else { + controller.rumbleManager().setSilent(false); controller.rumbleManager().tick(); } diff --git a/src/main/java/dev/isxander/controlify/rumble/RumbleManager.java b/src/main/java/dev/isxander/controlify/rumble/RumbleManager.java index 91e313b..32d9f5c 100644 --- a/src/main/java/dev/isxander/controlify/rumble/RumbleManager.java +++ b/src/main/java/dev/isxander/controlify/rumble/RumbleManager.java @@ -9,6 +9,9 @@ import java.util.Queue; public class RumbleManager { private final RumbleCapable controller; private final Queue effectQueue; + private RumbleEffectInstance prevEffect = null; + + private boolean silent, wasSilent; public RumbleManager(RumbleCapable controller) { this.controller = controller; @@ -51,14 +54,26 @@ public class RumbleManager { effectQueue.removeIf(e -> e.effect().isFinished()); effectQueue.forEach(e -> e.effect().tick()); - RumbleState state = effect.effect().currentState(); - controller.setRumble(state.strong(), state.weak(), effect.source()); + if (silent) { + if (!wasSilent) { + controller.setRumble(0f, 0f, RumbleSource.MASTER); + wasSilent = true; + } + } else if (!effect.equals(prevEffect)) { + RumbleState state = effect.effect().currentState(); + controller.setRumble(state.strong(), state.weak(), effect.source()); + prevEffect = effect; + } } public void clearEffects() { effectQueue.clear(); } + public void setSilent(boolean silent) { + this.silent = silent; + } + public boolean isPlaying() { return !effectQueue.isEmpty(); }