2010-01-24 120 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