Я пытаюсь заставить свой ноутбук переключать звук на HDMI, когда он подключен, и обратно на стандартный аналоговый, когда он отключен.
Я установил правило udev для запуска сценария, выполняющего переключение, однако у меня возникают проблемы с его настройкой:
См. Ниже:
# HDMI plugged in, not selected in Sound settings.
$ pactl list short sinks
5 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
kingamajick@kingamajick-laptop: ~
# HDMI selected in sound settings
$ pactl list short sinks
7 alsa_output.pci-0000_00_1b.0.hdmi-stereo module-alsa-card.c s16le 2ch 48000Hz SUSPENDED
kingamajick@kingamajick-laptop: ~
# HDMI removed
$ pactl list short sinks
9 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 48000Hz SUSPENDED
Скрипт, который я использую для переключения вывода, выглядит следующим образом:
#!/bin/bash
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
if [ $HDMI_STATUS = "connected" ]
then
pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo &> /dev/null; done
else
pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo &> /dev/null; done-server $PULSE_SERVER set-card-profile 0 output:analog-stereo+input:analog-stereo
fi
Скрипт выдает ошибку о том, что нет когда я запускаю его, прежде чем выбрать HDMI в настройках звука.
Проверка на доступные карты & профили
pactl list cards
Добавляют следующую команду к сценарию для изменения профиля прежде, чем установить приемник по умолчанию & движущиеся потоки
pactl [options] set-card-profile CARD PROFILE
(Так никакая потребность переключить его вручную со Звуковых Настроек)
Ссылка:
pactl -h
& man pactl
Базирующийся в этом ссылка и этом ссылка ... я протестировал и ХОРОШО РАБОТАЮ человечность 14.04
, необходимо создать правило в /etc/udev/rules.d/100-hdmi_sound.rules
whith, который это содержание
SUBSYSTEM=="drm", ACTION=="change", RUN+="/lib/udev/hdmi_sound_toggle.sh"
тогда создает
sudo -H gedit /lib/udev/hdmi_sound_toggle.sh
whith содержание
#!/bin/bash
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
if [ $HDMI_STATUS = "connected" ]
then
pactl set-card-profile 0 output:hdmi-stereo
pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo &> /dev/null; done
else
pactl set-card-profile 0 output:analog-stereo
pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo &> /dev/null; done
fi
я, Надежда может помочь.. жаль о моем английском языке я говорил на испанском языке
Я испытал немного затруднений после этого. Я скопировал исходный сценарий и изменил его, как предложено, и теперь он работает.
я включаю его здесь, чтобы облегчить для кого-то еще использовать.
#!/bin/bash
## From: https://askubuntu.com/questions/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now
##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))
if [ $HDMI_STATUS = "connected" ]
then
pactl set-card-profile 0 output:hdmi-stereo
pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo &> /dev/null; done
else
pactl set-card-profile 0 output:analog-stereo
pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
for i in ${INPUTS[*]}; do pacmd move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo &> /dev/null; done
fi
Теперь, я был бы точно так же, как для инициирования его с udev, но я невежествен относительно того, как сделать это.
Ну, все предоставленные сценарии не работали на меня (Ubuntu 16.04), но я нашел этот индикатор приложения, который позволяет Вам изменять звуковой вывод во всего одном щелчке:
https://github.com/lkettenb/sound-output-switcher
(примечание: необходимо установить appindicator пакет сначала: sudo apt-get install python-appindicator
)
Просто мысль я оставил бы это здесь для других, которые могли бы быть в той же ситуации как я, даже при том, что это - альтернативное решение..., но она делает это довольно легким, и это дискретно ;-)
Предоставленные сценарии не работали на меня с udev из поля на Ubuntu 14.04, я должен был добавить:
export DISPLAY=:0
вначале, преобразуйте две команды pacmd в pactl и наконец запустите скрипт с помощью sudo-s-u (пользователь) от правила udev.
#!/bin/bash
## From: https://askubuntu.com/questions/458194/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04
## Script needs to be triggered by a udev rule
## Works manually now
export DISPLAY=:0
##source ${HOME}/bin/bash_trace
HDMI_STATUS=`cat /sys/class/drm/card0/*HDMI*/status`
INPUTS=($(pactl list sink-inputs | grep Input | awk '{print $3}' | sed -r 's/^.{1}//')
if [ $HDMI_STATUS = "connected" ]
then
pactl set-card-profile 0 output:hdmi-stereo
pactl set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.hdmi-stereo &> /dev/null; done
else
pactl set-card-profile 0 output:analog-stereo
pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
for i in ${INPUTS[*]}; do pactl move-sink-input $i alsa_output.pci-0000_00_1b.0.analog-stereo &> /dev/null; done
fi
Снова другое решение (протестированная работа в 16,04) на основе предыдущего, но с некоторыми улучшениями, который работает с помощью надлежащего pactl
указывающий на правильный сервер (это может быть улучшено для автоматического получения названий карт и профилей, обратитесь к pactl list
или pactl info
на данный момент).
#!/bin/bash
USER_NAME=$(who | grep tty$(sudo fgconsole) | cut -f1 -d' ')
USER_ID=$(id -u "$USER_NAME")
HDMI_STATUS=$(</sys/class/drm/card0/*HDMI*/status)
HDMI_CARD="pci-0000_00_03.0"
HDMI_PROFILE="hdmi-stereo-extra1"
INTERNAL_CARD="pci-0000_00_1b.0"
INTERNAL_PROFILE="analog-stereo"
export LANG=C
export PULSE_SERVER="unix:/run/user/$USER_ID/pulse/native"
function pactl_cmd() {
sudo -u $USER_NAME pactl --server $PULSE_SERVER $*
}
if [ "$HDMI_STATUS" = "connected" ]; then
CARD=$HDMI_CARD
OUTPUT=$HDMI_PROFILE
else
CARD=$INTERNAL_CARD
OUTPUT=$INTERNAL_PROFILE
fi
pactl_cmd set-default-sink alsa_output.$CARD.$OUTPUT
pactl_cmd set-card-profile alsa_card.$CARD output:$OUTPUT
INPUTS=($(pactl_cmd list sink-inputs | grep "^Sink Input #"|cut -d# -f2))
for i in ${INPUTS[*]}; do
pactl_cmd move-sink-input $i alsa_output.$CARD.$OUTPUT
done
Связанный суть здесь .
Сценарии Udev работают как корень, но также необходимо знать, какого менеджера по оформлению Вы используете. Это пишет сценарий, должен работать, но необходимо разрешить тыс менеджера по оформлению делать это.
Находят DM, который Вы используете:
pgrep -a Xorg
Видят - подлинная опция, она покажет Вам менеджера по оформлению. Это мог быть sddm ou lightdm в lastest релизах Ubuntu.
Эта строка должна быть экспортирована как переменная XAUTHORITY, как это:
ls /car/run/sddm*
, например, это могло быть допустимым выводом:
/var/lib/mdm/:0. Xauth (Это будет использоваться сценарием)
Это - то, как Ваш сценарий должен быть похожим:
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=`ls /var/run/sddm*`
HDMI_STATUS="$(cat /sys/class/drm/card0-HDMI-A-1/status)"
USER=`whoami`
export XAUTHORITY=/home/$USER/.Xauthority
export DISPLAY=:0
if [ "$HDMI_STATUS" = connected ];
then
sudo -u $USER pactl set-card-profile 0 output:hdmi-stereo+input:analog-stereo
else
sudo -u $USER pactl set-card-profile 0 output:analog-stereo+input:analog-stereo
fi
exit 0
Это позволит Вашему менеджеру по оформлению изменять HDMI вывод. Следуйте за insctuctions, чтобы создать файлы правил udev и сделать исполняемый файл сценария.