Bluetooth headset (Русский)
На данный момент 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.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
- Убедитесь, что ваше аудиоустройство bluetooth является доверенным (trusted), иначе повторное сопряжение окончится неудачей. Подробнее смотрите Bluetooth (Русский)#Сопряжение.
- По умолчанию адаптер Bluetooth не включается после загрузки системы. Подробнее смотрите Bluetooth (Русский)#Автоматическое включение после загрузки.
Мультимедийные кнопки
Для использования мультимедийных кнопок они могут быть перенаправлены в MPRIS, где их подхватят плееры, поддерживающие MPRIS для управления. Подробнее смотрите MPRIS#Bluetooth.
Настройка через GNOME Bluetooth
Вы можете использовать графический фронтенд GNOME Bluetooth для лёгкой настройки наушников.
Сперва убедитесь, что служба bluetooth.service
запущена.
Откройте GNOME Bluetooth и активируйте bluetooth. После сканирования устройств вы можете подключиться к наушникам, выбрав их в списке устройств. Вы можете получить доступ к настройкам звука из меню устройства. После подключения устройства в настройках звука должен появиться новый аудиовыход.
LDAC/aptX
Поддержку кодеков LDAC/aptX можно включить установкой пакетов pulseaudio-modules-btAUR и libldac и перезапуском PulseAudio. Смотрите подсказки по настройке на странице проекта. Вы можете проверить используемый кодек с помощью команды:
$ pactl list | grep a2dp_codec
Решение проблем
Плохой звук / Постоянный шум / «Мутный» звук
Плохое качество звука скорее всего связано с тем, что не выбран правильный профиль. Смотрите #Переключение между 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 нужно переустановить с нуля). Установите и затем перезапустите 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
. Смотрите [2].
Устройство подключается и затем отключается спустя мгновение
Если вы видите в журнале подобные сообщения и устройство не может подключиться или отключается вскоре после подключения:
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) роутинг может быть неправильным. Смотрите [3] — прошивка для 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 или pulseaudio-modules-bt-gitAUR, которые предоставляют дополнительные 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
Обсуждение этой проблемы и другие варианты решения можно почитать на форуме: [4] и [5]. Также можно попробовать 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 и bluez (>=5.5) до последних версий. Затем установите ofonoAUR (запустите и включите службу systemd) и phonesimAUR и создайте поддельный модем как описано здесь [6]:
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)
Отключение автоматического перехода наушникосв на HSP/HFP
При использовании наушников, поддерживающих несколько профилей, некоторые приложения автоматически переключают их на профиль HSP/HFP. Если вас это не устрвивает, можно отключить это добавлением параметра auto_switch=false к модулю bluetooth-policy:
/etc/pulse/default.pa
load-module module-bluetooth-policy auto_switch=false