Bluetooth Earbuds
Quick start
- Install packages (Arch/Garuda):
run0 pacman -S --needed bluez bluez-utils blueman - Enable service:
run0 systemctl enable --now bluetooth.service - Unblock radio:
run0 rfkill unblock bluetooth - Check controller:
bluetoothctl show
Pairing workflow (recommended)
- Put earbuds into real pairing mode (not only open case).
- Ensure phone is disconnected from earbuds.
- Run:
bluetoothctlagent ondefault-agentscan onpair <MAC>trust <MAC>connect <MAC>
- Verify:
bluetoothctl info <MAC>should showPaired: yesandConnected: yes.
Common failures and fixes
-
org.bluez.Error.InProgress- Cause: stale pairing session.
- Fix:
cancel-pairing <MAC>then retrypair <MAC>.
-
org.bluez.Error.AuthenticationCanceled- Cause: earbuds left pairing mode or switched to phone.
- Fix: re-enter pairing mode, disconnect phone side, retry.
-
org.bluez.Error.Failed br-connection-canceled- Cause: BR/EDR audio channel canceled.
- Fix order:
disconnect <MAC>bearer <MAC> bredrconnect <MAC> 0000110b-0000-1000-8000-00805f9b34fb
Audio routing
Detect Bluetooth card/sinks:
pactl list cards short | rg bluez_cardpactl list sinks short | rg bluez_outputpactl list sources short | rg bluez_input
Switch profiles:
- High quality output:
pactl set-card-profile <bluez_card> a2dp-sink - Call mode with mic:
pactl set-card-profile <bluez_card> headset-head-unit
Set defaults:
pactl set-default-sink <sink_name>pactl set-default-source <source_name>- Move active playback streams:
pactl list sink-inputs short | awk '{print $1}' | xargs -r -I{} pactl move-sink-input {} <sink_name>
Name display notes
- Linux tools usually show standard Bluetooth fields only.
- Some vendors publish random alias before pairing.
- After pairing, run
info <MAC>again; if still unclear, set local alias:set-alias "My Earbuds"
Repo-specific integration
This repo already contains:
hyprland/scripts/waybar-bluetooth.sh(Waybar status module)hyprland/scripts/audio-route-menu.sh(A2DP/HFP/speaker menu)hyprland/waybar/configcustom modulecustom/bluetooth
When user asks for UI-based route switching, prefer invoking/patching these scripts instead of rebuilding from scratch.