From 2c09e9185f48fc4ad7df1fb6fd621483502a60c5 Mon Sep 17 00:00:00 2001 From: ern775 Date: Fri, 27 Mar 2026 10:44:27 +0300 Subject: [PATCH] fix(audio): filter out intermediate stream nodes --- Services/Media/AudioService.qml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/Services/Media/AudioService.qml b/Services/Media/AudioService.qml index fd3e760c2..706f28c13 100644 --- a/Services/Media/AudioService.qml +++ b/Services/Media/AudioService.qml @@ -189,6 +189,9 @@ Singleton { node: root.sink } + // Track all streams globally to prevent binding loops for filtered out streams + readonly property var streamNodes: Pipewire.ready ? Pipewire.nodes.values.filter(n => n && n.isStream) : [] + // Find application streams that are connected to the default sink readonly property var appStreams: { if (!Pipewire.ready || !root.sink) { @@ -240,8 +243,10 @@ Singleton { continue; } - // If it's a stream node, add it directly - if (sourceNode.isStream && sourceNode.audio) { + // Filter out filter (intermediate) streams + const isVirtual = (sourceNode.properties && sourceNode.properties["node.virtual"]) || ""; + // If it's an application stream node, add it directly + if (sourceNode.isStream && sourceNode.audio && !isVirtual) { if (!connectedStreamIds[sourceNode.id]) { connectedStreamIds[sourceNode.id] = true; connectedStreams.push(sourceNode); @@ -272,6 +277,12 @@ Singleton { continue; } + // Filter out filter streams + const nodeIsVirtual = (node.properties && node.properties["node.virtual"]) || ""; + if (nodeIsVirtual) { + continue; + } + var streamId = node.id; if (connectedStreamIds[streamId]) { continue; @@ -302,7 +313,7 @@ Singleton { property bool _isApplyingAppOverride: false PwObjectTracker { - objects: root.appStreams + objects: root.streamNodes } // Keep appVolumeOverrides aligned with PipeWire when apps change volume/mute.