When it comes to in-ear headphones, the neckband format is by far my personal favorite. While I have several Bluetooth headphones, my most liked in-ear one is the Fiio FH3: comfortable, great sound. But it’s cabled, and I do not like cables. So I got a Shanling MW200 for my FH3. And the FH3 still sound great!
But the MW200 blinks in blue which means it’s using the SBC audio codec when connecting to my Linux PC! Unacceptable!
It turns out that on an older Ubuntu version (20.04), the Bluetooth Codecs only support SBC. Not a big problem: PulseAudio 1.15 supports better codecs like aptX, AAC and LDAC. And it’s part of Ubuntu 21.10.
Time to upgrade from 20.04 to 21.10 then!
After doing the usual
❯ apt update
❯ apt upgrade
❯ do-release-update
I still only see SBC used: the MW200 blinks blue when it’s using it. If it was using another codec, it would blink in another color (e.g. green=LDAC or purple=aptX).
The fix is simple:
❯ add-apt-repository ppa:berglh/pulseaudio-a2dp
❯ apt update
❯ apt install pulseaudio-modules-bt libldac
Once done, you can see the codecs:
❯ pactl list
[...]
Card #4
Name: bluez_card.4C_00_00_00_00_24
Driver: module-bluez5-device.c
Owner Module: 29
Properties:
device.description = "Shanling MW200"
device.string = "4C:00:00:00:00:24"
device.api = "bluez"
device.class = "sound"
device.bus = "bluetooth"
device.form_factor = "headphone"
bluez.path = "/org/bluez/hci0/dev_4C_00_00_00_00_24"
bluez.class = "0x240418"
bluez.alias = "Shanling MW200"
device.icon_name = "audio-headphones-bluetooth"
Profiles:
headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
a2dp_sink_sbc: High Fidelity Playback (A2DP Sink: SBC) (sinks: 1, sources: 0, priority: 40, available: yes)
a2dp_sink_aac: High Fidelity Playback (A2DP Sink: AAC) (sinks: 1, sources: 0, priority: 40, available: yes)
a2dp_sink_aptx: High Fidelity Playback (A2DP Sink: aptX) (sinks: 1, sources: 0, priority: 40, available: yes)
a2dp_sink_aptx_hd: High Fidelity Playback (A2DP Sink: aptX HD) (sinks: 1, sources: 0, priority: 40, available: yes)
a2dp_sink_ldac: High Fidelity Playback (A2DP Sink: LDAC) (sinks: 1, sources: 0, priority: 40, available: yes)
off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
Active Profile: a2dp_sink_ldac
Ports:
headphone-output: Headphone (type: Unknown, priority: 0, latency offset: 0 usec, available)
Part of profile(s): headset_head_unit, a2dp_sink_sbc, a2dp_sink_aac, a2dp_sink_aptx, a2dp_sink_aptx_hd, a2dp_sink_ldac
headphone-input: Bluetooth Input (type: Unknown, priority: 0, latency offset: 0 usec, availability unknown)
Part of profile(s): headset_head_unit
Even better is that it’s very easy to change the codec via the volume control and clicking on the hamburger menu next to the Bluetooth headset:

And the MW200 now blinks in green (means it’s using not SBC, but LDAC)!
If anyone wonders: I cannot differentiate between aptX, aptX HD and LDAC. SBC sounds a bit duller though.