Bluetooth profile locked to A2DP (high-quality audio sink) but cannot change to HFP/HSP (low-quality bidirectional headset)

15,405

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.

  1. Install ofono and ofono-phonesim:

    sudo apt-get install ofono-phonesim
    
  2. Clone the oFono Git repository (currently at cf850de632):

    git clone git://git.kernel.org/pub/scm/network/ofono/ofono.git
    cd ofono
    
  3. List the available modems you have:

    ./test/list-modems
    
  4. 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
    
  5. 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
    
  6. Restart oFono:

    sudo service ofono restart
    
  7. Check that the device is now listed:

    ./test/list-modems
    
  8. 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

Share:
15,405

Related videos on Youtube

Mike
Author by

Mike

Updated on September 18, 2022

Comments

  • Mike
    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
      Jeremy31 over 6 years
      Does setting the profile to off work?
    • Mike
      Mike over 6 years
      Yes, "off" works and returns no error message.
    • Jeremy31
      Jeremy31 over 6 years
      Try changing to off, disconnect, reconnect and see if you can switch to HFP/HSP mode
    • Ondra Žižka
      Ondra Žižka over 6 years
      Did you figure out? There's also this askubuntu.com/questions/952342/…
    • Ondra Žižka
      Ondra Žižka over 6 years
      And since you seem to understand the matter quite a lot, could you please have a look at askubuntu.com/questions/1004712/…
    • Mike
      Mike over 6 years
      I 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
      CryptoRex almost 3 years
      There 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-w‌​ireless-earbuds-not-‌​working-on-ubuntu-20‌​/ Hope this helps
  • ton
    ton over 3 years
    Great 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
    ton over 3 years
    A good reference to this topic: merge request on pulseaudio.