Pygame 不会播放音频,但仅当 运行 作为守护进程时才会播放

Pygame won't play audio, but only when running as a daemon

一些背景知识:我有一个 Raspberry Pi 3b 运行 Raspbian(Debian) 9.11。这个原始的 Pi 运行一个 Python 3 脚本,该脚本从手持式扫描仪捕获文本输入并将其发送到 MySQL 数据库,然后播放一个 wav 文件,以便员工扫描成功。我将此过程守护进程,以便更容易重新启动(有时扫描仪会与其 USB 加密狗失去同步)。守护进程文件中的主线是这个

ExecStart=/usr/bin/python3 /home/pi/Desktop/scanner.py

对于我被要求创建的新实例,我不得不稍微更改流程,所以我将 Raspbian 10.4(最新)加载到另一个 Pi 3b 上,并且只需要稍微调整一下就可以移动所有内容插入到本地 Maria DB(基本上是 MySQL)。守护进程运行得很好......除了没有音频播放(但数据库插入仍然发生)。真正奇怪的是,当我在 Thonny 中加载它时,它可以很好地播放文件。系统日志中没有任何内容表明 Python 或 Pygame 正在生成任何错误。

这里的相关代码(略)是

import pygame.mixer
# sets up sound
pygame.mixer.init()
goodscan = pygame.mixer.Sound('/home/pi/Desktop/goodscan.wav')
duplicatescan = pygame.mixer.Sound('/home/pi/Desktop/duplicateScan.wav')
badscan = pygame.mixer.Sound('/home/pi/Desktop/badScan.wav')

#function that the USB listener calls
def scan(scanner):
    #some scanner processing codes here
    if prevScan == x:
        duplicatescan.play()
        print("Duplicate Scan")
        continue;
                 
     else:
        splits = x.split('-')
        if(len(splits) < 3):
            print("No prefix provided")
            #write to error log
            badscan.play();
            continue;
        prefix = splits[0][0] + splits[0][1]
        po = splits[1] + '-' + splits[2]
        scanner_number = splits[0][2] + splits[0][3]
        polist.extend([po, prefixes[prefix], scanner_number])
        goodscan.play()
        
        #DB insert (this always works)                
        scans = {
           "timestamp": time_str,
           "ponum": x,
           "status": polist[1],
           "scanner": polist[2]
        }
        statusUpdate.databaseUpdate(polist)

我如何调试为什么这在守护进程模式下不起作用?

我猜这与从 Raspberry Pi OS 到 Linux 内核 5.4 的转变有关(较旧的 Pi 是 运行 内核 4.19)。我使用 pip 升级到 Pygame 1.9.6,它在停止或重新启动服务时将此错误添加到系统日志中

Sep 3 08:40:46 raspberrypi kernel: [164439.999815] bcm2835_audio bcm2835_audio: failed to close VCHI service connection (status=1)

Kingsley 在评论中询问了它在哪个用户下运行,答案是 root(我从未在系统服务文件中指定用户)。但是,我注意到 Thonny 在“pi”用户下运行。我认为尝试一下可能会奏效,所以我添加了

User=pi

到我的服务文件,现在 Pygame 音频在服务中再次工作。