LINUX.ORG.RU

Автоматическое переключение вывода звука на подключаемые Bluetooth-наушники

 ,


1

3

Используется Ubuntu 14.04 и PulseAudio 4.0. Наушники отлично подключаются и работают в режимах HSP и A2DP, поэтому модель наушников даже не привожу в надежде на то, что это не важно. Однако после успешного подключения вывод звука по умолчанию во всех приложениях продолжает осуществляться через колонки. Как настроить так, чтобы при подключении Bluetooth-наушников устройством вывода звука по умолчанию стали подключаемые наушники? Кроме того, по умолчанию режим работы наушников — HSP, как сделать так, чтобы режимом по умолчанию был A2DP?

Насколько я знаю, PulseAudio выбирает тот профиль для карты, у которого наибольший приоритет, и для вывода звука по умолчанию использует ту карту и тот сток, у порта которых наибольший приоритет и тот порт, у которого наибольший приоритет. У меня приоритет для порта наушников всегда оказывается меньше, чем для порта колонок. Как изменить эти приоритеты?

В крайнем случае можно сделать:

/etc/init/custom/bluetooth-headphones-switch.conf:

description «Upstart service for bluetooth headphones switching to»

start on bluetooth-device-added

exec pacmd set-default-sink '57'

В статье http://itshaman.ru/articles/123/podklyuchenie-bluetooth-naushnikov-i-garnitur... написано, что при наличии PulseAudio при подключении Bluetooth-гарнитуры PulseAudio будет автоматически переводить звук на неё. Получается, что в новой версии PulseAudio изменили приоритеты по умолчанию? Я в Zorin 6, основанной на Ubuntu 12.04, ранее наблюдал автоматическое переключение, но только со второго подключения устройства. Первый раз не переключилось, я переключил вручную, при втором подключении снова не переключилось, я снова переключил вручную, а при третьем подключении устройства переключилось.


Согласно этому https://wiki.archlinux.org/index.php/Bluetooth_headset

В пульсе есть модуль module-switch-on-connect который можно дописать (или раскомментировать) в /etc/pulse/default.pa

Насчет A2DP, мне помогло в pavucontrol один раз указать профиль и он его запомнил.

nickleiten ★★★ ()
Последнее исправление: nickleiten (всего исправлений: 1)

Следующий скрипт скачивает исходники PulseAudio, вносит в них изменения (при инициализации внутренних структур данных PulseAudio, в которых хранится информация о картах, профилях и портах PulseAudio, устанавливаются более высокие приоритеты для A2DP и портов наушников) и собирает модифицированный пакет pulseaudio-module-bluetooth. Скачивание из официальных репозиториев (из тех же, из которых скачиваются обычные бинарные пакеты), всё происходит в текущей папке, в середине требуются права root и установка большого количества требуемых для сборки пакетов для разработки, для сборки требуются пакеты devscripts, fakeroot и необходимое для сборки, например, build-essential. Скрипт, скорее всего, подходит только для Ubuntu 14.04 (ну или для дистрибутивов, основанных на Debian и использующих PulseAudio 4.0). Название пакета будет такое же, как и в репозитории, поэтому будут приходить обновления, нужно зафиксировать версию или изменить версию пакета в исходнике перед сборкой.

build_pulseaudio_module_bluetooth_with_elevated_priorities.sh:

#!/bin/sh
apt-get source pulseaudio-module-bluetooth
rm "pulseaudio*.tar.xz"
rm "pulseaudio*.dsc"
cd "pulseaudio-4.0/debian/patches"
echo "2147a2148"                     >> "local-0000-elevate-priorities-for-bluetooth.patch"
echo ">     port->priority = 10100;" >> "local-0000-elevate-priorities-for-bluetooth.patch"
echo "2153a2155"                     >> "local-0000-elevate-priorities-for-bluetooth.patch"
echo ">     port->priority = 8950;"  >> "local-0000-elevate-priorities-for-bluetooth.patch"
echo "2169c2171"                     >> "local-0000-elevate-priorities-for-bluetooth.patch"
echo "<         p->priority = 10;"   >> "local-0000-elevate-priorities-for-bluetooth.patch"
echo "---"                           >> "local-0000-elevate-priorities-for-bluetooth.patch"
echo ">         p->priority = 30;"   >> "local-0000-elevate-priorities-for-bluetooth.patch"
cd "../.."
patch -n "src/modules/bluetooth/module-bluetooth-device.c" < "debian/patches/local-0000-elevate-priorities-for-bluetooth.patch"
sudo apt-get build-dep pulseaudio-module-bluetooth
debuild -b -us -uc
cd ..
mv pulseaudio-module-bluetooth_4.0*.deb pulseaudio-4.0
rm libpulse*.deb
rm pulseaudio*.deb
rm pulseaudio*.build
rm pulseaudio*.changes
mv pulseaudio-4.0/pulseaudio-module-bluetooth_4.0*.deb .
rm -r pulseaudio-4.0

PulseAudio подцепляет модуль, pactl показывает изменённые приоритеты, однако не выбирает в соответствии с ними A2DP и не переключает сток по умолчанию.

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

Наиболее правильным решением, видимо, является отключение всех портов, не являющихся наушниками, у всех карт ALSA при появлении хотя бы одной карты BlueZ с доступным портом наушников, как это делается в драйвере ALSA. Возможно, потом как-нибудь напишу им баг по этому поводу.

