![Установить аудиовыход по умолчанию, если есть только один приемник](https://rvso.com/image/1072915/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B0%D1%83%D0%B4%D0%B8%D0%BE%D0%B2%D1%8B%D1%85%D0%BE%D0%B4%20%D0%BF%D0%BE%20%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E%2C%20%D0%B5%D1%81%D0%BB%D0%B8%20%D0%B5%D1%81%D1%82%D1%8C%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D0%BE%D0%B4%D0%B8%D0%BD%20%D0%BF%D1%80%D0%B8%D0%B5%D0%BC%D0%BD%D0%B8%D0%BA.png)
Я только что установил Ubuntu 22.04.1 LTS (после использования 18.04). В меню конфигурации звука есть эти варианты вывода, из которых я использую второй вариант (S/PDIF), и при его выборе звук работает просто отлично.
Но после каждой перезагрузки аудиовыход сбрасывается на выход HDMI, а мне нужно, чтобы он по умолчанию был S/PDIF. Решения, которые я нашел (и использовал в предыдущих установках), включают выбор правильного приемника для Pulseaudio, но, похоже, у меня сейчас только один приемник! Вывод pactl list short sinks
:
6 alsa_output.pci-0000_00_0e.0.hdmi-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
В выходных данных aplay -l
также, похоже, нет никаких следов S/PDIF:
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC283 Analog [ALC283 Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 1: ALC283 Digital [ALC283 Digital]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 9: HDMI 3 [HDMI 3]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 10: HDMI 4 [HDMI 4]
Subdevices: 1/1
Subdevice #0: subdevice #0
Так где же он?! Откуда берутся альтернативы меню? И как мне сделать S/PDIF по умолчанию?
решение1
Я копнул глубже и нашел два рабочих решения, из которых меня полностью устраивает номер 2.
Решение 1: Явный ALSA-sink
Я понял, что первые два перечисленных подустройства aplay -l
на самом деле являются S/PDIF, поскольку воспроизведение звуков из Java (как я делаю вмой собственный музыкальный проигрыватель) работает с выходным устройством, установленным на , plughw:0,0
или plughw:0,1
со светодиодами на моем ЦАП, изменяющимися соответствующим образом в соответствии с частотой дискретизации.
Чтобы один из них был выбран по умолчанию, нужно добавить
load-module module-alsa-sink
load-module module-alsa-source device=hw:0,1
в мой ~/.config/pulse/default.pa
(скопировано из /etc/pulse/
). Это добавляет опцию «Встроенный звук» в меню вывода звука, которая выбирается по умолчанию. Это фактически псевдоним для опции S/PDIF (что я нахожу немного раздражающим в этом решении).
Решение 2: набор-карт-профиль
Команда Pulseaudioсписок-картыраскрывает некоторую интересную информацию. В pacmd list-cards
выводе указана карта с именем alsa_card.pci-0000_00_0e.0
, которая имеетпортыраздел, содержащий строку:
iec958-stereo-output: Digital Output (S/PDIF) (priority 0, latency offset 0 usec, available: unknown)
Это производится module-udev-detect
, и должно быть там, где настройки звука получают информацию о выходе, который он перечисляет как S/PDIF. Глядя насписок-картывыход с различными выборами выходов в меню настроек звука, я обнаружил, что разница была в том, что было установлено как «активный профиль». Это,я нашел, можно изменить с помощью set-card-profile
. Добавление
set-card-profile alsa_card.pci-0000_00_0e.0 output:iec958-stereo+input:analog-stereo
чтобы ~/.config/pulse/default.pa
работало в том смысле, что я получал выход S/PDIF после pulsaudio -k
, но после перезагрузки и входа в систему вывод звука былвсе ещебыть настроен на HDMI. (Очевидно, что-то еще, а не инициализация Pulseaudio, изменяет настройки профиля карты.) Поэтому вместо этого я default.pa
снова удалил свой локальный и добавил команду
pacmd set-card-profile alsa_card.pci-0000_00_0e.0 output:iec958-stereo+input:analog-stereo
какзапуск приложения. Казалось, это сработало, пока не включилась заставка... Когда экран выходит из заставки, профиль картысноваизменено на что-то другое! Решение, которое я нашел для этого, было создание скрипта, который прослушивает события заставки, проверяет настройки профиля карты, когда заставка активируется, и возвращает их к этому, когда заставка отключается. Скрипт является измененной версией того, что вэтот ответ (который касается настройки приемника, а не профиля карты), и выглядит так:
#!/bin/bash
my_card="alsa_card.pci-0000_00_0e.0"
watch="type=signal,interface=org.gnome.ScreenSaver"
screen_locked_signal="boolean true"
screen_unlocked_signal="boolean false"
_get_active_profile() {
pacmd list-cards | sed -n 's/^\s*[Aa]ctive\s\s*[Pp]rofile:\s*<\([^>]*\)>/\1/p'
}
last_profile=$(_get_active_profile)
# Watch for screensaver D-Bus signals
dbus-monitor --session "$watch" | ( \
while read signal; do
if [[ "$signal" =~ "$screen_locked_signal" ]]; then
# Screen locked: remember the current profile
last_profile=$(_get_active_profile)
elif [[ "$signal" =~ "$screen_unlocked_signal" ]]; then
# Screen unlocked: restore the last profile
pacmd set-card-profile "$my_card $last_profile"
fi
done)
Добавление этого скрипта в автозагрузку приложений избавляет от проблемы с заставкой.