From c9eb6e69eb02d59b047a2616e1f51a07a9bcae43 Mon Sep 17 00:00:00 2001 From: Lysec Date: Tue, 24 Mar 2026 01:29:27 +0100 Subject: [PATCH] fix(audio): sync per-app volume overrides with PipeWire and new streams --- Services/Media/AudioService.qml | 52 +++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/Services/Media/AudioService.qml b/Services/Media/AudioService.qml index f3ac07d0d..9c734302a 100644 --- a/Services/Media/AudioService.qml +++ b/Services/Media/AudioService.qml @@ -305,6 +305,43 @@ Singleton { objects: root.appStreams } + // Keep appVolumeOverrides aligned with PipeWire when apps change volume/mute. + Item { + width: 0 + height: 0 + visible: false + + Repeater { + model: root.appStreams + + delegate: Connections { + required property var modelData + + target: modelData?.audio ?? null + + function onVolumeChanged() { + if (root._isApplyingAppOverride || !modelData?.audio) { + return; + } + var key = root.getAppKey(modelData); + if (key) { + root.setAppStreamVolume(key, modelData.audio.volume); + } + } + + function onMutedChanged() { + if (root._isApplyingAppOverride || !modelData?.audio) { + return; + } + var key = root.getAppKey(modelData); + if (key) { + root.setAppStreamMuted(key, modelData.audio.muted); + } + } + } + } + } + function getAppKey(node): string { if (!node || !node.properties) { return ""; @@ -362,6 +399,7 @@ Singleton { return; } + var prevKnown = root._knownAppStreamIds; var currentIds = {}; _isApplyingAppOverride = true; for (var i = 0; i < streams.length; i++) { @@ -373,6 +411,20 @@ Singleton { currentIds[s.id] = true; var key = getAppKey(s); var ov = key ? appVolumeOverrides[key] : null; + + // New stream node (reload, app restart, etc.): adopt PipeWire state into + // overrides so we do not force an outdated Noctalia-only value. + if (key && s.audio && !prevKnown[s.id]) { + var seeded = appVolumeOverrides; + if (!seeded[key]) { + seeded[key] = {}; + } + seeded[key].volume = s.audio.volume; + seeded[key].muted = s.audio.muted; + appVolumeOverrides = seeded; + ov = seeded[key]; + } + if (!ov || !s.audio) { continue; }