背景
当声音从HDMI电视切换到笔记本电脑扬声器时,在暂停/恢复过程中我遇到了类似的问题。恢复后,声音将留在笔记本电脑扬声器上,我必须在System Settings
->中手动将输出设备重置为电视Sound
。
这是我最初从Ubuntu 14.04升级到16.04的烦人经历之一,其根源是升级到16.04 LTS附带的PulseAudio 8
经过大量搜索之后,我创建了一个名为的脚本TV-sound
。尽管我不像自己那样插拔电视,但我进行了一些Google搜索并创建了变体脚本以适合您的情况。我已经对其进行了测试,并且可以正常工作。
步骤1:创建脚本以在连接的设备之间切换音频
我们将创建一个称为hotplugtv
udev调用的脚本。尽管可以在许多地方调用同一脚本。例如,在测试期间,我lock-screen-timer
在屏幕锁定期间将声音恢复为笔记本电脑的情况下使用了它。
cd /usr/local/bin
sudo touch hotplugtv
sudo chmod +x hotplugtv
gksu gedit hotplugtv
当编辑器打开并显示空白屏幕时,将以下内容复制并粘贴到其中:
#! /bin/bash
# NAME: hotplugtv
# PATH: /usr/local/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-monitor-hotplug.rules
# DATE: Created Nov 26, 2016.
# NOTE: logs output using log-file
# UPDT: Dec 14, 2016 - Sometimes /sys/class/drm/card0 & sometimes /sys/class/drm/card1
# so use /sys/class/dmcard* instead.
if [[ $(cat /sys/class/drm/card*-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
# log-file "HDMI TV connected" ~/bin/log-hotplugtv;
/bin/sleep 2;
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
else
# log-file "HDMI TV disconnected" ~/bin/log-hotplugtv;
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
fi
exit 0
您将需要rick
用自己的用户ID(例如)替换两次出现的UTF-8
。
我知道通过自动将用户名设置为bash变量可以更加专业,但是我还不熟练:(无论如何,保存文件并退出gedit
。
步骤2:建立udev规则
当您插入和拔下HDMI监视器时,udev会监视热插拔事件。键入以下内容以创建新规则。
cd /etc/udev/rules.d
sudo cp 70-persistent-net.rules 99-hotplugtv.rules
gksu gedit 99-hotplugtv.rules
注意:如果目录70-persistent-net.rules
中不存在该文件,请在该目录中复制任何其他文件。我们不需要文件内容,仅需要文件许可权即可确保文件权限相同。
编辑器将显示一堆不相关的文本,突出显示并删除它。然后突出显示下面的代码并将其粘贴到编辑器中:
# NAME: 99-hotplugtv.rules
# PATH: /etc/udev/rules.d
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: automatically called on system events
# DATE: Created Nov 26, 2016.
# NOTE: in future may requre systemd service hooks
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/local/bin/hotplugtv"
保存文件并退出。
要启用该规则(不重新启动),我们需要重新加载udev:
sudo udevadm control --reload-rules
现在,您可以插入和拔下HDMI监视器/电视,并相应地切换声音。
警告
在我的系统上,拔下HDMI时,声音会自动恢复为笔记本电脑的扬声器。在您的系统上没有。如果在拔下HDMI时声音没有传到笔记本电脑扬声器上,则可能需要进一步增强代码。请通过下面的评论回复,看看事情如何/不成功。
在CLI中进行快速测试
您可以使用以下命令在终端上快速测试代码:
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
在PulseAudio中解密设备名称
下面的代码两次使用同一命令。声音设置为外部HDMI电视时一次。第二次将声音设置为笔记本电脑的内置扬声器时。每次您看到名称PulseAudio都会使用:
$ pacmd list-sinks | grep -e 'name:' -e 'index'
* index: 28
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>
───────────────────────────────────────────────────────────────────────────────
$ pacmd list-sinks | grep -e 'name:' -e 'index'
* index: 30
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
当您有多个声卡时
使用命令aplay -l
查看卡号是否大于0。如果是,则需要在脚本中使用适当的卡号。例如:
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: 92HD91BXX Analog [92HD91BXX Analog]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
Subdevices: 0/1
Subdevice #0: subdevice #0
在上面的示例中,具有不同输出源的所有卡号均为0。如果您有USB扬声器,则它们的卡号可以不同于0。
编辑2016年12月2日
由于某种未知的原因,该脚本今天已被破坏。上面的代码用来读取:“ $(cat / sys / class / drm / card0-HDMI-A-1 / status”,但是我不得不更改card0
为card1
上面的代码,因此无法修改。自2016年11月26日起在我的系统上运行,而不是常规Ubuntu更新。
编辑2016年12月14日
上面的代码需要再次切换回:“ $(cat / sys / class / drm / card0-HDMI-A-1 / status”。而不是根据启动之间card0
或之间的修改代码,而是card1
修改程序以引用card*
这两种情况。