Emulación Pulseaudio para Alsa.
El programa proporciona una implementación parcial alternativa de la API PulseAudio. Consiste en un script de cargador y una serie de bibliotecas compartidas con los mismos nombres que el original PulseAudio, por lo que las aplicaciones podrían cargarlas dinámicamente y pensar que están hablando con PulseAudio. Internamente, no se usa demonio de mezcla de sonido separado. En cambio, Apulse se basa en los complementos dmix , dsnoop y plug de ALSA para manejar múltiples fuentes de sonido y capturar transmisiones que se ejecutan al mismo tiempo. dmix Plugin Muxes múltiples transmisiones de reproducción; El complemento dsnoop permite que múltiples aplicaciones capturen desde un solo micrófono; y el complemento plug convierte transparentemente el audio entre varios formatos de muestra, velocidades de muestra y números de canal. Durante más de una década, ALSA viene con estos complementos habilitados y configurados de forma predeterminada.
apulse no fue diseñado para ser un reemplazo de pulseaudio. No tiene sentido, ya que eso será solo una reimplementación de PulseAudio original, con la misma arquitectura del cliente-Demonio, requerido por el conjunto completo de características. En cambio, solo se implementan partes de la API que son cruciales para aplicaciones específicas. Es por eso que hay un script de cargador, llamado apulse . Actualiza el valor del entorno LD_LIBRARY_PATH variable para apuntar también al directorio donde se instalan las bibliotecas de Apulse, lo que las pone a disposición de la aplicación.
El nombre proviene de los nombres de Alsa y Pulseaudio. Como aoss era una capa de compatibilidad entre los programas OSS y ALSA, apulse fue diseñado para ser una capa de compatibilidad entre las aplicaciones Pulseaudio y ALSA.
Necesita instalaciones de bibliotecas ALSA y GLIB. En las distribuciones basadas en Debian, se encuentran en paquetes libasound2-dev y libglib2.0-dev .
Para construir e instalar, ejecute en el directorio de origen:
$ mkdir build && cd build
$ cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
$ make
# make install
Eso creará un directorio llamado build y Build allí. Es posible instalar simplemente ejecutando make install como root , como se muestra arriba. Pero no podrá desinstalar archivos instalados. Es por eso que se recomienda envolver archivos en un paquete. Use checkinstall o alguna alternativa.
Si desea binarios de 32 bits en una máquina de 64 bits (por ejemplo, para Skype), use:
$ mkdir build && cd build
$ CFLAGS=-m32 cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
$ make
# make install
Las versiones GLIB recientes usan diferentes archivos .pc para i386 y amd64 . Para ayudar pkg-config a encontrar versiones de 32 bits, use la variable PKG_CONFIG_PATH . Entonces, en Debian será algo así como:
$ PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig CFLAGS=-m32 cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
Hay una forma de configurar dónde se instalarán las bibliotecas Apulse, a través de la variable APULSEPATH CMake. Por ejemplo, si desea instalar bibliotecas en la ruta predeterminada, /usr/lib , use
cmake -DAPULSEPATH=/usr/lib -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release ..
Si las bibliotecas se instalan en una ruta de biblioteca regular, no necesita aplicaciones de ejecución a través de apulse Wrapper.
$ apulse <program-name> [program-parameters]
Variables de entorno APULSE_CAPTURE_DEVICE y APULSE_PLAYBACK_DEVICE se pueden usar para configurar los dispositivos de captura y reproducción. Prueba hw:0,0 , plughw:0,0 y similares. Consulte la Guía del usuario de ALSA para obtener una lista completa de nombres de dispositivos.
Por defecto, las bibliotecas de apulse se instalan en un directorio separado, para ocultarlas de todas las aplicaciones.
La mayoría de las aplicaciones en la naturaleza, que admiten PulseAudio y Alsa, intentan autodetectar qué sistema de sonido se utiliza. Primero, las aplicaciones intentan comenzar con Pulseaudio. Las bibliotecas originales de clientes fallan temprano si no se está ejecutando PulseAudio Daemon o se puede iniciar. Luego cambian a Alsa. La decisión se toma una vez, al principio. Funciona bien con Pulseaudio, pero no funciona con apulse . Este no tiene demonios, felizmente dice que todo está bien y que es capaz de reproducir audio. Las aplicaciones luego intentan llamar a más funciones y, finalmente, tocar piezas no implementadas, a menudo con bloqueos. Por lo tanto, las bibliotecas están ocultas y se vuelven visibles solo cuando se llama a un programa a través de la secuencia de comandos apulse Wrapper.
Es posible instalar las bibliotecas Apulse a /usr/lib . No se requerirá un script de envoltura, pero luego todas las aplicaciones intentarán usar la API Pulseaudio, a pesar de que pueden usar ALSA.
Existe la propiedad RPATH del formato ELF Ejecutable, que se utiliza para especificar rutas para buscar bibliotecas dinámicas. Es como la variable ld_library_path, pero por ejecución. Dado que todo lo que hace el script de la lanza de apulse es configurar el valor ld_library_path antes de iniciar una aplicación, es posible hornear rutas a las bibliotecas apulse en el ejecutable de destino en sí. Y así, para lanzarlo como de costumbre, sin guión de ayuda.
Por ejemplo, para Firefox sería:
# patchelf --set-rpath /usr/lib/apulse /usr/lib/firefox/libxul.so
Por alguna razón, no funciona si RPATH está configurado para /usr/lib/firefox/firefox , por lo que se requieren algunos experimentos para que funcione.
No se implementa una gran parte de la API de Pulseaudio. Hay funciones que no hacen nada y devuelven algunos valores de arbitraje. A menudo, si la aplicación intenta llamar a algo que no se implementa, se bloquea mientras intenta desreferencia de un puntero nulo. Por defecto, el nivel de rastreo se establece en 0 , lo que significa que no se imprimen mensajes en la salida estándar. Es posible aumentar ese valor a 1 , que muestra llamadas de funciones no implementadas, o a 2 , que muestra todas las llamadas de funciones.
Para cambiar el nivel, use el parámetro WITH_TRACE al llamar cmake . Algo como cmake -DWITH_TRACE=1 ..
Construir apulse con el nivel de traza 1 no solucionará problemas, pero al menos ayudará a identificar si los bloqueos son causados por funciones no implementadas.
Apulse actúa como un cliente genérico ALSA. Intenta abrir un dispositivo de audio, y a veces falla. En esencia, Apulse no hace una mezcla de audio ni vuelve a muestrear. En su lugar, se basa en complementos plug , dmix y dsnoop ALSA, que generalmente están habilitados de forma predeterminada. Estos complementos manejan múltiples fuentes de audio, realizando remuestreo y mezcla de manera transparente. Desde hace años, ALSA viene con esos complementos habilitados. El audio simplemente funciona sin configurar nada. Pero no todos usan la configuración predeterminada.
En configuraciones personalizadas, Apulse puede no obtener y/o capturar audio. No podría haber sonido en absoluto, o simplemente una transmisión de audio que se reproduce a la vez. También es posible que los adaptadores con mezcladores de hardware, que capaces de reproducir múltiples transmisiones, aún no puedan manejar múltiples transmisiones de captura. Dependiendo del hardware, es posible que aún necesite complementos dmix o dsnoop . O ambos.
En otras palabras, para que Apulse funcione, su configuración debe ser capaz de jugar y capturar múltiples transmisiones simultáneamente.
Si otras aplicaciones salen bien, es posible que la aplicación que está utilizando se restringe.
Por ejemplo, Firefox ahora tiene un Sandbox, que bloquea el acceso a los archivos. Tiene una lista predefinida de rutas permitidas, pero los dispositivos ALSA no se incluyen de forma predeterminada. Afortunadamente, es posible agregar ese camino a mano. Agregue el parámetro "/dev/snd/" a "Security.sandbox.content.write_path_whitelist" en about:config . Tenga en cuenta que se requiere un corte inaugural en "/dev/snd/".
Firefox 58 (noche) apretó un poco más su caja de arena. Ahora las llamadas ioctl() también están prohibidas, pero son utilizadas por las bibliotecas ALSA. Eso causa violación de Sandbox con la posterior terminación del proceso. Se puede agregar excepción configurando el parámetro security.sandbox.content.syscall_whitelist en about:config . Ese campo acepta una lista separada por comas de los números de llamadas del sistema. Agregue allí 16 para x86-64, o 54 para x86 o brazo.
Firefox 60 dio a luz su contenido Sandbox, pero al mismo tiempo movió los accesos de audio desde los procesos de contenido al proceso principal. Desde Firefox 60 en adelante, no se necesitan cambios en la configuración de Sandbox.
El código fuente se distribuye bajo los términos de la licencia MIT. Vea la licencia. MIT para el texto completo.
/3rdparty/pulseaudio-headers contiene parte del proyecto Pulseaudio y se distribuye en términos LGPLV2.1+. Consulte el contenido de los archivos para más detalles.