Автоматически устанавливать выход звука HDMI при подключении / отключении

Обычная установка, развертывание или скрипты

Используйте debconf для предварительной настройки. Это не приведет к согласию на получение лицензии:

echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | sudo debconf-set-selections
sudo apt-get install ttf-mscorefonts-installer

С Kickstart

Добавьте это в свой файл Kickstart.cfg:

preseed --owner ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula boolean true
1
задан 3 March 2013 в 04:12

4 ответа

В интересах людей, которые спотыкаются на этот вопрос - решение Салема почти сработало для меня в 13.04, я закончил тем, что собирал кусочки со всего Интернета, я думаю, что для меня был нарушитель отсутствия переменных окружения PULSE_SERVER

Вот мое полное решение, которое в основном повторяет решение Салема с несколькими недостающими частями. Я также изменил его как сценарий оболочки (несмотря на мою любовь к Python), потому что сначала я испугался, что мой скрипт Python запущен в проблемные пути импорта:

(то же, что и у Salem's ответ) Создайте файл /etc/udev/rules.d/hdmi_sound.rules как root с содержимым:

SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"

Создайте файл /usr/local/bin/hdmi_sound_toggle как root с содержимым:

#!/bin/sh
USER_NAME=`who | grep "(:0)" | cut -f 1 -d ' '`
USER_ID=`id -u $USER_NAME`
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`

export PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native"

if [ $HDMI_STATUS = "connected" ]
then
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

Затем сделайте его исполняемым с chmod 0755 /usr/local/bin/hdmi_sound_toggle

Я попытался сделать этот сценарий как можно более общим, но вам все равно может потребоваться изменить некоторые строки, такие как путь к файлу HDMI_STATUS или используемые профили. Вы можете просмотреть список профилей, запустив pactl list cards и посмотрев в разделе «Профили».

Обратите внимание, что сценарий не удался для меня, когда я удалил ключевое слово «экспорт» при установке PULSE_SERVER, я думаю, pactl ищет env variable

Не забудьте перезагрузить свои правила udev: sudo udevadm control --reload-rules

Обновление этого скрипта обновлено для 14.04. До этого вы использовали бы USER_NAME вместо USER_ID везде

11
ответ дан 25 May 2018 в 00:54
  • 1
    Обратите внимание, что мне нужно было добавить команду | uniq в команду USER_NAME. Также обратите внимание, что настройки звука в Ubuntu могут обманывать. Я не видел изменений в панели настроек звука, но как только я играл что-то, звук автоматически переключался взад и вперед, я также заметил, что после нескольких раз подключения и отсоединения HDMI сценарий перестает работать (возможно, некоторые своего рода ошибка в udev). – FuegoFro 7 July 2014 в 06:24
  • 2
    Я добавил | sort -u к имени пользователя, потому что он говорил о дополнительной опции elemer elemer --- Мое имя пользователя. То же, что и решение FuegoFro в конце дня. – elemer82 8 October 2014 в 03:46
  • 3
    Я использовал | grep -v pts, потому что на самом деле я получил «root». пользователь там тоже - из-за того, что я редактировал скрипт через kate, у которого был открыт корневой терминал. – Auspex 8 March 2015 в 05:49
  • 4
    Продолжайте получать "Ошибка соединения: соединение отклонено pa_context_connect () не удалось: соединение отклонено " при запуске pactl. : \ – Tomislav Nakic-Alfirevic 6 January 2018 в 03:09

Основываясь на ответе Салема и ответе даниэля

, я отвел ответ Салема и ответ Дэниела и внес некоторые необходимые изменения, их решение не сработало для меня из коробки:

(это похоже на ответ Салема).

Создайте файл /etc/udev/rules.d/hdmi_sound.rules с правами пользователя:

SUBSYSTEM=="drm", RUN+="/usr/local/bin/hdmi_sound_toggle"

Примечание ACTION=="change", отсутствует!

Создайте файл /usr/local/bin/hdmi_sound_toggle как root с содержимым:

#!/bin/sh
USER_NAME=`who | grep "(:0)" | cut -f 1 -d ' '| sort -u`
USER_ID=`id -u $USER_NAME`
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`

export PULSE_SERVER="unix:/run/user/"$USER_ID"/pulse/native"

if [ $HDMI_STATUS = "connected" ]
then
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
    sudo -u $USER_NAME pactl --server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi

Примечание USER_NAME = who | grep "(:0)" | cut -f 1 -d ' '| sort -u Я добавил | sort -u, потому что в противном случае он вернулся с elemer elemer elemer - -my username 3 раза.

Затем сделайте его исполняемым с помощью chmod 0755 /usr/local/bin/hdmi_sound_toggle

Не забудьте перезагрузить свои правила udev: sudo udevadm control --reload-rules

Важно это скрипт обновлен для 14.04. До этого вы использовали бы USER_NAME вместо USER_ID везде

Кредиты: Salem и daniel.

3
ответ дан 25 May 2018 в 00:54

Это первый раз, когда я пришел сюда за помощью в этом ... Я нахожусь в той же лодке 12.10. Это раздражает. Так было с 10.10 по моему опыту. Там где-то должен быть конфиг, который может справиться с этим.

EDIT: http://voices.canonical.com/david.henningsson/2012/04/14/audio-over-hdmi-and-displayport -in-ubuntu-12-04 /

Это сделано специально. Это ужасно.

2
ответ дан 25 May 2018 в 00:54

Ubuntu 16.04 - 17.04 Ответ

Это работает для Ubuntu 16.04 - 17.04, в котором была введена ошибка с Pulse Audio 8. Создайте файл hotplugtv (или hotplug-hdmi, если хотите) и скопируйте в следующие строки:

#!/bin/bash

# NAME: hotplugtv
# PATH: /home/$USER/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-hotplugtv.rules 
#       and /home/$USER/bin/lock-screen-timer
# DATE: Created Nov 26, 2016.
# NOTE: logs output using log-file
# UPDT: Dec 14, 2016 - Sometimes /sys/class/drm/card0 & sometimes /sys/class/drm/card1
#       so use /sys/class/dmcard* instead.
#       Dec 21, 2016 - Relocated to /home/$USER/bin for calling by lock-screen-timer
#       Aug 06, 2017 - Convert from home grown log-file to universal logger command.

if [[ $(cat /sys/class/drm/card*-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
        logger -t /home/rick/bin/log-hotplugtv "HDMI TV connected"
        /bin/sleep 2;
        export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
        sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
else
        logger -t /home/rick/bin/log-hotplugtv "HDMI TV disconnected"
        export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
        sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
fi

exit 0

ВАЖНО: измените имя пользователя «rick» на ваше имя пользователя.

Чтобы вызвать этот скрипт из udev во время событий hot-plug, создайте файл /etc/udev/rules.d/99-hotplugtv.rules, содержащий:

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/home/rick/bin/hotplugtv"

Измените /home/rick/bin/ на путь, по которому вы разместили скрипт hotplugtv.

1
ответ дан 25 May 2018 в 00:54
  • 1
    Спасибо огромное! Он работал и на Ubuntu 17.04! Это давно исказило меня, и это было простое решение :) – Georgi Koemdzhiev 9 June 2017 в 18:37
  • 2
    Вас больше всего приветствуют. Спасибо за комментарий, подтверждающий, что он нужен и для 17.04. – WinEunuuchs2Unix 9 June 2017 в 20:12

Другие вопросы по тегам:

Похожие вопросы: