Ну что же, как сказал человек в посте, ссылку на который я привожу ниже, спасение утопающих — дело рук самих утопающих. Если очень нужно, можно всё и самому сделать.
Что касается приоритетов, то они инициализируются вшитыми в код PulseAudio значениями при инициализации драйвера карты (модуля PulseAudio, управляющего картой PulseAudio, для карты ALSA это module-alsa-card, для карты BlueZ (Bluetooth-гарнитуры или Bluetooth-наушников) — module-bluetooth-device), но теоретически могут быть изменены в дальнейшем, теоретически модулем (не уверен в этом полностью), или, в случае карты ALSA, конфигурационным файлом (см. далее).
Следующий скрипт скачивает исходники PulseAudio, вносит в них изменения (изменяет начальные значения приоритетов для A2DP и портов Bluetooth-наушников) и собирает модифицированный пакет 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. Предполагаю два варианта. Либо PulseAudio выбирает тот профиль, в котором большее количество раз непрерывно находилась карта, либо запоминание происходит при отключении и подключении наушников при запущенном pavucontrol. Мне же нужен стабильный A2DP при подключении.
Помогло подключение модуля PulseAudio module-switch-on-connect в /etc/pulse/default.pa, который автоматически переключает сток по умолчанию на новый появляющийся сток. Как я уже писал вот здесь:
https://forum.ubuntu.ru/index.php?topic=270174.0, Rhythmbox и Firefox/Flash продолжали после этого выводить звук на колонки, что скорее всего было вызвано запуском программы Параметры системы -> Звук при подключённых и автоматически переключившихся наушниках, при этом повторный запуск этой программы и переключение в ней вывода звука на колонки и обратно чудодейственным образом решило проблему.
Для автоматического же переключения наушников в режим A2DP вместо udev пришлось использовать Upstart, то есть настроить задачу Upstart на автоматическое переключение наушников в A2DP при их подключении. При этом возникла очередная проблема, которая заключалась в том, что событие Upstart bluetooth-device-added генерировалось не только при подключении наушников, но и при переключении профиля наушников с A2DP на HSP (но не наоборот) (видимо, из-за добавления микрофона), а также иногда при включении компьютера (из-за подключения Bluetooth-адаптера?). Проблему решила очень хитрая схема с 2 скриптами, первый из которых переключает наушники в A2DP и при этом отсеивает случаи, когда карта отсутствует (включение компьютера) и когда при генерации события bluetooth-device-added номер карты остался такой же, как и при предыдущей генерации события (переключение в HSP), а второй автоматически при запуске сеанса пользователя сбрасывает номер карты на такой, который не ожидается, для правильной обработки ситуации при первом подключении наушников. При этом в домашней папке хранится служебный файл ~/.bluez_card, хранящий последний использовавшийся номер карты PulseAudio, соответствующей наушникам.
/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
Раз уж серьёзно взялся за PulseAudio, ещё настроил себе module-lirc, и теперь управляю громкостью на компьютере с помощью пульта ДУ.
Так как я википедист по образованию, то не могу не запостить отсюда всё на вики (
https://help.ubuntu.ru/).