将HDMI插入笔记本电脑时切换到HDMI音频(14.04)


12

我试图让我的笔记本电脑在插入音频时将音频切换为HDMI,并在移除音频时将音频切换回标准模拟。

我设置了一个udev规则来触发脚本来执行切换,但是我无法使它正常工作:

  • 看来,直到我在“声音设置”中选择了HDMI音频输出,才将其识别为可用的接收器,而且一旦选择了HDMI音频输出,就不再列出模拟输出。

见下面:

# 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之前,触发脚本时,脚本会提示没有此类沉陷。


Answers:


9
  1. 检查可用的卡和配置文件

    pactl list cards
    
  2. 在设置默认接收器和移动流之前,将以下命令添加到脚本以更改配置文件

    pactl [options] set-card-profile  CARD PROFILE
    

(因此无需从“声音设置”手动切换)

参考:

pactl -hman pactl


9

基于此链接和此链接 ...我已测试并使用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 $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

在Ubuntu 14.04上使用udev开箱即用时,提供的脚本对我不起作用,我必须添加:

export DISPLAY=:0

首先,将两个pacmd命令转换为pactl,最后使用udev规则中的sudo -s -u(用户)运行脚本。

#!/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 listpactl 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选项,它将向您显示显示管理器。在最新的Ubuntu版本中可能是sddm或lightdm。

该行必须作为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规则文件并使脚本可执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.