我正在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()
它工作得很好,除非任何其他设备已经输出声音。
我怎么能基本相同(在Linux下)没有没有声音播放的先决条件?
如果你认为这个过程需要一个API来确保软件混合,请build议一个方法:)
Thx的支持:)
简单的答案是“从OSS切换到PulseAudio”。 (或者设置ALSA来使用dmix,或者用更好的Linux驱动程序来获得声卡…)
更复杂的答案是,你的代码已经按照你想要的方式在一些声卡上工作。 OSS驱动程序可以暴露硬件混音器,以便您可以同时播放多个音频流,也可以公开一个单一的流,从而导致您在系统上看到阻塞的音频。 唯一正确的解决方案是使用确保软件混合的API。
现代的硬件和驱动程序支持多个流。 所以,除非你使用古老的硬件或蹩脚的司机,否则它应该工作。
话虽如此,ALSA可能会给您比OSS更多的控制权。 目前出货的大多数内核都支持这两种。