2010-01-24 122 views
7

我正在使用python中的计时器,在等待时间结束时发出铃声。我使用下面的代码:如何在Python中播放声音无需中断播放音乐/其他声音

from wave import open as wave_open 
from ossaudiodev import open as oss_open 

def _play_chime(): 
    """ 
    Play a sound file once. 

    """ 
    sound_file = wave_open('chime.wav','rb') 
    (nc,sw,fr,nf,comptype, compname) = sound_file.getparams() 
    dsp = oss_open('/dev/dsp','w') 
    try: 
     from ossaudiodev import AFMT_S16_NE 
    except ImportError: 
     if byteorder == "little": 
     AFMT_S16_NE = ossaudiodev.AFMT_S16_LE 
     else: 
     AFMT_S16_NE = ossaudiodev.AFMT_S16_BE 
    dsp.setparameters(AFMT_S16_NE, nc, fr) 
    data = sound_file.readframes(nf) 
    sound_file.close() 
    dsp.write(data) 
    dsp.close() 

它的工作原理相当不错,除非其他设备已经outputing声音。

我怎么能基本相同(在Linux下)没有没有声音播放的先决条件?

如果你认为这个过程将需要一个API来保证软件的混合,请建议的方法:)

THX的支持:)

+0

没有现代音响系统一次只能处理一个流。 – 2010-01-24 04:59:10

回答

8

最简单的答案是“切换从开放源码软件的PulseAudio。” (或者将ALSA设置为使用dmix,或者通过更好的Linux驱动程序获取声卡...)

更复杂的答案是,您的代码已按照您希望的方式在某些声卡上运行。 OSS驱动程序可以暴露硬件混音器,以便您可以同时播放多个音频流,或者他们可以暴露单个流,从而导致您在系统上看到阻塞的音频。这里唯一正确的解决方案是使用确保软件混合的API。

+0

Thx的信息clee。我想通过增加“如果解决方案需要一个确保软件混合的API,它应该是什么? 干杯 – Morlock 2010-01-24 01:54:50

+1

这就是为什么我建议PulseAudio。默认情况下,pulseaudio守护进程为您处理软件混合。 – clee 2010-01-24 01:59:06

+0

对,我应该看过你的回复两次。我会看PulseAudio。 Thx – Morlock 2010-01-24 15:10:04

1

现代硬件和驱动程序支持多个流。所以除非你使用古老的硬件或蹩脚的司机,否则它应该工作。

话虽如此,ALSA可能会给你比OSS更多的控制权。现在出货的大多数内核都支持这两种。

+0

我一定会尝试阿尔萨。我刚刚证实,这是我的声卡使用。 – Morlock 2010-01-24 14:50:42