Профиль Bluetooth заблокирован для A2DP (высококачественный приемник звука), но не может измениться на HFP / HSP (двунаправленная минигарнитура низкого качества)

На ноутбуке Acer у меня никогда не было рабочей поддержки встроенного адаптера Bluetooth - https://bugs.launchpad.net/ubuntu/+source/linux-firmware/+bug/1643455 - и, наконец, набросил полотенце и купил дешевый USB-адаптер Bluetooth:

# 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

Под Windows 10 (двойная загрузка) все работает, включая встроенный адаптер Bluetooth и USB-ключ Bluetooth адаптер. У меня есть несколько гарнитур, которые поддерживают A2DP (только высококачественный аудиовыход) и HFP / HSP (низкокачественный двунаправленный вход и выход). Под Windows 10 правильный профиль Bluetooth выбирается автоматически, чтобы соответствовать приложению.

Обратите внимание, что я использую Gnome 3, а не Unity, в настоящее время в версии 3.26.2-0ubuntu0.1 (которая поставляется с Ubuntu 17.10).

В Ubuntu до 17.04 я мог вручную переключать гарнитуру между A2DP и ​​HFP / HSP из gnome-control-center. Bluetooth-гарнитуры, которые были сопряжены в более ранних версиях Ubuntu, таких как 16.04, продолжают корректно работать в более поздних версиях, так как Ubuntu была обновлена.

У меня были некоторые изменения в /etc/pulse/default.pa, которые позволили моей основной гарнитуре стать аудиоустройством по умолчанию (заменив встроенные динамики и микрофон на корпусе ноутбука), когда он был подключен. Я сделал это, раскомментировав и, следовательно, включив загрузку модуля «module-switch-on-connect» и вручную указав гарнитуру по уникальному идентификатору устройства в качестве источника по умолчанию и приемника по умолчанию:

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

Что не работа заключается в том, что Bluetooth-гарнитуры, недавно сопряженные с момента выпуска 17.04, заблокированы на A2DP и ​​не могут быть переключены. Оба профиля отображаются в соответствующем раскрывающемся списке в gnome-control-center, но выбор HFP / HSP не имеет никакого эффекта и не сохраняется. Фактически, выбор HFP / HSP и затем использование «Тестовых колонок» показывает левый и правый канал, доказывая, что устройство все еще находится в режиме A2DP (который является стерео), а не в режиме HFP / HSP (который является моно).

Вот пример выходных данных из «карт списка pactl», показывающих соответствующую гарнитуру Bluetooth:

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

Обратите особое внимание на блок «Профили», где «a2dp_sink» указан с «доступно: да» и "headset_head_unit" указан как "доступно: нет". Помните, что это не может происходить напрямую с устройства, потому что (1) эти гарнитуры работают должным образом в Windows 10 и (2) гарнитура той же модели работает правильно, если и только если она была сопряжена с более старой версией Ubuntu. Аналогичные результаты можно получить с четырьмя или пятью разными гарнитурами, поэтому я уверен, что они не являются дефектными.

Попытка установить профиль вручную удалась для A2DP, но не удалась для HFP / HSP с ошибкой:

# pactl set-card-profile 8 a2dp_sink
# pactl set-card-profile 8 headset_head_unit
Failure: Input/Output error

Я был бы удовлетворен тем, что эти гарнитуры навсегда заблокированы для HFP / HSP и никогда не использую A2DP, если необходимо, но я даже не могу понять, как это сделать.

3
задан 12 December 2017 в 18:33

2 ответа

В моем случае проблема была вызвана отсутствием драйвера.

Попробуйте

lsusb | grep Bluetooth

Если у вас чипсет серии Broadcom BCM20702AX, попробуйте

dmesg | grep -i bluetooth | grep -i firmware -A2

В моем случае отсутствовал драйвер, его можно найти здесь. Подробнее здесь

1
ответ дан 15 January 2020 в 13:46

EDIT: также попробуйте подключиться с помощью Blueman. Я не знаю, почему у PulseAudio так много проблем, но просто открыв Blueman, щелкнув правой кнопкой мыши мои наушники в обзоре и выбрав «Аудиопрофиль»> «Головное устройство гарнитуры (HSP/HFP)», я решил проблему. С тех пор я остановил и удалил oFono, и он все еще работает.


У меня была аналогичная (такая же?) проблема с моим Bose QC35 II, и я решил ее, следуя этим инструкциям («Использование HFP с oFono»).

Я использую Debian buster, так что у вас все может немного отличаться.

  1. Установите ofono и ofono-phonesim:

    sudo apt-get install ofono-phonesim
    
  2. Клонируйте Git-репозиторий oFono (в настоящее время cf850de632):

     git clone git://git.kernel.org/pub/scm/network/ofono/ofono.git
    компакт-диск фоно
    
  3. Список доступных модемов:

    ./test/list-modems
    
  4. Вероятно, в нем не будет модемов, что неудивительно для современного рабочего стола Linux.Но по причинам, которые я не совсем понимаю, вам действительно нужен какой-то модем, чтобы заставить наушники работать, поэтому мы собираемся смоделировать его сейчас.
    Начните с имитации одного (возможно, вы можете выбрать другой порт, если хотите):

    ofono-phonesim -p 12345 /usr/share/phonesim/default.xml
    
  5. Измените файл /etc/ofono/phonesim.conf, чтобы использовать этот симулированный модем. Моя версия Debian была так любезна, что уже что-то туда добавила, но закомментировала. Вот так это выглядит у меня сейчас (без комментариев):

    [телефонная сим-карта]
    Водитель=phonesim
    Адрес=127.0.0.1
    Порт=12345
    
  6. Перезапустить oFono:

    sudo service ofono перезапустить
    
  7. Убедитесь, что устройство появилось в списке:

    ./test/list-modems
    
  8. Включите устройство:

    ./test/enable-modem /phonesim
    

    Если вы получили подобное сообщение об ошибке, убедитесь, что ваш phonesim запущен и работает:

    Подключение модема/phonesim...
    Traceback (последний последний вызов):
    Файл "./test/enable-modem", строка 20, в 
    modem.SetProperty("Powered", dbus.Boolean(1), timeout = 120)
    Файл "/usr/lib/python3/dist-packages/dbus/proxy.py", строка 70, в __call__
    вернуть self._proxy_method(*аргументы, **ключевые слова)
    Файл "/usr/lib/python3/dist-packages/dbus/proxy.py", строка 145, в __call__
     **ключевые слова)
    Файл "/usr/lib/python3/dist-packages/dbus/connection.py", строка 651, в call_blocking
    сообщение, тайм-аут)
    dbus.exceptions.DBusException: org.ofono.Error.Failed: операция не удалась
    

    Убедитесь, что устройство теперь включено с помощью ./test/list-modems.

Надеюсь, теперь это работает! Возможно, вам придется перезапустить и другие службы (bluez, pulseaudio).

Теперь я могу выбрать наушники в качестве устройства ввода. Это приведет к тому, что устройство будет использовать звук очень низкого качества, но, по крайней мере, это работает. Обязательно переключитесь обратно на «Воспроизведение с высокой точностью (приемник A2DP)», когда закончите с микрофоном, иначе вы получите очень низкое качество звука.

11
ответ дан 1 April 2020 в 15:36

Другие вопросы по тегам:

Похожие вопросы: