gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:05:39 26 4
gpt4 key购买 nike

我正在运行带有 displaylink 5.4.1 的 targus 坞站 (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 服务,但它仍然看不到 pulseaudio 守护进程。
想法?当然,如果 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 服务的运行,我的音频将被强制保持连接到我的蓝牙扬声器。只需等待一段随机时间,码头现在就会崩溃,以查看我的脚本是否有效。

关于bash - Ubuntu为另一个用户设置脉冲音频接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70706593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com