¿Cómo configurar un sumidero PulseAudio?

16

Estoy tratando de configurar un receptor PulseAudio en mi Raspberry Pi, para transmitir todos los sonidos del sistema desde mi PC allí. ¿Cual es la mejor manera de hacerlo?

Por ejemplo, ¿es posible ver películas o la latencia es demasiado alta? Intenté esto hace un tiempo usando gstreamer, pero con una latencia de aproximadamente 2 segundos, lo que es inútil para mis requisitos.

luego
fuente
1
Tengo uno o dos segundos de latencia.
Ricitos de oro

Respuestas:

19

Con suerte, las instrucciones oficiales para crear una "conexión directa" en una red solo funcionan para la mayoría de las personas, pero parece que pulseaudio y no me llevo tan bien: me llevó horas . [Además de "conexión directa", también puede usar un método de "túnel" descrito más abajo, pero recomiendo leer esto primero.]

Ahora tengo un sonido de transmisión de escritorio (fedora 17) a la pi. He minimizado los /etc/pulsearchivos de configuración en ambos lados. En el lado del escritorio:

/etc/pulse/client.conf

# See man pulse-client.conf
default-server = tcp:192.168.2.13:4713

La dirección LAN de mi pi con el puerto predeterminado de pulseaudio. Pero aquí hay algo que luego me confundió por un tiempo: con un servidor especificado, pulseaudio ni siquiera comenzaría:

> pulseaudio --start
N: [pulseaudio] main.c: User-configured server at tcp:192.168.2.13:4713, refusing to start/autospawn.

Se ejecutará en primer plano (probablemente porque no lee pulse-client.conf?). Sin embargo , como resultado, no tiene que ejecutarlo en absoluto en el lado del escritorio (envío) , algo que no se detalla en los documentos de pulseaudio. Al usarlo lsof -i -P, parece que los complementos de nivel inferior para varios reproductores multimedia hacen el trabajo.

Entonces, esa línea "client.conf" es en realidad todo lo que necesita en el lado del escritorio / cliente, si todo lo que va a hacer es usar la red (pero vea "Aún más complicaciones", más abajo).

Aunque el demonio pulseaudio (en el lado receptor / servidor) se puede ejecutar como un servicio del sistema, los desarrolladores de pulse recomiendan no hacerlo , y de hecho en el pi, el script de inicio solo genera una advertencia: aún debe comenzar usted mismo Fedora ni siquiera incluye una entrada de servicio de arranque systemd para ello.

Por lo tanto, en el lado pi, debe iniciar y detener explícitamente el proceso del servidor pulseaudio, configurado de esta manera:

/etc/pulse/daemon.conf

# See man pulse-daemon.conf
log-level = info
exit-idle-time = 10800 # 3 hours

Puedes usar -1 para exit-idle-timemantener el demonio ejecutándose indefinidamente. Tenga en cuenta que estos son segundos y el valor predeterminado es 20 (lo que significa que seguirá muriendo "misteriosamente" si no configura esto).

/etc/pulse/default.pa

# See man default.pa
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.2.0/24
load-module module-alsa-sink device=hw:0,0

Como se trata de una aplicación de red, no es una buena idea ejecutarla como root. Sin embargo, como se mencionó anteriormente man pulseaudio, también es una buena idea "cambiar el proceso" para darle una mayor prioridad. Puede hacerlo manualmente con nice, pero pulseaudio lo hará automáticamente para root, o miembros del pulse-rtgrupo, si el ejecutable es "setuid", lo que significa que puede hacer uso de algunos privilegios de root y luego cambiar al uid sin privilegios correcto ( pingy passwdTambién necesito hacer esto). Entonces (como root o sudo):

chmod u+s /usr/bin/pulseaudio

No se pulse-rtcrea ningún grupo cuando pulseaudio está instalado en raspbian, entonces:

groupadd pulse-rt

Esto le dará un gid como 1003. Agregue (por ejemplo) usuario pi a ese grupo:

usermod -aG pulse-rt pi

