Ubuntu为另一个用户设置了脉冲音频接收器



我正在运行一个带有displaylink 5.4.1的targus dock(DOCK191USZ(,它会定期崩溃,但会自动重新加载。不幸的是,当它这样做时,默认的声音输出被改回线路输出,而不是我的蓝牙扬声器。

我已经编写了一个脚本,用于检查蓝牙扬声器,如果已连接,则将音频输出更改回蓝牙扬声器,但是,如果我尝试以root用户身份运行该脚本,它将无法看到脉冲音频守护进程。

即使在将$XDG_RUNTIME_DIR变量设置为正确的用户PID之后,我仍然无法运行pacmd命令,因为它抱怨我不应该这么做。

XDG_RUNTIME_DIR (/run/user/1000) is not owned by us (uid 0), but by uid 1000! (This could e.g. happen if you try to connect to a non-root PulseAudio as a root user, over the native protocol. Don't do that.)
No PulseAudio daemon running, or not running as session daemon.

我还想把这个脚本作为systemd服务运行,这样我就不必管理它,systemd会确保它在系统启动时启动,等等。因此,它以root身份运行。我已经尝试以本地用户的身份运行systemd服务,但它仍然看不到pulseudio守护进程。

想法?当然,如果displaylink能修复他们的垃圾,这样它就不会崩溃,那就太好了,但说实话,制造商对ubuntu软件的支持在最好的日子里仍然不合格。

脚本:

#!/bin/bash
logfile=/var/log/bluetooth/log
btsinkname=bluez_sink.60_F4_3A_71_89_E0.a2dp_sink
function btcheck {
logprefix=$(echo "$(date +%b" "%d" "%H":"%M":"%S) $(hostname) btcheck [$(echo $BASHPID)]:")
if [[ $(cat /sys/class/bluetooth/hci0:256/power/control 2>&1 | grep -Ec "^auto") -eq 1 ]]; then
echo "$logprefix connected" | tee -a $logfile
export XDG_RUNTIME_DIR=/run/user/1000
pacmd set-default-sink $btsinkname 2>&1
else
echo "$logprefix not connected" | tee -a $logfile
fi
sleep 2s
btcheck
}
btcheck

我太接近了。只需要稍微动一下脑子。

而不是

export XDG_RUNTIME_DIR=/run/user/1000
pacmd set-default-sink $btsinkname 2>&1

我不得不将它们合并并使用runuser

userid=$(runuser -l username -c "id -u")
runuser -l username -c "export XDG_RUNTIME_DIR=/run/user/$userid && pacmd set-default-sink $btsinkname 2>&1"

现在,随着systemd服务的运行,我的音频将被迫与蓝牙扬声器保持连接。现在只需要等待一段随机的时间,等待dock崩溃,看看我的脚本是否有效。

相关内容

  • 没有找到相关文章

最新更新