From e242147340994dbb48ded3273a34079a841af25b Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Thu, 15 Oct 2026 13:06:36 +0200 Subject: feat(sound): per-app volume on the drawer page, output to 150% The island spec put per-app volume on the drawer page, and it was never built. Each application playing audio now gets a row with its name, what it is playing (two browser tabs are otherwise identical rows), a click-to-mute level and its own slider. Streams are matched on PwNodeType.AudioOutStream. Quickshell reports isSink true for a playback stream, so the obvious isStream && !isSink filter found nothing while Firefox played. Their properties are empty until bound, so the page carries a PwObjectTracker for them, which stops with the drawer. speech-dispatcher-dummy is always present and never audible, and is hidden. The output slider runs to 150%, the ceiling the volume keybind already uses (wpctl -l 1.5), with a tick at 100%. Input and apps stop at 100%: a boosted microphone only clips. The meter became an inline component shared by both, and wheel-up never lowers a level already past its maximum. Now playing is dropped from the page: the OSD already carries it. Co-Authored-By: Claude Opus 5.5 --- desktop/modules/sound/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'desktop/modules/sound/README.md') diff --git a/desktop/modules/sound/README.md b/desktop/modules/sound/README.md index 5205be8..365be4a 100644 --- a/desktop/modules/sound/README.md +++ b/desktop/modules/sound/README.md @@ -33,6 +33,22 @@ From Hyprland, to start the shell with the session: exec-once = qs -p ~/Programming/GIT/quickshell/desktop +## The page + +Output and input, each with its device, a device picker and a slider, then +one row per application playing audio, with its own slider and mute. The +output slider runs to 150%, the ceiling the volume keybind uses +(`wpctl -l 1.5`), with a tick at 100%; input and applications stop at 100%. +Now playing is the OSD's job, not the page's. + +Applications are matched on `PwNodeType.AudioOutStream`, not on `isSink`: +Quickshell reports `isSink` true for a playback stream, so the obvious +`isStream && !isSink` filter returned nothing while Firefox was playing. A +stream's `properties` (`application.name`, `media.name`) are empty until +something binds the node, so the page carries its own `PwObjectTracker` for +the streams. `speech-dispatcher-dummy` is a playback stream that is always +present and never audible, and is filtered out by name. + ## Now playing When an MPRIS player is running, a track row sits above the volume bar: album -- cgit v1.2.3