Ошибка подключения профиля a2dp-sink

Вопрос или проблема

Когда я использовал GNOME, мои Bluetooth-устройства работали нормально. Но теперь я перешёл на i3 и использую blueman. Когда я пытаюсь подключиться к любым наушникам, blueman выдает

blueman.bluez.errors.DBusFailedError: Protocol not available.

В логах есть очень похожие ошибки:

сен 09 21:00:45 keddad-pc bluetoothd[916]: a2dp-sink profile connect failed for FC:A8:9A:90:B

Единственное решение, которое я смог найти, это установить pulseaudio-module-bluetooth, но он уже установлен. Что может быть причиной этой проблемы?

Я попробовал добавить

load-module module-bluetooth-policy
load-module module-bluetooth-discover

в /etc/pulse/system.pa, как указано в Arch Wiki, но это ничего не исправило

Этот gist тоже не помог.

Выполните следующие команды:

sudo apt-get install pulseaudio-module-bluetooth
sudo killall pulseaudio
pulseaudio --start    
sudo systemctl restart bluetooth

Выполните следующие команды для Ubuntu 22.101:

sudo apt install libspa-0.2-bluetooth
systemctl --user restart wireplumber

1В Ubuntu 22.10 мой pulseaudio-module-bluetooth больше не работает, но он был заменён на libspa-0.2-bluetooth. Это связано с переходом Ubuntu с PulseAudio на PipeWire.

Я смог решить ту же проблему в Ubuntu 21.04, основываясь на этом решении:

Добавление module-bluez5-discover в конце файла конфигурации pulseaudio /etc/pulse/default.pa:

load-module module-bluez5-discover

Перезапустите PulseAudio:

killall pulseaudio

В моем случае (Ubuntu 18.04/Awesome wm) pulseaudio-module-bluetooth тоже уже установлен.

Выполните следующие команды для исправления разрешений:

sudo chown -R $USER:$USER $HOME/
sudo apt-get --purge --reinstall install pulseaudio-module-bluetooth alsa-base pulseaudio
mv ~/.config/pulse ~/.config/pulse.old

Затем перезагрузите систему.

Похоже, что-то было не так с загрузкой модуля. Я не выяснил причину, но заставил i3 загружать их вручную при запуске.

Добавьте эти строки в ~/.config/i3/config

exec --no-startup-id pactl load-module module-bluetooth-policy
exec --no-startup-id pactl load-module module-bluetooth-discover

У меня точно такая же проблема a2dp-sink profile connect failed + blueman.bluez.errors.DBusFailedError: Protocol not available.

Я думаю, проблема может заключаться в нашем ~/.config/pulse/default.pa

#!/usr/bin/pulseaudio -nF
#
# Обходное решение для PA, которое не позволяет получить доступ к профилям A2DP в пользовательской сессии
# потому что GDM уже его использует.
# LP: #1703415

# загружается системная конфигурация
.include /etc/pulse/default.pa

### выгрузка драйверов модулей для оборудования Bluetooth
.ifexists module-bluetooth-policy.so
  unload-module module-bluetooth-policy
.endif

.ifexists module-bluetooth-discover.so
  unload-module module-bluetooth-discover
.endif

