Bluetooth headset (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Bluetooth headset. Дата последней синхронизации: 4 декабря 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

На данный момент Arch Linux поддерживает профиль A2DP (Аудио выход) для беспроводного проигрывания аудио прямо с обычной установкой.

Наушники через Pipewire

PipeWire выступает прямой заменой PulseAudio и даёт лёгкий способ установки Bluetooth-наушников. Он имеет поддержку A2DP-профилей из коробки с использованием кодеков SBC/SBC-XQ, AptX, LDAC или AAC, а также HFP/HSP.

Установите пакет pipewire-pulse (который заменяет pulseaudio и pulseaudio-bluetooth).

Демон запустится автоматически как пользовательская служба. Используйте pavucontrol или настройки вашего окружения рабочего стола для конфигурации. Подробее смотрите PipeWire (Русский)#Bluetooth устройства.

Отчёт об уровне заряда батареи

Чтобы узнать текущий заряд батареи ваших наушников, демон bluetoothd должен быть запущен с экспериментальными возможностями.

Это можно сделать, создав замещение файла юнита bluetooth.service и дописав в строке ExecStart опцию -E. После его создания перезапустите службу.

В качестве альтернативы можно создать drop-in файл для службы bluetooth.service со следующим содержимым:

/etc/systemd/system/bluetooth.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/bluetoothd --experimental

После его создания перезапустите службу.

Наушники через Bluez5/PulseAudio

Установите пакеты pulseaudio-alsa, pulseaudio-bluetooth и bluez-utils — последний предоставляет инструмент bluetoothctl.

Примечание: Перед продолжением убедитесь, что Bluetooth-устройство не заблокировано через rfkill.

Настройка через командную строку

Запустите службу bluetooth.service.

Мы будем использовать утилиту командноу строки bluetoothctl для сопряжения и подключения. Более детальное описание и решение проблем смотрите в основной статье Bluetooth (Русский).

Запустите bluetoothctl:

$ bluetoothctl

Вы попадёте в его командную строку. Затем введите:

[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on

Теперь переведите ваши наушники в режим сопряжения, и компьютер вскоре должен обнаружить её. Например,

[NEW] Device 00:1D:43:6D:03:26 Lasmex LBT10

показывает устройство с названием "Lasmex LBT10" и MAC-адресом "00:1D:43:6D:03:26". Мы будем использовать этот MAC-адрес для инициации сопряжения:

[bluetooth]# pair 00:1D:43:6D:03:26

После сопряжения нужно явно подключить устройство (если это не работает, попробуйте команду trust перед попыткой подключения):

[bluetooth]# connect 00:1D:43:6D:03:26

Если возникает ошибка org.bluez.Error.Failed, попробуйте ещё раз, предварительно завершив демон PulseAudio:

$ pulseaudio -k
[bluetooth]# connect 00:1D:43:6D:03:26

Наконец, если вы хотите автоматически подключаться к этому устройству в будущем:

[bluetooth]# trust 00:1D:43:6D:03:26

Если всё работает корректно, вы увидите отдельное устройство вывода в PulseAudio.

Примечание: Устройство может быть отключено по умолчанию. Выберите профиль аудио (OFF, A2DP, HFP) на вкладке «Конфигурация» в pavucontrol.

Теперь можно направить любое аудио на это устройство на вкладках «Проигрывание» и «Запись» в pavucontrol.

Теперь вы можете остановить сканирование и выйти из программы:

[bluetooth]# scan off
[bluetooth]# exit

Автоподключение

Чтобы наушники автоматически подключались, нужно включить PulseAudio-модуль switch-on-connect. Добавьте следующие строки в /etc/pulse/default.pa:

/etc/pulse/default.pa
### Automatically switch to newly-connected devices
load-module module-switch-on-connect
Примечание:

Мультимедийные кнопки

Для использования мультимедийных кнопок они могут быть перенаправлены в MPRIS, где их подхватят плееры, поддерживающие MPRIS для управления. Подробнее смотрите MPRIS#Bluetooth.

Настройка через GNOME Bluetooth

Примечание: Профиль A2DP не будет активироваться этим способом на pulseaudio 9/10 из-за бага, что приведёт к низкокачественному моно-звуку. Для возможного решения смотрите #A2DP не работает с PulseAudio.

Вы можете использовать графический фронтенд GNOME Bluetooth для лёгкой настройки наушников.

Сперва убедитесь, что служба bluetooth.service запущена.

Откройте GNOME Bluetooth и активируйте bluetooth. После сканирования устройств вы можете подключиться к наушникам, выбрав их в списке устройств. Вы можете получить доступ к настройкам звука из меню устройства. После подключения устройства в настройках звука должен появиться новый аудиовыход.

LDAC/aptX

Поддержку кодеков LDAC/aptX можно включить установкой пакетов pulseaudio-modules-btAUR[ссылка недействительна: package not found] и libldac и перезапуском PulseAudio. Смотрите подсказки по настройке на странице проекта. Вы можете проверить используемый кодек с помощью команды:

$ pactl list | grep a2dp_codec

Решение проблем

Примечание: У многих пользователей возникают проблемы при попытках добиться работы A2DP/Bluetooth наушников. Подробнее смотрите #Переключение между HSP/HFP и A2DP.

Плохой звук / Постоянный шум / «Мутный» звук

Плохое качество звука скорее всего связано с тем, что не выбран правильный профиль. Смотрите #Переключение между HSP/HFP и A2DP для решения проблемы.

Профиль выбран, но наушники неактивны и звук не может быть перенаправлен

Это меню обманчиво доступно ещё до подключения устройства; пока оно не подключено, это меню не будет иметь никакого эффекта. Кажется, меню создаётся сразу после определения устройства.

Запустите bluetoothctl как root и подключите устройство вручную.

Сопряжение не удаётся с ошибкой AuthenticationFailed

Попробуйте включить или отключить SSPMode:

# btmgmt ssp off

или

# btmgmt ssp on

Может понадобиться выключить Bluetooth на время выполнения этой команды.

Сопряжение работает, но соединение не удаётся

Вы можете увидеть такую ошибку в bluetoothctl:

[bluetooth]# connect 00:1D:43:6D:03:26
Attempting to connect to 00:1D:43:6D:03:26
Failed to connect: org.bluez.Error.Failed

Для изучения проверьте статус bluetooth.service или гляньте журнал:

# journalctl -n 20

Там может оказаться примерно такое сообщение:

bluetoothd[5556]: a2dp-sink profile connect failed for 00:1D:43:6D:03:26: Protocol not available

Это может быть из-за того, что pulseaudio-bluetooth не установлен (или pulseaudio-modules-bt-gitAUR[ссылка недействительна: package not found] нужно переустановить с нуля). Установите и затем перезапустите PulseAudio.

Это также может быть из-за проблем с правами доступа, особенно если запуск PulseAudio от root решает проблему. Добавьте своего пользователя в группу lp и перезапустите PulseAudio. Смотрите /etc/dbus-1/system.d/bluetooth.conf для справки.

Если перезапуск PulseAudio не помогает, возможно, требуется загрузить module-bluetooth-discover.

# pactl load-module module-bluetooth-discover

Такую же команду load-module можно добавить в /etc/pulse/default.pa.

Если всё равно не работает или ваш PulseAudio общесистемный, также загрузите эти модули (опять же, их можно прописать в default.pa или system.pa):

module-bluetooth-policy
module-bluez5-device
module-bluez5-discover

Ещё может оказаться, что у владельца /var/lib/bluetooth/ нет доступа на запись. В таком случае проблема может решиться повторным сопряжением, но после перезагрузки всё опять перестанет работать. Возвращение прав на запись поможет:

# chmod -R u+w /var/lib/bluetooth

Соединение работает, но в звуке постоянные артефакты

Это скорее всего связано с тем, что Bluetooth и Wi-Fi используют один и тот же чип, одну и ту же антенну и, возможно, диапазон (2.4 ГГц). Хотя это работает без проблем в Windows, в Linux это не так.

Возможным решением является переключение вашей Wi-Fi сети на 5 ГГц, чтобы больше не возникало интерференции. Если карта/роутер не поддерживают этот диапазон, попробуйте обновить драйвера/прошивку Wi-Fi. Это работает на Realtek 8723BE с последними rtl драйверами с AUR.

Если сделать это невозможно, менее эффективным решением будет настройка размера фрагмента и задержки на выходе PulseAudio, через которые можно попытаться скомпенсировать интерференцию. Нужно выбирать разумные значения, так как эти изменения могут привести к рассинхронизации звука (например, при проигрывании видео). Для изменения задержки на порту bluetooth-наушников (например, 125000 микросекунд в данном примере):

$ pactl set-port-latency-offset <bluez_card> headset-output 125000

где идентификатор карты можно узнать с помощью

$ pacmd list-sinks | egrep -o 'bluez_card[^>]*'

Размер фрагмента можно установить в файле /etc/pulse/daemon.conf, изменения применятся после перезапуска PulseAudio (подробнее смотрите PulseAudio/Решение проблем#Определение номера фрагмента по умолчанию и размера буфера в PulseAudio).

Иногда может помочь добавление options ath9k btcoex_enable=1 в файл /etc/modprobe.d/ath9k.conf (с соответствующим адаптером bluetooth):

/etc/modprobe.d/ath9k.conf
# possibly fix for sound glitches
options ath9k btcoex_enable=1

После этого перезагрузитесь.

Соединение работает, но не получается воспроизвести звук

Поищите в системном журнале такие сообщения:

bluetoothd[5556]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSource
bluetoothd[5556]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSink

Если подобные сообщения есть, можно продолжить изучать конфигурацию PulseAudio. Если нет, то убедитесь, что соединение успешно.

При использовании GDM запускается другой экземпляр PulseAudio, который «захватывает» ваши bluetooth-соединения. Это можно предотвратить, замаскировав сокет pulseaudio для пользователя GDM:

# mkdir -p  /var/lib/gdm/.config/systemd/user
# ln -s /dev/null  /var/lib/gdm/.config/systemd/user/pulseaudio.socket

При следующей перезагрузке второй экземпляр PulseAudio запускаться не будет.

Также может оказаться, что bluez неправильно определяет наушники как не поддерживающие a2dp. В таком случае найдите индекс bluetooth-устройства:

$ pacmd ls

Среди вывода должен быть раздел, связанный с bluetooth-наушниками, выглядящий примерно так:

$ pacmd ls
index: 2
        name: <bluez_card.XX_XX_XX_XX_XX_XX>
        driver: <module-bluez5-device.c>
        owner module: 27
        properties:
                device.description = "SONY MDR-100ABN"
                device.string = "XX:XX:XX:XX:XX:XX"
                device.api = "bluez"
                device.class = "sound"
                ...

Для ручного выбора профиля выполните

$ pacmd set-card-profile 2 a2dp_sink

где 2 это индекс устройства, полученный через pacmd ls.

Соединение работает, звук играет, а после неактивности заикается

Если наушники играют звук нормально до ухода в режим ожидания, а после возобновления начинает заикаться (например, если звук был приостановлен или ничего не воспроизводилось какое-то время), попробуйте отключить автоматическую приостановку входа/выхода в PulseAudio.

Некоторые пользователи сообщают об огромных задержках или даже отсутствии звука, когда Bluetooth-соединение не отправляет никаких данных. Это из-за модуля module-suspend-on-idle, который автоматически приостанавливает неактивные входы/выходы.

Чтобы отключить загрузку этого модуля, закомментируйте эту строку в используемом файле конфигурации (~/.config/pulse/default.pa или /etc/pulse/default.pa):

~/.config/pulse/default.pa
### Automatically suspend sinks/sources that become idle for too long
#load-module module-suspend-on-idle

Перезапустите PulseAudio для применения изменений.

UUIDs has unsupported type

В процессе сопряжения вы можете увидеть в bluetoothctl такой вывод:

[CHG] Device 00:1D:43:6D:03:26 UUIDs has unsupported type

Это сообщение очень частое и может быть проигнорировано.

Компьютер показывает устройство как сопряжённое, но это не распознаётся устройством

Это может быть из-за того, что устройство не поддерживает Bluetooth LE для сопряжения.

Попробуйте прописать настройку ControllerMode = bredr в файле /etc/bluetooth/main.conf. Смотрите [1].

Устройство подключается и затем отключается спустя мгновение

Если вы видите в журнале подобные сообщения и устройство не может подключиться или отключается вскоре после подключения:

bluetoothd: Unable to get connect data for Headset Voice gateway: getpeername: Transport endpoint is not connected (107)
bluetoothd: connect error: Connection refused (111)

Это может быть из-за того, что вы уже настроили сопряжение с этим устройством в другой операционной системе с тем же Bluetooth-адаптером (например, в случае dual-booting). Некоторые устройства не могут обрабатывать несколько сопряжений с одним и тем же MAC-адресом. Смотрите Bluetooth (Русский)#Сопряжение при Dual boot для настройки сопряжения в обоих ОС.

Если другая ОС вас уже не интересует, можно просто выполнить сопряжение заново. Сперва удалите существующее сопряжение:

$ bluetoothctl
[bluetooth]# devices
Device XX:XX:XX:XX:XX:XX My Device
[bluetooth]# remove XX:XX:XX:XX:XX:XX

Затем перезапустите bluetooth.service, включите bluetooth-адаптер, сделайте своё устройство видимым, пересканируйте устройства и выполните сопряжение с вашим устройством (смотрите основную статью). В зависимости от вашего менеджера Bluetooth может понадобиться выполнить полную перезагрузку для переподключения устройств.

В Apple AirPods маленькая громкость

Создайте drop-in файл для службы bluetooth.service со следующим содержимым:

/etc/systemd/system/bluetooth.service.d/noplugin-avrc.conf
[Service]
ExecStart=
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=avrcp

Затем выполните systemctl daemon-reload, перезапустите bluetooth.service, и переподключите наушники.

Кроме того, для AirPods Pro отключите пространственный звук и включите моно в настройках вашего iPhone.

Это также может решить проблемы с некоторыми устройствами, которыми нельзя управлять через AVRCP.

Apple AirPods Pro работает с PulseAudio как выход A2DP, но не как HSP/HFP

Если AirPods Pro работает, но не может использовать HSP/HFP (в pavucontrol на вкладке Конфигурациия обычно отображается как недоступный), попробуйте перейти на pipewire-pulse.

Переход на pipewire-pulse (и перезапуск компьютера или соответствующих пользовательских служб) должен включить HSP/HFP, но также может отключить A2DP (при выборе этого профиля в pavucontrol он мгновенно отключается). Если у вас появилась такая проблема, попробуйте удалить/переименовать папку /var/lib/bluetooth:

# mv /var/lib/bluetooth /var/lib/bluetooth.bak

После этого проведите повторное сопряжение с AirPods Pro (и другими устройствами). После этого все конфигурации (HSP/HFP и A2DP) должны быть снова доступны в pavucontrol и pacmd.

Проблема с HSP: ввод и вывод bluetooth созданы, но звук не передаётся

У вас может отсутствовать прошивка или SCO (аудио протокол HSP и HFP) роутинг может быть неправильным. Смотрите [2] — прошивка для BCM20702 может быть установлена через пакет bcm20702a1-firmwareAUR или bcm20702b0-firmwareAUR.

Error: Failed to start discovery org.bluez.Error.InProgress

Если наушники обнаруживаются, но подключение не проходит с ошибкой "Failed to start discovery org.bluez.Error.InProgress", установите bluez-hciconfigAUR и выполните

$ hciconfig hciX up
$ hciconfig hciX reset

где X это идентификатор bluetooth-устройства вашего компьютера (обычно 0).

Теперь подключение должно работать как описано в #Настройка через командную строку.

Переключение между HSP/HFP и A2DP

Это можно сделать с помощью следующей команды, где номер_карты можно узнать с помощью команды pacmd list-cards.

$ pacmd set-card-profile номер_карты a2dp_sink

Для автоматического переключения с A2DP на HSP при включении записи можно добавить auto_switch=2 к load-module module-bluetooth-policy в файле /etc/pulse/default.pa.

Подробнее о профилях смотрите документацию PulseAudio.

A2DP не работает с PulseAudio

Проблема с интерфейсом Socket

Если PulseAudio не может переключить профиль на A2DP с bluez 4.1+ и PulseAudio 3.0+, можно попробовать отключить интерфейс Socket в файле /etc/bluetooth/main.conf путём удаления строки Enable=Socket и добавления Disable=Socket.

Недоступен профиль выхода A2DP

Когда профиль вывода A2DP недоступен, становится невозможно переключиться на A2DP вывод в настройках PulseAudio или он вообще не отображается в списке. Это можно проверить с помощью pactl:

$ pactl list | grep -C2 A2DP
     Profiles:
             headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
             a2dp_sink: High Fidelity Playback (A2DP Sink) (sinks: 1, sources: 0, priority: 40, available: no)
             off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
        Active Profile: headset_head_unit

Попытка ручного изменения профиля через pacmd также окончится неудачей.

$ pacmd set-card-profile bluez_card.C4_45_67_09_12_00 a2dp_sink
Failed to set card profile to 'a2dp_sink'.

Это известная проблема Pulseaudio с версии 10.0 при подключении Bluetooth-наушников через Bluedevil или другой фронтенд BlueZ. Смотрите связанный баг-репорт.

Эта проблема также случается после сопряжения на некоторых Bluetooth-контроллерах (например, 0a12:0001, Cambridge Silicon Radio), которые по умолчанию включают службу Handsfree или Headset - HS и не позволяют переключиться на A2DP.

Возможные решения:

  • На некоторых наушниках помогает нажатие кнопок управления громкостью и воспроизведением, после чего профиль A2DP становится доступным.
  • Может оказаться, что подключение наушников через bluetoothctl из пакета bluez-utils делает профиль A2DP доступным. Можно автоматизировать это каждый раз при подключении bluetooth: fix-bt-a2dpAUR (детальное описание).
[bluetooth]# connect MAC_адрес_наушников
  • Ручное переключение на Bluetooth-службу AudioSink может сделать профиль A2DP и A2DP-вывод в PulseAudio доступным. Это можно сделать через blueman-manager из пакета blueman или путём регистрации UUID службы AudioSink через bluetoothctl.
$ bluetoothctl
[bluetooth]# menu gatt
[bluetooth]# register-service 0000110b-0000-1000-8000-00805f9b34fb
[bluetooth]# quit
  • Отключите профиль Headset
/etc/bluetooth/main.conf
[General]
Disable=Headset
  • Включите поддержку MultiProfile. Это может помочь для наушников, которые поддерживают как A2DP, так и Headset.
/etc/bluetooth/main.conf
[General]
MultiProfile=multiple
  • Иногда никакой из предыдущих шагов не помогает. Возможно, вы безрезультатно пытались перезагрузить и выключить Bluetooth, а затем снова включить его. В таком случае попробуйте перезапустить службу bluetooth.service.
  • Замена pulseaudio-bluetooth на pulseaudio-modules-btAUR[ссылка недействительна: package not found] или pulseaudio-modules-bt-gitAUR[ссылка недействительна: package not found], которые предоставляют дополнительные Bluetooth-кодеки, может помочь.
  • На некоторых моделях наушников с возможностью управления звуком профиль A2DP необходимо включить, нажав кнопку «Воспроизведение / Пауза».

Gnome с GDM

Эта инструкция протестирована с Gnome 3.24.2 и PulseAudio 10.0, но может быть полезна и для других версий.

Если PulseAudio не удаётся изменить профиль на A2DP при использовании GNOME с GDM, нужно запретить GDM запуск его собственного экземпляра PulseAudio:

  • Предотвратите запуск сервера клиентами Pulseaudio, если он не запущен, с помощью добавления этих строк:
/var/lib/gdm/.config/pulse/client.conf
autospawn = no
daemon-binary = /bin/true
  • Предотвратите запуск Pulseaudio через socket-активацию:
$ sudo -ugdm mkdir -p /var/lib/gdm/.config/systemd/user
$ sudo -ugdm ln -s /dev/null /var/lib/gdm/.config/systemd/user/pulseaudio.socket
  • Перезагрузитесь и проверьте, что нет процесса PulseAudio, запущенного пользователем gdm:
$ pgrep -u gdm pulseaudio

Обсуждение этой проблемы и другие варианты решения можно почитать на форуме: [3] и [4]. Также можно попробовать fix-bt-a2dpAUR.

HFP не работает с PulseAudio

Наушники с поддержкой только HFP могут не заработать со стандартной конфигурацией PulseAudio. Соответствующие профили есть, но они недоступны:

  • bluetoothctl info показывает:
UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
UUID: Handsfree                 (0000111e-0000-1000-8000-00805f9b34fb)
  • pactl list соответствующего устройства показывает:
...
Profiles:
      ...
      headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: no)

Для решения проблемы обновите pulseaudio (>=13) и возможно pulseaudio-modules-bt-gitAUR[ссылка недействительна: package not found] и bluez (>=5.5) до последних версий. Затем установите ofonoAUR (запустите и включите службу systemd) и phonesimAUR и создайте поддельный модем как описано здесь [5]:

Примечание: Шаги после создания phonesim.conf нужно повторять каждый раз для подключения наушников.
  • Создайте /etc/ofono/phonesim.conf:
[phonesim]
Address=127.0.0.1
Driver=phonesim
Port=12345
  • Запустите от имени своего пользователя:
$ phonesim -p 12345 /usr/share/phonesim/default.xml &
  • Включите модем:
$ dbus-send --print-reply --system --dest=org.ofono /phonesim org.ofono.Modem.SetProperty string:"Powered" variant:boolean:true
  • Активируйте модем:
$ dbus-send --print-reply --system --dest=org.ofono /phonesim org.ofono.Modem.SetProperty string:"Online" variant:boolean:true
  • Для проверки результата используйте команды тестирования из пакета ofonoAUR, находящиеся в каталоге /usr/lib/ofono/test/. Для включения, активации и тестирования модема можно использовать:
$ /usr/lib/ofono/test/enable-modem /phonesim
$ /usr/lib/ofono/test/online-modem /phonesim
$ /usr/lib/ofono/test/list-modems

Вывод для соответствующего модема должен выглядеть примерно так:

...
[ /phonesim ]
  Online = 1
  Powered = 1
  Lockdown = 0
  Emergency = 0
  Manufacturer = MeeGo
  ...
  • Наконец, перезапустите pulseaudio и переподключите наушники. Теперь HFP должен стать доступен:
headset_head_unit: Headset Head Unit (HSP/HFP) (sinks: 1, sources: 1, priority: 30, available: yes)
Примечание: Поддержка HFP не является стабильной и может приводить к артефактам при переключении на A2DP; попробуйте переподключиться, если нужный режим недоступен.

Отключение автоматического перехода наушникосв на HSP/HFP

При использовании наушников, поддерживающих несколько профилей, некоторые приложения автоматически переключают их на профиль HSP/HFP. Если вас это не устрвивает, можно отключить это добавлением параметра auto_switch=false к модулю bluetooth-policy:

/etc/pulse/default.pa
load-module module-bluetooth-policy auto_switch=false