Вопрос или проблема
Я использую XUbuntu 16.04. Ранее у меня были подключены колонки к аналоговому выходу, и звук автоматически переключался на наушники, когда их подключали. Все это происходило на одном выходном устройстве (звуковая карта материнской платы).
Теперь у меня новый монитор с встроенными динамиками, но без аналогового подключения, поэтому я получаю звук через DisplayPort от моей Radeon R9 270. Я хотел бы, чтобы pulseaudio переключал существующие потоки и новые потоки на порт для наушников на звуковой карте материнской платы, когда я втыкаю наушники, и обратно на порт DP на видеокарте, когда я их снова отключаю.
Я пробовал использовать pactl load-module module-switch-on-connect
, но, похоже, это не оказывает никакого эффекта, вероятно, потому что подключение наушников не создает нового устройства вывода, только новый порт.
Я знаю из прочитанных других вопросов, что могу сделать это вручную с помощью pactl/pacmd, и я сделаю это, если придется, но мне бы гораздо больше понравилось, если бы это происходило автоматически. Мне не против, если мне придется написать скрипт для этого, но есть ли какой-то хук, который я могу перехватить, чтобы получить уведомление, когда наушники подключены или отключены?
Я нашел решение благодаря этой дискуссии и paswitch. В общем, acpid можно использовать для перехвата событий подключения/отключения наушников.
Я создал следующие файлы:
/etc/acpi/events/headphone-jack:
event=jack/headphone
action=/etc/acpi/headphone-jack.sh %e
/etc/acpi/headphone-jack.sh (не забудьте сделать его исполняемым):
#!/bin/bash
set -e -u
if [ "$1" = "jack/headphone" -a "$2" = "HEADPHONE" ]; then
case "$3" in
plug)
sink=alsa_output.pci-0000_00_1b.0.analog-stereo
;;
*)
sink=alsa_output.pci-0000_01_00.1.hdmi-stereo
;;
esac
for userdir in /run/user/*; do
uid="$(basename $userdir)"
user="$(id -un $uid)"
if [ -f "$userdir/pulse/pid" ]; then
PULSE_RUNTIME_PATH="$userdir/pulse" su "$user" -c "paswitch $sink"
fi
done
fi
Выходные устройства, естественно, нужно обновить в зависимости от вашей системы.
Я не уверен, насколько надежен скрипт в реальной многопользовательской системе, но он работает для меня.
Ответ или решение
Автоматическое переключение выходного устройства в PulseAudio при подключении наушников
Ваша проблема с автоматическим переключением звукового вывода в PulseAudio при подключении наушников является распространённой задачей среди пользователей Ubuntu и производных дистрибутивов, таких как XUbuntu 16.04. В условиях, когда используются разные источники звука (в данном случае HDMI через DisplayPort и аналоговый выход), качественное управление аудиоустройствами требует дополнительных настроек.
Характеристика проблемы
Вы ранее использовали аналоговый выход для колонок, и всё работало исправно: звук автоматически переключался на наушники при их подключении и отключении. Однако с переходом на использование HDMI с встроенными динамиками на мониторе звук по умолчанию продолжает воспроизводиться через этот интерфейс. Ваша цель заключается в том, чтобы автоматически переключать выходной поток на наушники, когда они подключены, и обратно на HDMI, когда они отключаются.
Решение с использованием acpid и скрипта
Ваше решение, основанное на использовании acpid
для отслеживания событий подключения и отключения наушников, является отличным подходом. Ниже будет дано подробное описание настройки.
-
Установка acpid
Убедитесь, чтоacpid
установлен на вашем компьютере. Для установки выполните команду:sudo apt-get install acpid
-
Конфигурация acpi
Создайте файл конфигурации для события подключения наушников. Это позволит вашему скрипту реагировать на изменения состояния устройства.sudo nano /etc/acpi/events/headphone-jack
Вставьте следующий код:
event=jack/headphone action=/etc/acpi/headphone-jack.sh %e
-
Создание скрипта для переключения
Создайте скрипт, который будет выполнять действия при подключении и отключении наушников:sudo nano /etc/acpi/headphone-jack.sh
И вставьте следующий код:
#!/bin/bash set -e -u if [ "$1" = "jack/headphone" -a "$2" = "HEADPHONE" ]; then case "$3" in plug) sink=alsa_output.pci-0000_00_1b.0.analog-stereo ;; *) sink=alsa_output.pci-0000_01_00.1.hdmi-stereo ;; esac for userdir in /run/user/*; do uid="$(basename $userdir)" user="$(id -un $uid)" if [ -f "$userdir/pulse/pid" ]; then PULSE_RUNTIME_PATH="$userdir/pulse" su "$user" -c "paswitch $sink" fi done fi
-
Выдача прав на выполнение
Не забудьте сделать скрипт исполняемым:sudo chmod +x /etc/acpi/headphone-jack.sh
-
Перезагрузка acpid
После внесения изменений перезагрузите службуacpid
для применения настроек:sudo systemctl restart acpid
Проверка работы
Чтобы убедиться, что всё работает корректно, подключите и отключите наушники. Вы должны услышать, как система автоматически переключает аудиовыход.
Заключение
Создание такой системы автоматического переключения требует минимальных навыков программирования и работы с командной строкой, однако по завершении настройки вы получите удобный и эффективный способ управления аудиоустройствами в вашей системе. Следуя данным шагам, вы обеспечите высокий уровень удобства и функциональности в использовании аудиологических средств вашего устройства.