2011-11-17 13 views
7

Quiero reproducir algunos datos de audio usando ALSA a un dispositivo PCM. Como ejemplo, descargué this sample example y lo ejecuté en mi PC. Funciona bien cuando ningún otro proceso está utilizando actualmente la tarjeta de sonido. Pero no se juega nada cuando algún otro proceso utiliza el dispositivo de audio (es decir, reproductor multimedia tocando canciones) y espectáculos siguiente error -ALSA: abra un dispositivo PCM en modo compartido

Playback open error: Device or resource busy 

Si examina el código fuente de este ejemplo podría decir que la función snd_pcm_open en la línea 882 está arrojando este error. Encuentra el dispositivo ocupado ya que otro proceso lo está usando actualmente.

También intenté el camino inverso - primero comencé el ejemplo y luego intenté comenzar una canción. En este caso, el reproductor de medios permanece inactivo, mostrando "inactivo" justo al lado de la barra de progreso (estoy usando Banshee). Supongo que snd_pcm_open gana el derecho exclusivo del recurso del dispositivo para que ningún otro proceso pueda usarlo.

Pero no quiero eso. Quiero reproducir el sonido en un dispositivo de audio sin requerir derechos exclusivos para que otros procesos en la PC puedan compartir el mismo dispositivo para generar datos de audio.

¿Cómo puedo hacer eso? ¿Cómo puedo abrir un dispositivo PCM para que otros procesos también puedan compartir el mismo dispositivo?

Respuesta

3

no pude encontrar una manera de compartir un dispositivo entre varios procesos. Traté de usar el complemento dmix para combinar varias secuencias de reproducción utilizando el archivo de configuración .asoundrc, pero eso no funcionó por algún motivo. Traté de usar el dispositivo default de mi tarjeta de sonido, pero eso tampoco funcionó. De acuerdo con una recomendación en la lista de correo de ALSA, traté de abrir el dispositivo predeterminado usando default:CARD=x como el parámetro del nombre del dispositivo para la función snd_pcm_open, lo que da como resultado un error device not found en mi sistema. Aparentemente no hay forma de hacer esto (si alguien puede encontrar la manera, por favor actualice esta respuesta).

En lugar de usar ALSA, usé PulseAudio a continuación, lo que resolvió mi problema.

1

Compruebe el archivo/dev/sndstat (si tiene habilitada la capa de compatibilidad de OSS). Debería enumerar los dispositivos de audio que corresponden a los dispositivos ALSA en su sistema. Y también puede verificar/proc/sonido/dispositivos para obtener características de cada dispositivo. Acceso

Trate de diferentes dispositivos de reproducción (en su ejemplo es "plughw: 0,0" abierto) eligiendo diferentes nombres para snd_pcm_open(): Esto es de here:

plughw: tarjeta, dispositivo. Ambos tienen como parámetros la tarjeta (cadena de ID o índice numérico ), dispositivo y opcionalmente subdispositivo del hardware al que se accederá.

+0

No, no tengo habilitada la capa de compatibilidad de OSS, y realmente no deseo confiar en ella. También revisé/proc/sonido/dispositivos y vi la lista de dispositivos allí (sin embargo, puedo buscar esa lista mediante programación). También puedo acceder a diferentes dispositivos de reproducción. Pero ninguno de estos son realmente un problema aquí. Quería saber si puedo abrir un único dispositivo en modo compartido. –

1

El problema con ALSA en aquel entonces era la ausencia de un complemento del mezclador insertado en la salida predeterminada. En versiones recientes de ALSA, esto ya no ocurre porque el complemento dmix ahora está incluido en la ruta de salida de forma predeterminada.

(puede volver a crear la tarjeta de sonido compartida problemas por sí mismo si te metes con ~/.asoundrc, o si se omite el mezclador contando aplicación para utilizar directamente el enchufe hardware.Tenga en cuenta que algunas aplicaciones, como JACK, intentarán usar el hardware directamente si no se le indica lo contrario).

Con PulseAudio, todavía usa ALSA como back-end, acaba de agregar una capa con un mezclador (y una tonelada otras cosas que probablemente ni siquiera quieras saber). JACK haría exactamente el mismo trabajo para usted.

En la actualidad, el plugin dmix de ALSA lo hará por usted, por lo que puede deshacerse de middleware como PulseAudios y JACK hasta que realmente necesite las características de sistema de sonido no básicas que proporcionan.

Como referencia, busque some .asoundrc documentation.

Cuestiones relacionadas