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

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

我试图让我的笔记本电脑在插入时将音频切换至 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 之前触发脚本时,脚本出现没有此类接收器的错误。

答案1

基于此关联和这个关联...我测试过并且工作正常 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

我希望能帮上忙。抱歉我的英语不好,我说的是西班牙语

答案2

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

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

    pactl [options] set-card-profile  CARD PROFILE
    

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

参考:

pactl -h&man pactl

答案3

我在执行此操作时遇到了一些麻烦。我复制了原始脚本并按照建议进行了修改,现在它可以正常工作了。

我将其包含在这里以便其他人更容易使用。

#!/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 来触发它,但我不知道如何做到这一点。

答案4

好吧,所有提供的脚本对我来说都不起作用(Ubuntu 16.04),但是我发现此应用程序指示器允许您只需单击一下即可更改声音输出:

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

(注意:您需要先安装appindicator包sudo apt-get install python-appindicator:)

只是想把它留在这里,给那些可能和我处于同样情况的人,尽管这是一个替代解决方案......但它使它变得非常容易并且它是离散的;-)

相关内容