Bluetooth profile locked to A2DP (high-quality audio sink) but cannot change to HFP/HSP (low-quality bidirectional headset)
Solution 1
EDIT: also try connecting using Blueman. I don't know why PulseAudio has so much trouble but simply opening Blueman, right-clicking on my headphones in the overview, and selecting Audio Profile > Headset Head Unit (HSP/HFP) fixed it for me. I have since stopped and removed oFono and it still seems to work.
I had a similar (the same?) problem with my Bose QC35 II and fixed it by following these instructions ("Using HFP with oFono").
I'm on Debian buster so things might be a little bit different for you.
-
Install
ofono
andofono-phonesim
:sudo apt-get install ofono-phonesim
-
Clone the oFono Git repository (currently at cf850de632):
git clone git://git.kernel.org/pub/scm/network/ofono/ofono.git cd ofono
-
List the available modems you have:
./test/list-modems
-
It'll probably have no modems, which is not surprising on a modern Linux desktop. But for reasons I don't really understand you really do need to have some sort of modem to get headphones to work, so we're going to simulate one now.
Start by simulating one (you can probably pick a different port if you want):ofono-phonesim -p 12345 /usr/share/phonesim/default.xml
-
Modify /etc/ofono/phonesim.conf to use this simulated modem. My Debian version was so kind to put something in there already but commented it out. This is what it looks like for me now (without the comments):
[phonesim] Driver=phonesim Address=127.0.0.1 Port=12345
-
Restart oFono:
sudo service ofono restart
-
Check that the device is now listed:
./test/list-modems
-
Enable the device:
./test/enable-modem /phonesim
If you get an error like this, make sure your phonesim is up and running:
Connecting modem /phonesim... Traceback (most recent call last): File "./test/enable-modem", line 20, in <module> modem.SetProperty("Powered", dbus.Boolean(1), timeout = 120) File "/usr/lib/python3/dist-packages/dbus/proxies.py", line 70, in __call__ return self._proxy_method(*args, **keywords) File "/usr/lib/python3/dist-packages/dbus/proxies.py", line 145, in __call__ **keywords) File "/usr/lib/python3/dist-packages/dbus/connection.py", line 651, in call_blocking message, timeout) dbus.exceptions.DBusException: org.ofono.Error.Failed: Operation failed
Check that the device is now powered on using
./test/list-modems
.
Hopefully it works now! You may need to restart other services too (bluez, pulseaudio).
I can now pick my headphone as an input device. It will cause the device to use very low quality audio but at least it works. Make sure to switch back to "High Fidelity Playback (A2DP Sink)" when you're done with the microphone as you'll otherwise get very low quality audio output.
Solution 2
In my case the problem was caused by a missing driver.
Try
lsusb | grep Bluetooth
If your chipset is a Broadcom BCM20702AX
series, then try
dmesg | grep -i bluetooth | grep -i firmware -A2
In my case, driver was missing and you can find it here. More info here
Related videos on Youtube
Mike
Updated on September 18, 2022Comments
-
Mike over 1 year
On an Acer laptop, I have never had working support for the built-in Bluetooth adapter -- https://bugs.launchpad.net/ubuntu/+source/linux-firmware/+bug/1643455 -- and finally threw in the towel and bought a cheap USB Bluetooth dongle:
# lsusb -v -d 0a12:0001 Bus 002 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 224 Wireless bDeviceSubClass 1 Radio Frequency bDeviceProtocol 1 Bluetooth bMaxPacketSize0 64 idVendor 0x0a12 Cambridge Silicon Radio, Ltd idProduct 0x0001 Bluetooth Dongle (HCI mode) bcdDevice 88.91 iManufacturer 0 iProduct 2 CSR8510 A10 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 177 bNumInterfaces 2 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xe0 Self Powered Remote Wakeup MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 3 bInterfaceClass 224 Wireless bInterfaceSubClass 1 Radio Frequency bInterfaceProtocol 1 Bluetooth iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0010 1x 16 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 224 Wireless bInterfaceSubClass 1 Radio Frequency bInterfaceProtocol 1 Bluetooth iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0000 1x 0 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0000 1x 0 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 1 bNumEndpoints 2 bInterfaceClass 224 Wireless bInterfaceSubClass 1 Radio Frequency bInterfaceProtocol 1 Bluetooth iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0009 1x 9 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0009 1x 9 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 2 bNumEndpoints 2 bInterfaceClass 224 Wireless bInterfaceSubClass 1 Radio Frequency bInterfaceProtocol 1 Bluetooth iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0011 1x 17 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0011 1x 17 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 3 bNumEndpoints 2 bInterfaceClass 224 Wireless bInterfaceSubClass 1 Radio Frequency bInterfaceProtocol 1 Bluetooth iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0019 1x 25 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0019 1x 25 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 4 bNumEndpoints 2 bInterfaceClass 224 Wireless bInterfaceSubClass 1 Radio Frequency bInterfaceProtocol 1 Bluetooth iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0021 1x 33 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0021 1x 33 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 1 bAlternateSetting 5 bNumEndpoints 2 bInterfaceClass 224 Wireless bInterfaceSubClass 1 Radio Frequency bInterfaceProtocol 1 Bluetooth iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0031 1x 49 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0031 1x 49 bytes bInterval 1 Device Status: 0x0001 Self Powered
Under Windows 10 (dual-boot) everything works, including the built-in Bluetooth adapter and the USB dongle Bluetooth adapter. I have a bunch of headsets that support both A2DP (high-quality audio output only) and HFP/HSP (low-quality bidirectional input and output). Under Windows 10, the correct Bluetooth profile is chosen automatically to be consistent with the application.
Note that I am running Gnome 3, not Unity, currently at version 3.26.2-0ubuntu0.1 (which is stock with Ubuntu 17.10).
Under Ubuntu before 17.04, I could manually switch a headset between A2DP and HFP/HSP easily from gnome-control-center. Bluetooth headsets that had been paired under earlier versions of Ubuntu, such as 16.04, continue to work correctly under later versions as Ubuntu was upgraded.
I had some modifications in /etc/pulse/default.pa that allowed my main headset to become the default audio device (replacing the built-in speakers and microphone on the laptop case) when it was connected. I did this by uncommenting and therefore enabling the loading of module "module-switch-on-connect" and manually specifying the headset by unique device identifier as the default source and default sink:
set-default-sink bluez_sink.16_07_12_21_09_4B.headset_head_unit set-default-source bluez_sink.16_07_12_21_09_4B.headset_head_unit
What does not work is that Bluetooth headsets newly paired since 17.04 was released are locked to A2DP and cannot be switched. Both profiles show up in the appropriate pulldown in gnome-control-center, but selecting HFP/HSP has no effect and is not retained. In fact, selecting HFP/HSP and then using "Test speakers" shows a left and a right channel, proving that the device is still in A2DP mode (which is stereo) rather than HFP/HSP mode (which is mono).
Here is an example of output from "pactl list cards" showing the relevant Bluetooth headset:
Name: bluez_card.FB_60_AD_59_5B_9E Driver: module-bluez5-device.c Owner Module: 33 Properties: device.description = "Premium Earbuds" device.string = "FB:60:AD:59:5B:9E" device.api = "bluez" device.class = "sound" device.bus = "bluetooth" device.form_factor = "hands-free" bluez.path = "/org/bluez/hci0/dev_FB_60_AD_59_5B_9E" bluez.class = "0x240408" bluez.alias = "Premium Earbuds" device.icon_name = "audio-handsfree-bluetooth" device.intended_roles = "phone" Profiles: a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 10, available: yes) headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 20, available: no) off: Off (sinks: 0, sources: 0, priority: 0, available: yes) Active Profile: a2dp_sink Ports: handsfree-output: Handsfree (priority: 0, latency offset: 0 usec) Part of profile(s): a2dp_sink, headset_head_unit handsfree-input: Handsfree (priority: 0, latency offset: 0 usec, not available) Part of profile(s): headset_head_unit
Note especially the "Profiles" block where "a2dp_sink" is listed with "available: yes" and "headset_head_unit" is listed with "available: no". Remember, this cannot be coming directly from the device because (1) these headsets work as expected under Windows 10 and (2) the same model headset works correctly if and only if it was paired under an older version of Ubuntu. Identically results are experienced with four or five different headsets, so I'm confident they are not defective.
Trying to set the profile manually succeeds for A2DP but fails for HFP/HSP with an error:
# pactl set-card-profile 8 a2dp_sink # pactl set-card-profile 8 headset_head_unit Failure: Input/Output error
I would be satisfied with getting these headsets permanently locked to HFP/HSP and never using A2DP if necessary, but I can't figure out even how to do that.
-
Jeremy31 over 6 yearsDoes setting the profile to off work?
-
Mike over 6 yearsYes, "off" works and returns no error message.
-
Jeremy31 over 6 yearsTry changing to off, disconnect, reconnect and see if you can switch to HFP/HSP mode
-
Ondra Žižka over 6 yearsDid you figure out? There's also this askubuntu.com/questions/952342/…
-
Ondra Žižka over 6 yearsAnd since you seem to understand the matter quite a lot, could you please have a look at askubuntu.com/questions/1004712/…
-
Mike over 6 yearsI never found a solution, but I gave up for a while after hitting a dead end and have resorted to the workaround of using a wired headset with my laptop. That was annoying because the laptop has a single jack audio connector wired TRRS, like a cellular telephone.
-
CryptoRex almost 3 yearsThere main reason the HFP profile is not available is the Pulseaudio drivers have removed support for it. Any Bluetooth device can now only connect via A2DP configuration which does not support on-device microphone. I myself had the same problem and had spend around a week to figure out the solution that works without much hassle. You can follow the instruction mentioned at https://eternalgeek.in/index.php/2021/06/13/solving-mic-of-wireless-earbuds-not-working-on-ubuntu-20/ Hope this helps
-
-
ton over 3 yearsGreat answer. I confirm it worked on Anker SoundLife Q20 on ubuntu 19.10 ... But the headset audio turns mono when using headset profile
pactl set-card-profile 5 headset_head_unit
. the mic works. -
ton over 3 yearsA good reference to this topic: merge request on pulseaudio.