Pero en raspbian, aún no podrás cambiar de nombre como pi. Para eso, agregue a /etc/security/limits.conf:

@pulse-rt       hard nice -20
@pulse-rt       soft nice -20

Debe ejecutar un inicio de sesión antes de que se realicen estos cambios; si usa ssh con el pi, solo use login. Ahora puede iniciar pulseaudio y se reactivará a sí mismo -11, lo que probablemente sea una prioridad más alta que la mayoría de los otros procesos (mire el valor NICE en top).

Mientras reproduce sonido transmitido desde la red, pulseaudio en el pi utiliza aproximadamente el 10% de la CPU y una cantidad trivial de memoria. :) Él y mi escritorio están en una LAN cableada; el pulso transmite datos pcm sin procesar (creo), por lo que el uso del ancho de banda corresponde a la frecuencia de muestreo de la fuente, 1 kB / sy más. Desafortunadamente, hay un retraso notable en el sonido si está viendo un video.

Aún más complicaciones ...

Desafortunadamente, ninguna de las diversas aplicaciones de sonido de mi PC funcionó de inmediato; mpg123no correría en absoluto. Para eso, en fedora, necesitas el mpg123-plugins-pulseaudiopaquete. Para material flash en el navegador (por ejemplo, youtude) necesita alsa-plugins-pulseaudio(estos son los que realmente se conectan al servidor remoto). Otras distribuciones deben tener paquetes similares. Si ha estado usando pulseaudio antes (yo no lo estaba), es posible que ya los tenga instalados.

Las campanas y silbatos de escritorio de KDE tampoco funcionaron. Este es un problema más difícil de resolver, ya que busca un servidor de pulseaudio local y, como se describe, el uso de una conexión directa significa que no se puede ejecutar ningún servidor localmente. La forma de evitar esto es usar el método de "túnel".

módulo-túnel-sumidero

Esta es la otra forma mencionada en los documentos de pulseaudio. En este caso, tiene un servidor ejecutándose en ambos lados y una mano hacia la otra. Para hacer esto, comente el "servidor predeterminado" /etc/client.confy agregue un local que /etc/default.pacontenga:

load-module module-tunnel-sink sink_name=rpi_tunnel server=tcp:192.168.2.13:4713 sink=bcm1

Si no pone un sink_namepulso, pulseaudio no se iniciará. Se sinkrefiere al nombre del sumidero en el lado pi, que luego también necesita un nombre; agregue un correspondiente sink_namea la module-alsa-sinklínea default.paallí:

load-module module-alsa-sink device=hw:0,0 sink_name=bcm1 

Inicie el servidor en ambos lados y listo ... más o menos. Si bien todo, incluidos los pitidos de KDE ahora se llevaron, la reproducción flash del navegador tartamudeó mucho. Sin embargo, en otro entorno de escritorio (en realidad, solo un administrador de ventanas, fvwm) estaba bien.

Me gusta KDE pero puedo vivir sin los pitidos, así que por ahora voy a seguir con una conexión directa.

Solución de problemas

Si tiene problemas, el uso pulseaudio -vvvv --log-level=debugen pi proporciona muchos mensajes de depuración. Inicialmente, cuando no pude obtener sonido en el pi, esto informó un problema "relacionado con un error en el controlador ALSA bcm2835" que me pareció extraño ya que el sonido estaba bien con solo alsa, y estoy seguro de que hay un software pi que depende en pulseaudio, apt-get remove pulseaudioy una reinstalación apt-get install pulseaudiopareció solucionar esto ... No es una solución que me guste ver, pero bueno, al menos ahora puedo escuchar tish sin tener que enchufar los altavoces en cada caja. Principalmente.

goldilocks
fuente
Gracias por la extensa respuesta. Sin embargo, una pregunta: ¿qué sucede con el audio que viene directamente del Pi?
Vincent
No sé si alguna vez intenté eso (ya no estoy haciendo esto), pero se supone que pulseaudio es un multiplexor, por lo que debería funcionar.
Ricitos de oro