Вот здесь описывается способ создания конфигурационных файлов, которые в том числе настраивают приоритеты портов карты PulseAudio, но, во-первых, эти приоритеты, как уже выше было сказано, видимо, влияют только на выбор порта у стока, но не на выбор между стоками, а во-вторых, это внутренняя тема драйвера ALSA для PulseAudio module-alsa-card.c, звук же, поступающий на карту BlueZ, управляемой module-bluetooth-device.c, отправляется PulseAudio напрямую стеку BlueZ в ядре, без участия ALSA, так что это подходит только для настройки карты ALSA: http://archlinux.org.ru/forum/topic/14514/, http://unix.stackexchange.com/questions/111428/how-do-i-configure-pulseaudio-for-7-1-surround-sound-over-hdmi.

У меня при выборе в pavucontrol ни сток по умолчанию, ни профиль не запоминался. Но через месяц использования A2DP всё-таки начал запоминаться, но нестабильно, через некоторое время опять начинал включать HSP. Предполагаю два варианта. Либо он выбирает тот профиль, в котором большее количество раз непрерывно находилась карта, либо запоминание происходит при отключении и подключении наушников при запущенном pavucontrol. Мне же нужен был стабильный A2DP при подключении.

После подключения модуля module-switch-on-connect по наводке выше сток по умолчанию наконец-то начал переключаться на наушники. Однако и тут возникла проблема: две программы (Rhythmbox и Firefox/Flash) по неизвестной причине продолжали выводить звук на колонки. Предполагаю, что проблему вызвал запуск встроенной программы настройки Ubuntu Параметры системы -> Звук при подключённых и автоматически переключившихся наушниках, так как программа эта вела себя неадекватно и так как после её повторного запуска и переключения в ней вывода звука на колонки и обратно проблема ушла.

Однако для переключения в A2DP пришлось всё-таки использовать Upstart. Очередная проблема заключалась в том, что событие Upstart bluetooth-device-added генерировалось не только при подключении наушников, но и при переключении профиля наушников с A2DP на HSP (но не наоборот) (видимо, из-за добавления микрофона), а также иногда при включении компьютера (из-за подключения Bluetooth-адаптера?). Проблему решила очень хитрая схема с 2 скриптами, первый из которых переключает наушники в A2DP и при этом отсеивает случаи, когда карта отсутствует (включение компьютера) и когда при генерации события bluetooth-device-added номер карты остался такой же, как и при предыдущей генерации события (переключение в HSP), а второй автоматически при запуске сеанса пользователя сбрасывает номер карты на такой, который не ожидается, для правильной обработки ситуации при первом подключении наушников.

/etc/init/custom/bluetooth-headphones-switch-to-a2dp.conf:

description "Upstart task for switching bluetooth headphones to A2DP"

start on bluetooth-device-added

task

exec su <user> -c "/usr/bin/bluetooth_headphones_switch_to_a2dp.sh"

/usr/bin/bluetooth_headphones_switch_to_a2dp.sh:

#!/bin/sh
sleep 5
if pactl list short cards | grep bluez_card.<MAC>
then
  read OLD_BLUEZ_CARD < /home/<user>/.bluez_card
  pactl list short cards | grep bluez_card.<MAC> | awk '{print $1}' > /home/<user>/.bluez_card
  read NEW_BLUEZ_CARD < /home/<user>/.bluez_card
  if [ $OLD_BLUEZ_CARD -ne $NEW_BLUEZ_CARD ]
  then
    pactl set-card-profile 'bluez_card.<MAC>' 'a2dp'
  fi
fi

/etc/xdg/autostart/bluez-card-reset.desktop:

[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=PulseAudio BlueZ card number cache reset
Exec=bluez-card-reset.sh
Terminal=false
Type=Application
X-GNOME-Autostart-Phase=Initialization
NoDisplay=true

/usr/bin/bluez-card-reset.sh:

#!/bin/sh
if [ `pwd` = "/home/<user>" ]
then
  echo 2 > /home/<user>/.bluez_card
fi

PulseAudio работает в сеансе обычного пользователя, поэтому в нужных местах нужно заменить <user> на имя обычного пользователя, которому нужно переключать в A2DP, а <MAC> — MAC-адрес наушников (можно посмотреть в Параметры системы -> Bluetooth или в pactl list cards). В последнем скрипте вместо 2 нужно вписать такой номер карты PulseAudio, соответствующей наушникам, который не ожидается при первом подключении наушников (например, у меня встроенная карта имеет номер 0, а наушники при первом подключении имеют номер 1, при втором — 2 и т. д., так что при первом подключении для них не ожидается номер 2).

Ну и напоследок приведу скрипт-обёртку вокруг Empathy, который автоматически переключает наушники в режим HSP на время работы Empathy (и поддерживает их в этом режиме), а после прекращения работы Empathy переключает обратно в A2DP, которую можно переделать и в обёртку для Skype.

/usr/bin/emp-hsp:

#!/bin/sh
BLUEZ_CARD="bluez_card.<MAC>"
empathy &
sleep 2
while ps -u <user> | grep empathy
do
  if pactl list short cards | grep $BLUEZ_CARD
  then
    pactl set-card-profile "$BLUEZ_CARD" "hsp"
  fi
  sleep 4
done
if pactl list short cards | grep $BLUEZ_CARD
then
  pactl set-card-profile "$BLUEZ_CARD" "a2dp"
fi
ad ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.