From b5b083305f226e293bb87c8c9e212b4763500bab Mon Sep 17 00:00:00 2001 From: bbedward Date: Tue, 14 Jul 2026 14:16:05 -0400 Subject: [PATCH] cava: optimize CPU burn related #631 (cherry picked from commit 2c5a1a2804ebf5c6d2777fd8f7f345a36e033fe2) --- .../DankBar/Widgets/AudioVisualization.qml | 2 +- quickshell/Modules/Lock/LockScreenContent.qml | 8 ++++++-- quickshell/Services/CavaService.qml | 20 ++++++++++++------- quickshell/Widgets/DankAlbumArt.qml | 14 ++++++++++--- 4 files changed, 31 insertions(+), 13 deletions(-) diff --git a/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml b/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml index e4a6df59b..86d02dfe4 100644 --- a/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml +++ b/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml @@ -8,7 +8,7 @@ Item { readonly property MprisPlayer activePlayer: MprisController.activePlayer readonly property bool isPlaying: activePlayer !== null && activePlayer.playbackState === MprisPlaybackState.Playing - readonly property bool live: visible && isPlaying + readonly property bool live: visible && (Window.window?.visible ?? false) && isPlaying width: 20 height: Theme.iconSize diff --git a/quickshell/Modules/Lock/LockScreenContent.qml b/quickshell/Modules/Lock/LockScreenContent.qml index 93194dbed..092d76c62 100644 --- a/quickshell/Modules/Lock/LockScreenContent.qml +++ b/quickshell/Modules/Lock/LockScreenContent.qml @@ -1477,12 +1477,16 @@ Item { anchors.verticalCenter: parent.verticalCenter Item { + id: lockVisualizer + width: 20 height: Theme.iconSize anchors.verticalCenter: parent.verticalCenter + readonly property bool live: visible && (Window.window?.visible ?? false) && MprisController.activePlayer?.playbackState === MprisPlaybackState.Playing + Loader { - active: MprisController.activePlayer?.playbackState === MprisPlaybackState.Playing + active: lockVisualizer.live sourceComponent: Component { Ref { @@ -1492,7 +1496,7 @@ Item { } Timer { - running: !CavaService.cavaAvailable && MprisController.activePlayer?.playbackState === MprisPlaybackState.Playing + running: !CavaService.cavaAvailable && lockVisualizer.live interval: 256 repeat: true onTriggered: { diff --git a/quickshell/Services/CavaService.qml b/quickshell/Services/CavaService.qml index 622e2c607..54e7771e9 100644 --- a/quickshell/Services/CavaService.qml +++ b/quickshell/Services/CavaService.qml @@ -39,6 +39,7 @@ framerate=25 bars=6 autosens=0 sensitivity=30 +sleep_timer=3 lower_cutoff_freq=50 higher_cutoff_freq=12000 @@ -67,13 +68,18 @@ exec cava -p ${root._confPath} < /dev/null`] stdout: SplitParser { splitMarker: "\n" onRead: data => { - if (root.refCount > 0 && data.length > 0) { - const parts = data.split(";"); - if (parts.length >= 6) { - const points = [parseInt(parts[0], 10), parseInt(parts[1], 10), parseInt(parts[2], 10), parseInt(parts[3], 10), parseInt(parts[4], 10), parseInt(parts[5], 10)]; - root.values = points; - } - } + if (root.refCount <= 0 || data.length === 0) + return; + + const parts = data.split(";"); + if (parts.length < 6) + return; + + const points = [parseInt(parts[0], 10), parseInt(parts[1], 10), parseInt(parts[2], 10), parseInt(parts[3], 10), parseInt(parts[4], 10), parseInt(parts[5], 10)]; + if (points.every((v, i) => v === root.values[i])) + return; + + root.values = points; } } } diff --git a/quickshell/Widgets/DankAlbumArt.qml b/quickshell/Widgets/DankAlbumArt.qml index 31ce0ebfb..90699b1e3 100644 --- a/quickshell/Widgets/DankAlbumArt.qml +++ b/quickshell/Widgets/DankAlbumArt.qml @@ -45,7 +45,8 @@ Item { readonly property real blobMorphBoost: 1.7 readonly property real blobSpinSpeed: 0.03 - readonly property bool blobActive: CavaService.cavaAvailable && activePlayer?.playbackState === MprisPlaybackState.Playing && showAnimation && albumArtStatus === Image.Ready + readonly property bool onScreen: visible && (Window.window?.visible ?? false) + readonly property bool blobActive: CavaService.cavaAvailable && onScreen && activePlayer?.playbackState === MprisPlaybackState.Playing && showAnimation && albumArtStatus === Image.Ready property var smoothedBands: [0, 0, 0, 0, 0, 0] property var slowBands: [0, 0, 0, 0, 0, 0] property var bandTargets: [0, 0, 0, 0, 0, 0] @@ -165,7 +166,7 @@ Item { } Loader { - active: activePlayer?.playbackState === MprisPlaybackState.Playing && showAnimation + active: root.onScreen && activePlayer?.playbackState === MprisPlaybackState.Playing && showAnimation sourceComponent: Component { Ref { service: CavaService @@ -183,7 +184,14 @@ Item { FrameAnimation { running: blobEffect.visible - onTriggered: root.stepBlob(Math.min(frameTime, 0.05)) + property real pending: 0 + onTriggered: { + pending += frameTime; + if (pending < 0.03) + return; + root.stepBlob(Math.min(pending, 0.05)); + pending = 0; + } } ShaderEffect {