From 1736d19f75c37e177e18d2b2f9d3f6897842ef13 Mon Sep 17 00:00:00 2001 From: lesseradmin Date: Thu, 3 Sep 2026 01:56:45 -0500 Subject: [PATCH] fix(pipewire): mute route-less virtual sources --- src/pipewire/pipewire_service.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/pipewire/pipewire_service.cpp b/src/pipewire/pipewire_service.cpp index 6861c7aeb6..726893c707 100644 --- a/src/pipewire/pipewire_service.cpp +++ b/src/pipewire/pipewire_service.cpp @@ -1925,9 +1925,9 @@ void PipeWireService::setNodeMuted(std::uint32_t id, bool muted) { return; } - // Device nodes go through WirePlumber's mixer-api to keep pipewire-pulse / pavucontrol in sync. The - // committed mute echoes back through onMixerVolumeChanged; swMute is set optimistically for - // immediate UI feedback. + // Device nodes with a hardware route go through WirePlumber's mixer-api to keep pipewire-pulse / + // pavucontrol in sync. Route-less virtual sources also need the direct SPA node mute below: the mixer + // write can update the optimistic UI state without stopping capture in the virtual filter graph. const bool isDeviceNode = nd.mediaClass == "Audio/Sink" || nd.mediaClass == "Audio/Source"; if (isDeviceNode && m_wpMixer != nullptr) { m_wpMixer->setMuted(id, muted); @@ -1942,7 +1942,9 @@ void PipeWireService::setNodeMuted(std::uint32_t id, bool muted) { } rebuildState(); } - return; + if (nd.hasRoute) { + return; + } } // Program streams, and device nodes for immediate local/UI consistency.