Переключение на HDMI Audio, когда HDMI подключен к ноутбуку (14.04)

Я пытаюсь заставить свой ноутбук переключать звук на HDMI, когда он подключен, и обратно на стандартный аналоговый, когда он отключен.

Я установил правило udev для запуска сценария, выполняющего переключение, однако у меня возникают проблемы с его настройкой:

  • Похоже, что пока я не выбрал HDMI Audio вывод в настройках звука, он не распознается как доступный приемник, также после выбора выхода HDMI Audio аналоговый выход больше не отображается.

См. Ниже:

# 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 в настройках звука.

12
задан 27 January 2018 в 14:21

7 ответов

  1. Проверка на доступные карты & профили

    pactl list cards
    
  2. Добавляют следующую команду к сценарию для изменения профиля прежде, чем установить приемник по умолчанию & движущиеся потоки

    pactl [options] set-card-profile  CARD PROFILE
    

(Так никакая потребность переключить его вручную со Звуковых Настроек)

Ссылка:

pactl -h & man pactl

0
ответ дан 27 January 2018 в 14:21

Базирующийся в этом ссылка и этом ссылка ... я протестировал и ХОРОШО РАБОТАЮ человечность 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

я, Надежда может помочь.. жаль о моем английском языке я говорил на испанском языке

0
ответ дан 27 January 2018 в 14:21

Я испытал немного затруднений после этого. Я скопировал исходный сценарий и изменил его, как предложено, и теперь он работает.

я включаю его здесь, чтобы облегчить для кого-то еще использовать.

#!/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, но я невежествен относительно того, как сделать это.

0
ответ дан 27 January 2018 в 14:21

Ну, все предоставленные сценарии не работали на меня (Ubuntu 16.04), но я нашел этот индикатор приложения, который позволяет Вам изменять звуковой вывод во всего одном щелчке:

https://github.com/lkettenb/sound-output-switcher

(примечание: необходимо установить appindicator пакет сначала: sudo apt-get install python-appindicator)

Просто мысль я оставил бы это здесь для других, которые могли бы быть в той же ситуации как я, даже при том, что это - альтернативное решение..., но она делает это довольно легким, и это дискретно ;-)

2
ответ дан 27 January 2018 в 14:21

Предоставленные сценарии не работали на меня с 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
3
ответ дан 27 January 2018 в 14:21
  • 1
    Спасибо, я попытаюсь сделать. В/etc/fstab и в/etc/mtab я вижу монтирование, но в приложении запрос идет для таймаута в randomic время. – PaolaG 3 November 2015 в 21:37

Снова другое решение (протестированная работа в 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

Связанный суть здесь .

0
ответ дан 27 January 2018 в 14:21
  • 1
    Я должен ожидать повторения проблемы. It' s randomic, Это могло бы работать до завтра, или в течение 10 минут. – PaolaG 3 November 2015 в 21:52

Сценарии 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 и сделать исполняемый файл сценария.

0
ответ дан 27 January 2018 в 14:21
  • 1
    PaolaG Вы могли отредактировать свое сообщение, добавляющее код ошибки и информацию? Верный it' s полезный – gentooza 3 November 2015 в 21:56

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

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