sounddevice sound reproducir reproduce playsound play from python linux audio timer

sound - Cómo reproducir el sonido en Python SIN interrumpir la música/otros sonidos de la reproducción



reproducir audio en python (2)

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:

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 otro dispositivo ya esté emitiendo 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 crees que el proceso requeriría una API para garantizar la mezcla de software, sugiere un método :)

Thx por el apoyo :)


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.

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


La respuesta fácil es "Cambiar de 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 tu código ya funciona de la manera que quieres ... 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.