pulseaudio: автоматическое переключение выхода при подключении наушников

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

Я использую 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 для отслеживания событий подключения и отключения наушников, является отличным подходом. Ниже будет дано подробное описание настройки.

  1. Установка acpid
    Убедитесь, что acpid установлен на вашем компьютере. Для установки выполните команду:

    sudo apt-get install acpid
  2. Конфигурация acpi
    Создайте файл конфигурации для события подключения наушников. Это позволит вашему скрипту реагировать на изменения состояния устройства.

    sudo nano /etc/acpi/events/headphone-jack

    Вставьте следующий код:

    event=jack/headphone
    action=/etc/acpi/headphone-jack.sh %e
  3. Создание скрипта для переключения
    Создайте скрипт, который будет выполнять действия при подключении и отключении наушников:

    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
  4. Выдача прав на выполнение
    Не забудьте сделать скрипт исполняемым:

    sudo chmod +x /etc/acpi/headphone-jack.sh
  5. Перезагрузка acpid
    После внесения изменений перезагрузите службу acpid для применения настроек:

    sudo systemctl restart acpid

Проверка работы

Чтобы убедиться, что всё работает корректно, подключите и отключите наушники. Вы должны услышать, как система автоматически переключает аудиовыход.

Заключение

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

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

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