从 Linux 守护进程播放声音

从 Linux 守护进程播放声音

我有 Manjaro Linux,我正在尝试使用守护程序中的脚本来播放声音(mp3 和 wav)。基本上,我有一个 script.sh ,其中包含一个尝试播放声音的命令。该脚本是从守护程序调用的。 (下面有关代码的更多详细信息)。

快速注释:

  • 该脚本从我的命令行成功运行(没有守护程序)
  • 我知道我的脚本使用 root 作为用户,但我需要会话中的声音,为此,我只需在主命令之前添加一个“前缀”,以便自己以用户身份执行命令
  • 作为播放声音的单个命令(没有守护进程且没有前缀),我的两个选项都有效(我尝试使用paplaycvlc
  • 仅适用于“前缀”cvlc
  • 这是我使用过的前缀sudo -u julian DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path="/run/user/1000/bus" ***Code to play sound***
  • 播放声音的代码是:paplay lowBattery2.wav --volume 65536cvlc --play-and-exit lowBattery.mp3
  • 带有前缀的两个代码都可以正常工作,但是当存在另一个声音正在播放时(例如 youtube),命令行会返回错误。

概括:

我的问题:

  • 我无法同时播放守护进程中的声音与另一个声音(例如 youtube)

我的目标:

  • 当我的电脑电池电量不足时,执行此守护程序以打开我的通知。

就是这样。

这是脚本.sh

battery=$(cat /sys/class/power_supply/BAT0/capacity)
    
batteryLimit=97
    
user=julian

userID=1000 
sayHelloMessage="Hi ${user}!"
messagePart1="Your computer has "
messagePart2="% of battery, please connect it"
finalMessage=$messagePart1$battery$messagePart2

while true; do
        if [ "$batteryLimit" -gt "$battery" ]; then
                echo $finalMessage;
                echo $user
                echo $userID
                sudo -u $user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/${userID}/bus" notify-send "${sayHelloMessage}" "${finalMessage}"
                ##sudo -u $user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path="/run/user/${userID}/bus"  cvlc --play-and-exit  lowBattery.mp3;
                sudo -u $user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path="/run/user/${userID}/bus" paplay  lowBattery2.wav --volume 65536
                ##ffplay -autoexit lowBattery.mp3;
                ##paplay lowBattery2.wav --volume 65536
                echo "Sound ended"

        else
                echo "Your battery is greater than ${batteryLimit+1} you are ok!";
        fi
        echo $(date);
        sleep 10;
done

这是守护进程:

[Unit]
Description=To show notifications when battery is smaller than 18%

After=multi-user.target

[Service]
Type=simple

ExecStart= sh /etc/systemd/system/LowBatteryScripts/script.sh

User=julian

WorkingDirectory=/etc/systemd/system/LowBatteryScripts

StandardOutput=syslog
StandarError=syslog

[Install]
WantedBy=multi-user.target

错误日志(带“前缀”)为: 对于 cvlc:

[000055d038a38c10] alsa audio output error: cannot open ALSA device "default": Dispositivo o recurso ocupado
[000055d038a38c10] main audio output error: Falló salida de audio
[000055d038a38c10] main audio output error: El dispositivo de audio «default» no se puede usar:
Dispositivo o recurso ocupado
[000055d038a38c10] main audio output error: module not functional
[00007f1164c1fb50] main decoder error: failed to create audio output

对于纸质版:

Connection failed: Connection denied

pa_context_connect () failed: Connection denied

答案1

$HOME/.config/pulse/default.pa使用此内容创建:

!/usr/bin/pulseaudio -nF

.include /etc/pulse/default.pa

load-module module-native-protocol-unix auth-anonymous=1 socket=/tmp/pulse-socket

$HOME/.config/pulse/client.conf为所有想要使用 PulseAudio 的用户添加另一个文件:

default-server = unix:/tmp/pulse-socket
enable-memfd = yes

现在所有用户都可以播放音频,不需要任何技巧。

相关内容