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

10

Я пытаюсь заставить свой ноутбук переключать звук на 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
[email protected]: ~

# 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
[email protected]: ~

# 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 }'))

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

    
задан Kingamajick 30.04.2014 в 09:22
источник

7 ответов

8
  1. Проверить наличие доступных карт & amp; Профили

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

    pactl [options] set-card-profile  CARD PROFILE
    

(Поэтому нет необходимости вручную переключаться с Sound Settings)

Ссылка:

pactl -h & amp; man pactl

    
ответ дан user.dz 08.05.2014 в 23:39
источник
5

На основе этой ссылки и этого link ... я тестировал и WORKS FINE ubuntu 14.04

вы должны создать правило в /etc/udev/rules.d/100-hdmi_sound.rules

с этим контентом

SUBSYSTEM=="drm", ACTION=="change", RUN+="/lib/udev/hdmi_sound_toggle.sh"

затем создайте

sudo -H gedit /lib/udev/hdmi_sound_toggle.sh

с вашим контентом

#!/bin/bash

HDMI_STATUS='cat /sys/class/drm/card0/*HDMI*/status'
INPUTS=($(pacmd list-sink-inputs | grep index | awk '{print }'))
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

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

    
ответ дан Sk. 09.08.2014 в 22:33
3

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

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

#!/bin/bash
## From: https://ubuntugeeks.com/questions/11083/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04"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, но я не знаю, как это сделать.

    
ответ дан Joe 06.08.2014 в 19:58
2

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

Ссылка

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

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

    
ответ дан Nat Azodnem 10.08.2016 в 08:14
2

Приведенные скрипты не работали для меня с udev из коробки на Ubuntu 14.04, мне пришлось добавить:

export DISPLAY=:0

в начале, преобразуйте две команды pacmd в pactl и, наконец, запустите скрипт, используя sudo -s -u (пользователь) из правила udev.

#!/bin/bash
## From: https://ubuntugeeks.com/questions/11083/switching-to-hdmi-audio-when-hdmi-is-plugged-into-a-laptop-14-04"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
    
ответ дан Ken 22.09.2014 в 01:32
0

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

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

    
ответ дан Treviño 07.02.2017 в 23:05
0

Скрипты Udev выполняются с правами администратора, но вы также должны знать, какой менеджер отображения вы используете. Эти скрипты должны работать, но вы должны разрешить им диспетчер отображения.

Найдите DM, который вы используете:

pgrep -a Xorg

См. параметр -auth, он покажет вам диспетчер дисплеев. Это может быть sddm ou lightdm в последних версиях 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. Следуйте за вкладками, чтобы создать файлы правил udev и сделать исполняемый файл сценария.

    
ответ дан LinuxHelper 10.02.2017 в 13:20