Поскольку я не воспроизвожу оригинальную ошибку, описанную в этом обходном решении (https://bugs.launchpad.net/ubuntu/+source/gdm3/+bug/1703415), я думаю, это можно безопасно закомментировать:

#!/usr/bin/pulseaudio -nF
#
# Обходное решение для PA, которое не позволяет получить доступ к профилям A2DP в пользовательской сессии
# потому что GDM уже его использует.
# LP: #1703415

# загружается системная конфигурация
.include /etc/pulse/default.pa

### выгрузка драйверов модулей для оборудования Bluetooth
#.ifexists module-bluetooth-policy.so
#  unload-module module-bluetooth-policy
#.endif
#
#.ifexists module-bluetooth-discover.so
#  unload-module module-bluetooth-discover
#.endif

затем перезапустите pulseaudio с помощью

$ pulseaudio -k

Возможно, что эта проблемная заплатка отсутствует в новой установке последнего выпуска Ubuntu, я не проверял. (Я сейчас на 20.10, пришёл с установки на 18.10)

Это зависит от используемой звуковой системы. Для пользователей, использующих pipewire (Ubuntu 22.04), ответ https://askubuntu.com/a/1432859/1646539 помог. При использовании Ubuntu с pipewire установите libspa-0.2-bluetooth и перезапустите wireplumber, как описано выше.

Вы можете проверить, используете ли вы pipewire:

$ pactl info | grep -i "server name"
Server Name: PulseAudio (on PipeWire 0.3.48)

У меня также были проблемы с установкой пакета libspa-0.2-bluetooth:

Подготовка к распаковке .../libldacbt-abr2_2.0.2.3+git20200429+ed310a0-4_amd64.deb ...
Распаковка libldacbt-abr2:amd64 (2.0.2.3+git20200429+ed310a0-4) ...
dpkg: ошибка обработки архива /var/cache/apt/archives/libldacbt-abr2_2.0.2.3+git20200429+ed310a0-4_amd64.deb (--unpack):
 попытка перезаписи '/usr/lib/x86_64-linux-gnu/libldacBT_abr.so.2', который уже есть в пакете libldac:amd64 2.0.2.3~r26478861
Ошибки возникли при обработке:
 /var/cache/apt/archives/libldacbt-abr2_2.0.2.3+git20200429+ed310a0-4_amd64.deb

Следующие команды помогли мне решить эту проблему (используя pipewire):

sudo apt purge libldac
sudo apt install libspa-0.2-bluetooth
systemctl --user restart wireplumber.service

После установки пакета и выполнения команды systemctl status bluetooth ошибка src/service.c:btd_service_connect() a2dp-sink profile connect failed for …: Protocol not available исчезла:

… bluetoothd[1246]: Player registered: sender=:1.32573 path=/media_player0
… bluetoothd[1246]: Endpoint registered: sender=:1.32573 path=/MediaEndpoint/A2DPSource/ldac
… bluetoothd[1246]: Endpoint registered: sender=:1.32573 path=/MediaEndpoint/A2DPSink/sbc
… bluetoothd[1246]: Endpoint registered: sender=:1.32573 path=/MediaEndpoint/A2DPSource/sbc
… bluetoothd[1246]: Endpoint registered: sender=:1.32573 path=/MediaEndpoint/A2DPSink/sbc_xq
… bluetoothd[1246]: Endpoint registered: sender=:1.32573 path=/MediaEndpoint/A2DPSource/sbc_xq
… bluetoothd[1246]: Endpoint registered: sender=:1.32573 path=/MediaEndpoint/A2DPSource/faststream
… bluetoothd[1246]: Endpoint registered: sender=:1.32573 path=/MediaEndpoint/A2DPSource/faststream_duplex

[Ubuntu 22.04]

После многочисленных установок и удалений, между pipewire и pulseaudio, ничего не работало, я вернул систему к первоначальной установке без pulseaudio

$ apt list pipe* wirep* *blue* pulse* -i
Listing... Done
bluedevil/jammy-updates,now 4:5.24.7-0ubuntu0.1 amd64 [installed]
bluez-cups/jammy-updates,jammy-security,now 5.64-0ubuntu1.1 amd64 [installed]
bluez-obexd/jammy-updates,jammy-security,now 5.64-0ubuntu1.1 amd64 [installed,automatic]
bluez/jammy-updates,jammy-security,now 5.64-0ubuntu1.1 amd64 [installed]
libbluetooth3/jammy-updates,jammy-security,now 5.64-0ubuntu1.1 amd64 [installed,automatic]
libkf5bluezqt-data/jammy,jammy,now 5.92.0-0ubuntu1 all [installed,automatic]
libkf5bluezqt6/jammy,now 5.92.0-0ubuntu1 amd64 [installed,automatic]
libspa-0.2-bluetooth/jammy-updates,now 0.3.48-1ubuntu3 amd64 [installed]
pipewire-audio-client-libraries/jammy-updates,now 0.3.48-1ubuntu3 amd64 [installed]
pipewire-bin/jammy-updates,now 0.3.48-1ubuntu3 amd64 [installed,automatic]
pipewire-pulse/jammy-updates,now 0.3.48-1ubuntu3 amd64 [installed,automatic]
pipewire/jammy-updates,now 0.3.48-1ubuntu3 amd64 [installed,automatic]
qml-module-org-kde-bluezqt/jammy,now 5.92.0-0ubuntu1 amd64 [installed,automatic]
wireplumber/jammy,now 0.4.8-4 amd64 [installed]

Затем, следуя посту huvelyb на archlinux,
я добавил load-module module-bluez5-discover в /etc/pulse/default.pa.
Вот вся секция для справки

### Автоматически восстанавливать уровень громкости потоков и устройств
load-module module-device-restore
load-module module-stream-restore
load-module module-card-restore
load-module module-bluez5-discover

Затем перезапустите все службы:

sudo systemctl restart bluetooth
systemctl --user restart pipew* wirepl*

et voilà!

Если вы видите такую ошибку, когда пытаетесь автоматически подключить ваше Bluetooth-аудиоустройство при загрузке, скорее всего это связано с отсутствием синхронизации между службой Bluetooth и pulseaudio.

Синхронизация bluetoothd и pulseaudio

Проблема

Bluetoothd, демон Bluetooth, который управляет Bluetooth-устройствами в Linux, обычно запускается под управлением менеджера инициализации системы, такого как Systemd. Процесс маршрутизации звука pulseaudio обычно запускается как пользовательский процесс из механизмов автозапуска, связанных с графическим диспетчером рабочего стола. Сам диспетчер рабочего стола обычно является одним из последних процессов, которые запускаются в ходе начальной обработки загрузки. Между этими двумя механизмами запуска нет синхронизации. Это значит, что Bluetoothd обычно завершает свою инициализацию задолго до начала работы pulseaudio.
Это не проблема для не аудио Bluetooth-устройств. Однако аудио Bluetooth-устройства, которые пытаются использовать pulseaudio через dbus в процессе своей инициализации, всегда будут давать сбой. На практике это означает любое устройство, которое требует ‘load-module module-bluez5-discover’ в конфигурации pulseaudio. Этот тип сбоя характеризуется появлением в системных логах и журналах сообщения, похожего на следующее:

Sep 15 09:04:25 dragon bluetoothd[1423]: src/service.c:btd_service_connect() a2dp-sink profile connect failed for 65:DE:65:37:94:79: Protocol not available.

Решение

Самый простой способ решения этой проблемы — перезапустить Bluetoothd после полной загрузки pulseaudio.
Решение состоит из двух компонентов. Один — это простая оболочечная программа, которая использует systemctl для перезапуска демона Bluetooth. Этот скрипт вызывается из файла kick-bluetooth.desktop. Этот файл нужно разместить в директории автозапуска пользователя, который использует устройство. Обычно это ~/.config/autostart.

Предостережения

Это решение хорошо работает на рабочих столах Gnome. Для других окружений могут потребоваться некоторые коррективы. Не стесняйтесь добавлять то, что работает для вас, и я добавлю это в эти заметки.

Для получения файлов смотрите здесь: https://github.com/rogerjames99/kick-bluetooth.git

Это не совсем доставлено для Ubuntu, но для тех, кто использует систему-wide pipewire с выделенным пользователем для pipewire, отключение monitor.bluez.seat-monitoring может быть полезным. По крайней мере, для меня это так. Пример:

wireplumber.profiles = {
  main = {
    hardware.audio = required
    hardware.bluetooth = required
    monitor.bluez.seat-monitoring = disabled
  }
}

.

Ответ или решение

Проблема с подключением профиля a2dp-sink, сопровождающаяся ошибкой blueman.bluez.errors.DBusFailedError: Protocol not available, возникает, когда блютуз наушники или другие аудиоустройства не могут подключиться к системе на Linux, в частности при использовании оконного менеджера i3 и blueman вместо GNOME. Несмотря на наличие пакета pulseaudio-module-bluetooth, такие ошибки могут продолжать возникать по ряду причин — от конфигурации аудиосервера до перегрузки сервисов.

Причины возникновения проблемы и решения

  1. Проблемы с модулем PulseAudio:
    Важно убедиться, что модули PulseAudio загружаются корректно. Вы уже добавили строки для загрузки module-bluetooth-policy и module-bluetooth-discover, однако это решение не всегда работает. В некоторых случаях полезно включить load-module module-bluez5-discover в конфигурационный файл /etc/pulse/default.pa.

  2. Перенос на PipeWire:
    На современных версиях Ubuntu (начиная с 22.04) PulseAudio постепенно заменяется на PipeWire, и многие аудиопроблемы связаны с этой миграцией. Для корректной работы Bluetooth с PipeWire необходимо установить пакет libspa-0.2-bluetooth, а также перезапустить поддержку через команду systemctl --user restart wireplumber.

  3. Проблемы с запуском служб:
    Хорошо бы настроить синхронный запуск служб PulseAudio (или PipeWire) и Bluetooth. Некорректная последовательность их старта может вызвать ошибки подключения. Скрипт для перезапуска службы Bluetooth после старта пользовательской сессии PulseAudio может решить эту проблему.

  4. Права доступа:
    Иногда проблема может быть связана с правами доступа. Убедитесь, что папка конфигурации PulseAudio имеет корректные права, выполнив команды:

    sudo chown -R $USER:$USER $HOME/
  5. Диагностика и логирование:
    Просмотрите журналы службы Bluetooth для более детального анализа ошибок. Это может выявить дополнительные проблемы с модулями или настройками.

Шаги по устранению неполадок

Рекомендуемая последовательность действий для устранения проблемы:

  • Убедитесь, что все пакеты Bluetooth и аудио обновлены.
  • Проверьте и убедитесь, что все модули Bluetooth загружаются правильно в PulseAudio или PipeWire.
  • Перезапустите службы после внесения изменений:
    sudo systemctl restart bluetooth
    # Для PulseAudio
    pulseaudio -k && pulseaudio --start
    # Для PipeWire
    systemctl --user restart pipewire
  • Если проблема остается, попробуйте временно отключить monitor.bluez.seat-monitoring.

Итоговое решение должно быть адаптировано под специфические настройки и версии ПО вашей системы. Не забывайте также учитывать документацию вашего дистрибутива и возможные обновления пакетов, которые могут устранить известные баги или несовместимости.

Оцените материал
Добавить комментарий

Капча загружается...