Dan*_*iel 12
为了偶然发现这个问题的人的利益 - 塞勒姆的解决方案在 13.04 几乎对我有用,我最终从网络上收集了一些零碎的东西,我认为对我来说破坏交易的是缺少环境变量 PULSE_SERVER
这是我的完整解决方案,它基本上是重复塞勒姆的解决方案,但缺少一些缺失的部分。我还把它重做为一个 shell 脚本(尽管我很喜欢 Python),因为一开始我担心我的 Python 脚本会遇到导入路径问题:
(与塞勒姆的回答相同)/etc/udev/rules.d/hdmi_sound.rules以 root 身份创建一个文件,内容如下:
SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"
Run Code Online (Sandbox Code Playgroud)
/usr/local/bin/hdmi_sound_toggle以 root 身份创建一个文件,内容如下:
SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"
Run Code Online (Sandbox Code Playgroud)
然后使其可执行 chmod 0755 /usr/local/bin/hdmi_sound_toggle
我试图使这个脚本尽可能通用,但您仍然可能需要更改一些行,例如 HDMI_STATUS 文件路径或使用的配置文件。您可以通过运行pactl list cards并查看配置文件来查看配置文件列表。
请注意,当我在设置 PULSE_SERVER 时删除关键字“export”时脚本失败了,我认为 pactl 正在寻找 env 变量
不要忘记重新加载您的 udev 规则: sudo udevadm control --reload-rules
更新此脚本已更新为 14.04。在此之前,您将在任何地方使用 USER_NAME 而不是 USER_ID
这适用于 Ubuntu 16.04 - 20.04,它引入了 Pulse Audio 8 的错误。创建文件hotplugtv(或者hotplug-hdmi如果您愿意)并复制以下行:
#!/bin/bash
# NAME: hotplugtv
# PATH: /home/$USER/bin
# DESC: Update pulseaudio output device when HDMI TV plugged / unplugged
# CALL: called from /etc/udev/rules.d/99-hotplugtv.rules
# and /home/$USER/bin/lock-screen-timer
# 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.
# Dec 21, 2016 - Relocated to /home/$USER/bin for calling by lock-screen-timer
# Aug 06, 2017 - Convert from home grown log-file to universal logger command.
if [[ $(cat /sys/class/drm/card*-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
logger -t /home/rick/bin/log-hotplugtv "HDMI TV connected"
/bin/sleep 2;
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:hdmi-stereo;
else
logger -t /home/rick/bin/log-hotplugtv "HDMI TV disconnected"
export PULSE_RUNTIME_PATH="/run/user/1000/pulse/";
sudo -u rick -E pacmd set-card-profile 0 output:analog-stereo;
fi
exit 0
Run Code Online (Sandbox Code Playgroud)
重要提示:将用户名“rick”更改为您的用户名。
为了udev在热插拔事件期间调用此脚本,创建/etc/udev/rules.d/99-hotplugtv.rules包含以下内容的文件:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/home/rick/bin/hotplugtv"
Run Code Online (Sandbox Code Playgroud)
更改/home/rick/bin/为放置脚本的路径hotplugtv。
我终于设法使用udev. 因此,如果有人想要相同的行为,请执行以下步骤:
首先,我们需要创建一个/etc/udev/rules.d/hdmi_sound.rules包含以下内容的文件:
SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_sound_toggle"
Run Code Online (Sandbox Code Playgroud)
这将使每次 HDMI 连接发生变化时udev执行脚本hdmi_sound_toggle。该脚本必须有执行权限,内容如下:
#!/usr/bin/env python
import subprocess
from syslog import syslog
def output(cmd):
return subprocess.check_output(cmd, shell=True)
# the following variables may need some modification.
user = "my_username"
card = "/sys/class/drm/card0"
dev_speaker = "output:analog-stereo+input:analog-stereo"
dev_hdmi = "output:hdmi-stereo+input:analog-stereo"
#
interfaces = output("ls {0}".format(card), ).split("\n")
vga = filter(lambda x: "VGA" in x, interfaces)[0]
hdmi = filter(lambda x: "HDMI" in x, interfaces)[0]
syslog("HDMI connection was changed!")
hdmi_connected = output("cat {0}/{1}/status".format(card,hdmi)).startswith("connected")
title = "HDMI was {0}".format("connected" if hdmi_connected else "disconnected")
message = "Audio output has changed to {opt}.".format(opt = "HDMI" if hdmi_connected else "built-in speakers")
cmd = "sudo -u " + user + " /usr/bin/pactl set-card-profile 0 " + (dev_hdmi if hdmi_connected else dev_speaker)
syslog("HDMI was connected." if hdmi_connected else "HDMI was disconnected.")
try:
a = output(cmd)
output("sudo -u {0} notify-send \"{1}\" \"{2}\"".format(user, title, message))
syslog("Audio output changed.")
except Exception as ex:
syslog("Error changing output device: " + str(ex))
Run Code Online (Sandbox Code Playgroud)
可能这可以用 bash 轻松实现,但由于我的主要语言是 python,所以我使用了它。除了通知之外,一切正常:它没有出现,我真的不知道为什么。如果有人知道如何解决它,请说点什么。
注意:script/udev 规则的名称可以更改,但需要使用完整路径。
| 归档时间: |
|
| 查看次数: |
17729 次 |
| 最近记录: |