--- 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.