====== What? ======
Just some notes around the Sony WH-1000XM2
* pro: wireless: bluetooth profiles for headset and High Fidelity playback (A2DP)
* pro: quite good noise cancelling
* pro: build in rechargable battery
* con: when the cable is used, only headphone functionality is available. No microphone signal goes over the analog cable.
* con: after 60min of wearing, I need to take the headset off
===== Links =====
* [[https://www.youtube.com/watch?v=VnzIIhLNHqg|Queen - Bohemian Rhapsody - AUDIO 3DD]]
* [[https://lineageos.org/engineering/Bluetooth-SBC-XQ/|LineageOS implements now SBC XQ, comparable to aptX and aptX HD]]
* https://wiki.archlinux.org/index.php/PipeWire -- Archlinux great PipeWire docs
* [[/hardwarerelated/headset/sony_wh-1000xm2_pa|Sony WH-1000XM2 pulseaudio notes]] (newer distros have pipewire)
====== Bluetooth profiles ======
As of Fedora34 with pipewire, following bluetooth profiles which are supported on Fedora34 can also be used with the Sony WH-1000XM2. First is the name as seen in 'pactl list cards', then a description.
* **These modes provide pure audio, and do not transport the microphone signal to the computer**
* a2dp-sink: High Fidelity Playback (A2DP Sink), good audio quality
* a2dp-sink-sbc: High Fidelity Playback (A2DP Sink, codec SBC), good audio quality
* a2dp-sink-sbc_xq: High Fidelity Playback (A2DP Sink, codec SBC-XQ), better audio quality
* a2dp-sink-aac: High Fidelity Playback (A2DP Sink, codec AAC), better audio quality
* a2dp-sink-ldac: High Fidelity Playback (A2DP Sink, codec LDAC), best audio quality
* **These modes provide audio + micro channel, so for example useful for chats and conferences**
* headset-head-unit: Headset Head Unit (HSP/HFP), bad quality
* headset-head-unit-cvsd: Headset Head Unit (HSP/HFP, codec CVSD), bad quality, 16KHz/16 bit
* headset-head-unit-msbc: Headset Head Unit (HSP/HFP, codec mSBC), better quality, 48KHz/16 bit
"Hands-Free Profile (HFP) Version 1.6 adds optional support for wide band speech with the mSBC codec, a 16 kHz monaural configuration of the SBC codec mandated by the A2DP profile." That is usable on Fedora34, it was implemented in Pulsaudio 15 and pipewire 0.3.23. For headset-head-unit-msbc, it might be required to modify a config file as follows:
$ mkdir -p /etc/pipewire/media-session.d/
$ cp /usr/share/pipewire/media-session.d/bluez-monitor.conf /etc/pipewire/media-session.d/
$ vi /etc/pipewire/media-session.d/bluez-monitor.conf
### set this:
bluez5.msbc-support = true
bluez5.sbc-xq-support = true
===== Fedora 34 and later / pipewire based setups =====
### Let's install the required packages.
$ sudo dnf install -y pipewire-alsa pipewire-pulseaudio pipewire
### Now ensure dbus and pipewire are running as your user, and enabled.
$ systemctl --user restart dbus pipewire-pulse pipewire
$ systemctl --user enable dbus pipewire-pulse pipewire
$ systemctl --user status dbus pipewire-pulse pipewire
$ sudo systemctl status bluetooth.service
$ bluetoothctl
Agent registered
[CHG] Controller XX:XX:XX:XX:XX:B7 Pairable: yes
[LE_WH-1000XM2]# scan on
Discovery started
[CHG] Controller XX:XX:XX:XX:XX:B7 Discovering: yes
[CHG] Device XX:XX:XX:XX:XX:85 RSSI: -48
[CHG] Device XX:XX:XX:XX:XX:85 TxPower: 4
[CHG] Device XX:XX:XX:XX:XX:85 Name: WH-1000XM2
[CHG] Device XX:XX:XX:XX:XX:85 Alias: WH-1000XM2
[NEW] Device XX:XX:XX:XX:XX:6D XX:XX:XX:XX:XX:6D
[LE_WH-1000XM2]# trust XX:XX:XX:XX:XX:85
Changing XX:XX:XX:XX:XX:85 trust succeeded
[LE_WH-1000XM2]# connect XX:XX:XX:XX:XX:85
Attempting to connect to XX:XX:XX:XX:XX:85
Connection successful
[CHG] Device XX:XX:XX:XX:XX:85 RSSI: -59
[CHG] Device XX:XX:XX:XX:XX:85 Name: LE_WH-1000XM2
$ sudo bluetoothctl
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on
[NEW] Device XX:XX:XX:XX:XX:XX WH-1000XM2
[bluetooth]# scan off
[bluetooth]# trust XX:XX:XX:XX:XX:XX
[bluetooth]# pair XX:XX:XX:XX:XX:XX
Attempting to pair with XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: ...
[CHG] Device XX:XX:XX:XX:XX:XX UUIDs: ...
[CHG] Device XX:XX:XX:XX:XX:XX Paired: yes
Pairing successful
[CHG] Device XX:XX:XX:XX:XX:XX Connected: no
[bluetooth]# connect XX:XX:XX:XX:XX:XX
Attempting to connect to XX:XX:XX:XX:XX:XX
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
Connection successful
[bluetooth]# quit
### Which codec is currently active?
$ pactl info
$ pactl list sinks
[..]
Sink #199
[..]
Description: WH-1000XM2
Driver: PipeWire
Sample Specification: s16le 2ch 48000Hz
[..]
Properties:
api.bluez5.transport = ""
api.bluez5.profile = "a2dp-sink"
api.bluez5.codec = "sbc"
[..]
OR
api.bluez5.codec = "aac" (aac codec, high quality)
OR
api.bluez5.codec = "ldac" (for low latency)
OR
api.bluez5.codec = "cvsd" (for headset use, with micro on)
### Change profile, way 1
$ sudo dnf install -y pavucontrol
$ pavucontrol
### Change profile, way 2
$ pactl list cards
Card #197
Name: bluez_card.70_26_05_9D_31_85
Driver: module-bluez5-device.c
Owner Module: n/a
Properties:
[..]
Profiles:
off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
a2dp-sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 0, available: yes)
headset-head-unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 0, available: yes)
a2dp-sink-sbc: High Fidelity Playback (A2DP Sink, codec SBC) (sinks: 1, sources: 0, priority: 0, available: yes)
a2dp-sink-aac: High Fidelity Playback (A2DP Sink, codec AAC) (sinks: 1, sources: 0, priority: 0, available: yes)
a2dp-sink-ldac: High Fidelity Playback (A2DP Sink, codec LDAC) (sinks: 1, sources: 0, priority: 0, available: yes)
headset-head-unit-cvsd: Headset Head Unit (HSP/HFP, codec CVSD) (sinks: 1, sources: 1, priority: 0, available: yes)
headset-head-unit-msbc: Headset Head Unit (HSP/HFP, codec mSBC) (sinks: 1, sources: 1, priority: 0, available: yes)
Active Profile: a2dp-sink-ldac
[..]
$ pactl set-card-profile bluez_card.70_26_05_9D_31_85 a2dp-sink-sbc
===== Errors & solutions =====
== Problem ==
* 'blueman-applet' says when trying to connect to the headset "protocol not available.
* bluetoothctl reports this:
[chris@電脳 ~]$ bluetoothctl
Agent registered
[CHG] Controller 34:E1:2D:7C:61:B7 Pairable: yes
[bluetooth]# scan on
Discovery started
[CHG] Controller 34:E1:2D:7C:61:B7 Discovering: yes
[..]
[CHG] Device 70:26:05:9D:31:85 Name: LE_WH-1000XM2
[CHG] Device 70:26:05:9D:31:85 Alias: LE_WH-1000XM2
[bluetooth]# trust 70:26:05:9D:31:85
Changing 70:26:05:9D:31:85 trust succeeded
[NEW] Device 4D:E9:CA:BF:05:3B 4D-E9-CA-BF-05-3B
[bluetooth]# connect 70:26:05:9D:31:85
Attempting to connect to 70:26:05:9D:31:85
Failed to connect: org.bluez.Error.Failed
* When trying to connect in 'blueman-applet', error "unknown protocol" appears, and "systemctl status bluetooth.service" reports:
bluetoothd[23]: src/service.c:btd_service_connect() a2dp-sink profile connect failed for 70:26:05:9D:31:85: Protocol not available
bluetoothd[23]: src/service.c:btd_service_connect() a2dp-sink profile connect failed for 70:26:05:9D:31:85: Protocol not available
== Solution 1 (pulseaudio based setups only) ==
* Ensure package pulseaudio-module-bluetooth-freeworld or pulseaudio-module-bluetooth is installed.
* If you installed the package after starting pulseaudio or your Xorg session, then do this as user:
killall pulseaudio
pulseaudio --start
== Solution 2 ==
Install package blueman and run 'blueman-manager', for me that frontend was able to connect when 'bluetoothctl' could not.