2010-01-24 16 views
7

Estoy trabajando en un temporizador en python que suena un carillón cuando el tiempo de espera ha terminado. Yo uso el siguiente código:Cómo reproducir sonido en Python SIN interrumpir la música/otros sonidos de la reproducción

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() 

Funciona bastante bien, a menos que cualquier otro dispositivo ya está outputing sonido.

¿Cómo podría hacer básicamente lo mismo (en Linux) sin tener el requisito previo de que no se reproduce ningún sonido?

Si cree que el proceso requeriría una API para asegurar una mezcla de software, por favor sugerir un método :)

Thx por el apoyo :)

+0

Ningún sistema de sonido moderno solo puede manejar una transmisión a la vez. –

Respuesta

8

La respuesta fácil es "Cambiar desde OSS a PulseAudio." (O configure ALSA para usar dmix u obtenga una tarjeta de sonido con mejores controladores de Linux ...)

La respuesta más complicada es que su código ya funciona de la manera que desea ... en algunas tarjetas de sonido. Los controladores OSS pueden exponer los mezcladores de hardware para que pueda reproducir varias secuencias de audio simultáneamente, o pueden exponer una sola transmisión que da como resultado el audio de bloqueo que ve en su sistema. La única solución correcta aquí es usar una API que garantice la mezcla de software.

+0

Thx para la información clee. Supongo que la pregunta se amplía al agregar "Si la solución requiere una API que garantice la mezcla del software, ¿cuál debería ser?" Cheers – Morlock

+1

Es por eso que sugerí PulseAudio. Por defecto, el daemon pulseaudio maneja la mezcla de software para usted. – clee

+0

Bien, debería haber leído su respuesta dos veces. Veré PulseAudio. Thx – Morlock

1

El hardware y los controladores modernos admiten varias transmisiones. Entonces, a menos que esté ejecutando hardware antiguo o un controlador defectuoso, debería funcionar de todos modos.

Habiendo dicho eso, ALSA puede darle más control que OSS. La mayoría de los núcleos enviados hoy en día son compatibles con ambos.

+0

Definitivamente intentaré con Alsa. Acabo de verificar y esto es lo que está usando mi tarjeta de sonido. – Morlock

Cuestiones relacionadas