Back to plugins
Audio Switcher
v0.3.0 blackbartblues

About

Audio Switcher

Audio Switcher puts PipeWire inputs, outputs, volume controls, and Bluetooth audio handoff in one compact Noctalia panel. Devices can be renamed or hidden, multiple outputs can be grouped for simultaneous playback, and compositor keybinds can cycle devices or connect a specific Bluetooth device by its persistent number.

Audio Switcher panel

Add the Audio Switcher widget from Noctalia's bar editor. Left click opens the panel, right click cycles through visible outputs, and middle click cycles through visible inputs. Scrolling over it changes the output volume.

Plugin

Field Value
ID blackbartblues/audio-switcher
Entries Widget: widget; panel: audio-switcher; service: service

Requirements

Install pactl, bluetoothctl, and sleep on PATH. On Arch Linux they are provided by the libpulse, bluez-utils, and coreutils packages respectively. PipeWire's PulseAudio compatibility service and BlueZ must be running. Output grouping also requires PulseAudio's or PipeWire Pulse's module-combine-sink.

Usage

Open the panel from a configured bar widget or run:

noctalia msg panel-toggle blackbartblues/audio-switcher:audio-switcher

The top sliders control the default output and input volume. Select Outputs or Inputs, then choose Use. For a disconnected Bluetooth output the same button connects it, waits for its PipeWire endpoint, makes it the default, and moves current playback streams to it.

Use the pencil button to set a local display name, choose the device icon, and change a Bluetooth keybind number. The number is assigned automatically after a device connects successfully for the first time and can then be changed. Hidden devices remain available in the panel but are skipped by cycling commands.

To play through multiple outputs at once, open Outputs, choose Group outputs, select at least two available physical outputs, then choose Create group. The combined output becomes the default and current playback streams move to it. Use Disband on its row to remove it; if it is active, playback moves to the first available member before removal.

Use the settings button in the panel header to open Noctalia's plugin settings.

Settings

Entry Setting Type Default Description
Plugin show_percentage bool true Show the output volume beside the bar icon; disable it for an icon-only widget.
Plugin show_notification_on_switch bool true Show a notification when switching device.
Plugin show_actions_in_tooltip bool true Show actions in tooltip.
Plugin scroll_step int 5 Volume points changed by each wheel step over the bar widget (1–25).

IPC and keybinds

The background service exposes commands that can be used by any compositor:

# Next non-hidden output. Disconnected Bluetooth outputs are connected as needed.
noctalia msg plugin blackbartblues/audio-switcher:service all cycle-output

# Next non-hidden, currently available input.
noctalia msg plugin blackbartblues/audio-switcher:service all cycle-input

# Connect the Bluetooth device assigned to number 2 and use its output.
noctalia msg plugin blackbartblues/audio-switcher:service all connect 2

# Refresh device state.
noctalia msg plugin blackbartblues/audio-switcher:service all refresh

For example, Niri bindings can spawn the commands directly:

Mod+F9  { spawn "noctalia" "msg" "plugin" "blackbartblues/audio-switcher:service" "all" "cycle-output"; }
Mod+F10 { spawn "noctalia" "msg" "plugin" "blackbartblues/audio-switcher:service" "all" "cycle-input"; }
Mod+1   { spawn "noctalia" "msg" "plugin" "blackbartblues/audio-switcher:service" "all" "connect" "1"; }

Equivalent Hyprland bindings:

bind = SUPER, F9, exec, noctalia msg plugin blackbartblues/audio-switcher:service all cycle-output
bind = SUPER, F10, exec, noctalia msg plugin blackbartblues/audio-switcher:service all cycle-input
bind = SUPER, 1, exec, noctalia msg plugin blackbartblues/audio-switcher:service all connect 1

Notes

Preferences are written to preferences.json in Noctalia's data directory for this plugin. They contain only aliases, hidden flags, remembered Bluetooth input capabilities, MAC addresses, keybind numbers, and per-device icon choices.

Before connecting a requested Bluetooth audio device, Audio Switcher disconnects other Bluetooth audio devices connected to this computer. It cannot disconnect the target from another computer or phone; that device must release the target first unless it supports multipoint connections.

Output groups are module-combine-sink instances owned by the running audio server. Audio Switcher rediscovers its groups after the plugin service restarts, but they disappear if PipeWire/PulseAudio restarts. Combining outputs may add latency and resampling CPU cost, especially when the devices use different clocks or sample rates.

The plugin does not access the network. Its service spawns only the declared pactl, bluetoothctl, and sleep commands. The short sleep is used while waiting for a newly connected Bluetooth endpoint to appear. The panel may also invoke the local Noctalia executable to open the plugin settings page.

Versions

VersionPlugin APIUpdated
v0.3.0 latest9Jul 30, 2026
v0.1.0 5Jul 23, 2026

Older versions stay installable on a Noctalia release whose plugin API is below the latest version's.