我正在尝试为我的蓝牙接收器编写一个 udev 规则,该规则在连接时运行一个脚本来检查是否也添加了相应的音频设备,如果没有添加则重新连接。由于某种原因,当我打开接收器并自动连接时,首先没有添加音频设备。我使用管道线脉冲。
问题是我不知道如何让 udev 检查音频设备。pactl list
不能以 root 身份工作,但这没关系,因为从理论上讲,pw-cli list-objects
应该可以工作。所以我的脚本看起来像这样:
#!/bin/bash
sleep 3
# JR-CB1 connected but not available as audio device
if bluetoothctl devices Connected | grep "25:4E:4A:C7:43:C4" && ! pw-cli list-objects | grep "25_4E_4A_C7_43_C4"; then
# Reconnect
bluetoothctl disconnect 25:4E:4A:C7:43:C4
bluetoothctl connect 25:4E:4A:C7:43:C4
fi
在终端中,su
这工作得很好。如果没有音频设备,它将重新连接;如果有,则不执行任何操作。pw-cli list-objects | grep "25_4E_4A_C7_43_C4"
添加音频设备后的输出为
object.path = "bluez_output.25_4E_4A_C7_43_C4.1:monitor_0"
object.path = "bluez_output.25_4E_4A_C7_43_C4.1:monitor_1"
node.name = "bluez_output.25_4E_4A_C7_43_C4.1"
device.name = "bluez_card.25_4E_4A_C7_43_C4"
object.path = "bluez_output.25_4E_4A_C7_43_C4.1:playback_1"
object.path = "bluez_output.25_4E_4A_C7_43_C4.1:playback_0"
grep 返回值为 0,因此 if 语句不应运行。然而,虽然这在终端中有效,但在 udev 中由于某种原因它不起作用。当 udev 运行时记录脚本的输出时, 的输出pw-cli list-objects | grep "25_4E_4A_C7_43_C4"
为空并且返回值为 1,这意味着执行了重新连接,并且我得到了无限的重新连接循环。
为什么 udev 无法列出 pipeline 音频设备?还有别的办法吗?
我想我找到了解决方案。根据评论的建议,我研究了使用服务来启动脚本。为了让 systemd 知道设备事件,我使用了这个 udev 规则:
(我试图确定特定于我的蓝牙设备的属性,但如果没有 pipeline 设备,udev 似乎没有可用的唯一属性,因此每当任何 bt 设备连接时我都会启动该服务并让脚本处理识别。)
该服务如下所示:
这不是一个用户服务,因为
pw-cli
可以由 root 使用,但不能由 udev 运行。(我对 systemd 单元选项的理解还很初级,因此欢迎提出任何改进建议。)
该脚本与之前相同:
现在,当我连接设备时,脚本运行一次,找不到音频设备,重新连接 bt 设备,然后再次运行,但不执行任何操作,因为它在
pw-cli list-objects
.