pygame混音器:多处理

时间:2017-03-10 18:09:18

标签: python-2.7 pygame python-multiprocessing

这是简化的例子。我有这段代码:

from pygame import mixer
def say():
    mixer.init()
    mixer.music.load('/home/orif/Downloads/english.wav')
    mixer.music.play()
    while mixer.music.get_busy():
        time.sleep(0.2)

它会显示一些警告,但效果很好。警告:

  

ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open)无法打开奴隶   ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open)无法打开从属ALSA   lib pcm.c:2266:(snd_pcm_open_noupdate)未知的PCM卡.pcm.rear ALSA   lib pcm.c:2266:(snd_pcm_open_noupdate)未知的PCM   cards.pcm.center_lfe ALSA lib pcm.c:2266:(snd_pcm_open_noupdate)   未知的PCM cards.pcm.side ALSA lib   pcm_dmix.c:1029:(snd_pcm_dmix_open)无法打开奴隶

但如果我在子进程中运行它,它将不会:

def test():
    talk_process = Process(target=say)
    talk_process.start()
    print 'waiting for the process...'
    talk_process.join()
    print 'done'

它打印相同的警告,然后:

waiting for the process...
Process Process-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "/home/orif/Projects/example.py", line 178, in say
    mixer.init()
error: No available audio device
done

如果我使用线程进行相同操作,它运行正常。我试过写了herehere。在前一个链接中,评论中的解决方案几乎帮助了我。我在运行子进程之前初始化了混合器:

mixer.init()
talk_process.start()

但现在声音没有播放,等待循环while mixer.music.get_busy()无穷无尽

发生了什么以及如何解决?

1 个答案:

答案 0 :(得分:0)

好吧,我的不好,在提出问题之前我没有检查过所有内容。上面的代码片段有点不完整。还有一些我觉得无关紧要的进口产品。我使用SpeechRecognition导入了我的模块。在代码中有一个函数声明,如下所示:

def foo(m = sr.Microphone()):
    pass

在编写我认为的代码时,由于Python在最后可能的时刻执行所有操作,它也应该工作。当我运行该代码时,它确实如此,所以一切似乎都很好。我错了。

在函数声明时,该方法调用未被视为"如果没有给出参数,则替换为此调用的结果",但它实际上被调用并且返回值被用作可选参数。在多处理过程中,我不知道声卡究竟出了什么问题,但这就是我收到这些奇怪而模糊的错误信息的原因。

以下是展示导致问题的原因的一个小例子:

def foo():
    print 'TRIGGERED'
    return 42

def bar(a = foo()):
    print a

if __name__ == '__main__':
    pass

虽然看起来它应该什么都不做,但这段代码实际上打印了TRIGGERED。所以,不是像这样给可选参数赋值,而是做这样的事情:

def foo(a = None):
    a = 'bar' if a is None else a