Bluetooth on Linux: BlueZ, Profiles, and Why Your Headset Sounds Terrible
Bluetooth on Linux works better than its reputation suggests, and the problems people hit are mostly protocol constraints rather than Linux failings. Knowing which is which saves a lot of pointless configuration.
The stack
BlueZ provides the kernel drivers and the bluetoothd daemon. It handles pairing, connections, and profile negotiation.
PipeWire handles audio routing and codecs on top of it.
Your desktop settings panel and bluetoothctl are both front ends to the same daemon.
sudo systemctl status bluetooth
sudo systemctl enable --now bluetooth
Pairing from the command line
bluetoothctl
power on
agent on
default-agent
scan on
# wait for your device to appear, note its MAC
pair AA:BB:CC:DD:EE:FF
trust AA:BB:CC:DD:EE:FF
connect AA:BB:CC:DD:EE:FF
scan off
exit
trust is the step people omit. Without it the device may pair successfully and refuse to reconnect automatically afterwards.
The headset problem
This is the complaint, and it is not fixable in software.
Classic Bluetooth has separate profiles:
- A2DP is one-way, high quality, for listening
- HSP and HFP are two-way, narrowband, for calls
The radio cannot do both at once. The moment an application opens the microphone, the device switches to HFP and audio quality collapses to something resembling a telephone call. Ending the call switches it back.
LE Audio with the LC3 codec fixes this properly by carrying bidirectional high quality audio, and both the adapter and the headset must support it.
The practical workaround until then is a separate microphone. A wired or USB mic with Bluetooth headphones keeps A2DP active and sounds dramatically better on calls.
# See available profiles
pactl list cards | grep -A15 bluez
# Force A2DP
pactl set-card-profile bluez_card.AA_BB_CC_DD_EE_FF a2dp-sink
Codecs
PipeWire supports SBC, SBC-XQ, AAC, aptX, aptX HD, and LDAC, subject to device support.
# What is negotiated right now
pactl list sinks | grep -i codec
Higher-quality codecs mean higher latency, which is the tradeoff. LDAC in its highest quality mode sounds noticeably better and is noticeably more prone to dropouts in a congested 2.4GHz environment.
Common failures
Adapter missing entirely.
rfkill list
sudo rfkill unblock bluetooth
Soft blocked is the most common cause and often results from a laptop function key or a previous airplane mode toggle. If the adapter does not appear at all:
hciconfig -a
dmesg | grep -i bluetooth
lsusb | grep -i bluetooth
Firmware messages in dmesg usually mean an installable firmware package is missing.
Pairs but will not reconnect. Remove the pairing on both sides and start again:
bluetoothctl remove AA:BB:CC:DD:EE:FF
Many devices store only one pairing per slot, so pairing with a phone can silently unpair it from your laptop.
Connects then immediately drops. Frequently interference. Bluetooth and 2.4GHz wifi share spectrum, and a USB 3 port right next to the adapter is a known source of noise. Try a different port or a short extension cable.
Audio stutters. Try a lower-quality codec, move closer, or reduce 2.4GHz congestion. If your wifi is on 2.4GHz, moving it to 5GHz often fixes Bluetooth audio.
Useful commands
bluetoothctl devices # known devices
bluetoothctl info AA:BB:CC:DD:EE:FF # details and battery where supported
bluetoothctl disconnect AA:BB:CC:DD:EE:FF
# Battery level for supported devices
upower -i $(upower -e | grep -i bluetooth)
Auto-connect on boot
sudo nano /etc/bluetooth/main.conf
[Policy]
AutoEnable=true
That powers the adapter on at boot. Trusted devices then reconnect when they are switched on, which is the behaviour most people expect and do not get by default.
Frequently Asked Questions
Why does my headset sound bad when I use the microphone?
Classic Bluetooth cannot carry high quality audio and a microphone stream at the same time. Using the mic switches the device to the HSP or HFP profile, which is narrowband and sounds like a telephone. It is a protocol limitation, not a Linux one.
What is BlueZ?
The Bluetooth stack on Linux, providing the kernel drivers and the userspace daemon that handles pairing, connections, and profiles. Desktop settings panels and bluetoothctl are both front ends to it.
Does Linux support aptX and LDAC?
Yes. PipeWire supports SBC, AAC, aptX, aptX HD, and LDAC where the hardware and the device both support them. Older PulseAudio setups were more limited, which is where the reputation for poor codec support comes from.
Why does my device pair but not reconnect?
Often a stale pairing record on one side, or the device is paired with another host and only holds one. Remove the pairing on both ends and pair again, and check whether the device supports multipoint.
How do I fix a Bluetooth adapter that does not appear at all?
Check whether it is soft blocked with rfkill list, which is the most common cause. If the adapter is not listed by hciconfig or bluetoothctl at all, it is a missing firmware or driver problem rather than a configuration one.
Is Bluetooth audio latency a problem for video?
Yes, and it is inherent to the protocol. Latency is typically well over a hundred milliseconds, enough to notice lip sync drift. Most video players can compensate with an audio delay setting, and aptX Low Latency reduces it where supported.