The popup presents lowercase output and input sections backed by current PipeWire devices.
Each device row shows a speaker or microphone state glyph, device name, volume slider, and percentage from 0% through 150%.
Muted rows show a muted glyph and reduced emphasis.
Default devices use selected card border and fill without an exposed accent sliver.
Clicking or dragging a slider changes volume; middle click toggles mute.
Selecting a device name makes it the default output or input.
Empty sections remain valid.
The bar privacy indicator reports microphone and camera activity with a lowercase label.
Constraints
PipeWire remains the authoritative audio boundary.
Volume is clamped to 0 through 1.5.
Missing names use a stable fallback; missing default devices produce no selected row.
Existing audio, privacy, routing, and self-test IPC remains available.
State retains consumed sinks, sources, streams, default IDs, privacy, and action results.
State excludes backend narration and unused shader descriptions.
Existing stream routing remains available, but no new routing UI is required.
Acceptance
Pure tests cover volume boundaries, percentages, name precedence, mute and role state, privacy combinations, row shaping, glyphs, and ID lookup.
Runtime self-test passes.
Live checks confirm privacy, volume routes, sliders, mute, and default selection.
The popup uses shared controls and contains no audio card accent sliver.
---
id: NL-SPEC-5F4166AF
type: spec
title: Audio popup
---
# Audio popup
## Behavior
- The popup presents lowercase `output` and `input` sections backed by current PipeWire devices.
- Each device row shows a speaker or microphone state glyph, device name, volume slider, and percentage from 0% through 150%.
- Muted rows show a muted glyph and reduced emphasis.
- Default devices use selected card border and fill without an exposed accent sliver.
- Clicking or dragging a slider changes volume; middle click toggles mute.
- Selecting a device name makes it the default output or input.
- Empty sections remain valid.
- The bar privacy indicator reports microphone and camera activity with a lowercase label.
## Constraints
- PipeWire remains the authoritative audio boundary.
- Volume is clamped to 0 through 1.5.
- Missing names use a stable fallback; missing default devices produce no selected row.
- Existing audio, privacy, routing, and self-test IPC remains available.
- State retains consumed sinks, sources, streams, default IDs, privacy, and action results.
- State excludes backend narration and unused shader descriptions.
- Existing stream routing remains available, but no new routing UI is required.
## Acceptance
- Pure tests cover volume boundaries, percentages, name precedence, mute and role state, privacy combinations, row shaping, glyphs, and ID lookup.
- Runtime self-test passes.
- Live checks confirm privacy, volume routes, sliders, mute, and default selection.
- The popup uses shared controls and contains no audio card accent sliver.