Перехід на HDMI Audio, коли HDMI підключається до ноутбука (14.04)


12

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


Відповіді:


9
  1. Перевірте наявність карток та профілів

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

    pactl [options] set-card-profile  CARD PROFILE
    

(Тому не потрібно перемикати його вручну з налаштувань звуку)

Довідка:

pactl -h & man pactl


9

Грунтуючись на цьому посиланні та на цьому посиланні ... я протестував і РОБОТИ ТУТ 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 $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

Я сподіваюся, що може допомогти .. вибачте за мою англійську, я розмовляв іспанською


4

У мене були проблеми після цього. Я скопіював оригінальний сценарій і змінив його, як було запропоновано, і зараз він працює.

Я включаю його сюди, щоб полегшити користування іншим.

#!/bin/bash
## From: /ubuntu/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, але я не знаю, як це зробити.


1
Це не працює 16.04. Я знову працюю над цим.
Джо

3

Надані сценарії не працювали для мене, коли udev вийшов з поля в Ubuntu 14.04, мені довелося додати:

export DISPLAY=:0

на початку перетворіть дві команди pacmd в pactl і, нарешті, запустіть скрипт, використовуючи sudo -s -u (користувач) з правила udev.

#!/bin/bash
## From: /ubuntu/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

2

Ну, всі надані сценарії не працювали для мене (Ubuntu 16.04), але я знайшов цей додаток, який дозволяє змінювати вихід звуку лише одним клацанням миші:

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

(Примітка: вам необхідно встановити пакет appindicator першим: sudo apt-get install python-appindicator)

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


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

Тут пов'язана суть .


У мене був аналогічний сценарій, який працював за допомогою, card0але одного разу він перейшов на card1так, що я змінив сценарій, а потім наступного дня він змінився card0. Врешті-решт я змінив код на card*і з того часу все добре. Просто нахиливши голову, якщо з вами трапиться щось подібне.
WinEunuuchs2Unix

0

Сценарії Udev запускаються як root, але ви також повинні знати, який диспетчер дисплеїв ви використовуєте. Цей сценарій повинен працювати, але ви повинні уповноважити цей диспетчер дисплеїв для цього.

Знайдіть DM, який ви використовуєте:

pgrep -a Xorg

Дивіться опцію -auth, вона покаже вам менеджер дисплеїв. Це може бути sddm ou lightdm у останніх версіях Ubuntu.

Цей рядок повинен бути експортований як змінна XAUTHORITY, як це:

ls /car/run/sddm*

наприклад, це може бути дійсний вихід:

/var/lib/mdm/ceed.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 та зробити сценарій виконуваним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.