Inicie una sesión X falsa / mínima para Pulseaudio / dbus


13

Uso Pulseaudio para compartir audio entre una computadora de escritorio y una Raspberry Pi.

Sin embargo, Pulseaudio necesita dbus, y dbus necesita una sesión X. Sin una sesión gráfica, Pulseaudio solo puede ejecutarse en modo sistema, lo que oficialmente no se recomienda.

Además en un Raspberry Pi, el costo de una sesión X es dramáticamente alto, por lo que me gustaría deshacerme de él de la manera más eficiente (menos costosa).

¿Cómo puedo comenzar la sesión X más pequeña para que Pulseaudio se inicie?


Udev definitivamente no necesita X. No sé acerca de Pulseaudio: ¿qué falla en ausencia de X? ¿Está esto relacionado con D-Bus?
Gilles 'SO- deja de ser malvado'

Bueno, he leído eso, pero podría ser solo Pulseaudio. En ausencia de X Pulseaudio se lanza en modo de todo el sistema, lo que significa que no hay sesión por usuario, lo cual es malo como dice el sitio web oficial: freedesktop.org/wiki/Software/PulseAudio/Documentation/User/…
kursus

Lo siento, mezclé udev y dbus, editado.
kursus

Respuestas:


11

Puede usar Xvfb , que es un servidor X con un framebuffer virtual, es decir, un servidor X que solo se muestra en la memoria y no se conecta a ningún hardware. No necesita ejecutar ningún cliente que no desee en ese servidor, y en particular ningún entorno de escritorio o administrador de ventanas.

Xvfb :1 -screen 0 1x1x8 &

Después de este:

DISPLAY=:1 dbus-launch
DISPLAY=:1 pulseaudio --start

Debe esperar un poco después de comenzar Xvfbpara que la pantalla esté disponible. Puede usar xinitpara iniciar un servidor X y luego iniciar clientes cuando esté listo. Ponga los comandos que desea ejecutar en un script (tenga en cuenta que cuando el script se cierra, el servidor X se cierra):

#!/bin/sh
dbus-launch
pulseaudio --start
sleep 99999999

Inicie el servidor X virtual con

xinit /path/to/client.script -- /usr/bin/Xvfb :1 -screen 0 1x1x8

Si desea ejecutarlo en el momento del arranque, puede iniciarlo desde cron. Ejecute crontab -e(como su usuario, no como root) y agregue la línea

@reboot xinit /path/to/client.script -- Xvfb :1 -screen 0 1x1x8

Si desea matar esta sesión, elimine el xinitproceso.


Lamento molestarme. Me cuesta ejecutar automáticamente el comando de inicio pulseaudio (cuarta línea de su ejemplo) en el arranque. Me pregunto si es la propiedad DISPLAY. Intenté rc.local, /etc/init.d, rcS, pero el script nunca inicia pulseaudio. Cuando ejecuto mi script a través de SSH, funciona perfectamente. Me alegraría si pudieras aconsejarme.
kursus

Xvfb tiene que hacer alguna configuración antes de que esté listo para aceptar conexiones X, por lo que si los comandos posteriores se ejecutan demasiado pronto, es posible que no se conecten al servidor X. Es posible que desee considerar el uso de xinit para iniciar Xvfb y colocar esos comandos en el .xinitrc para que xinit los inicie solo una vez que Xvfb esté listo para ellos.
alanc

Lo siento, no te puse bien. ¿Tengo que iniciar Xvfb con .xinitrc? En este momento se comienza con rc.local. Si es así, ¿dónde pongo el comando PA? Intenté iniciar el comando PA en .xinitrc pero no tuve suerte, me falta algo.
kursus

@kursus Debes ejecutar todos estos comandos como tu usuario. Puedes hacerlo desde un crontab con @reboot. También alanc tiene razón, debe haber un retraso después de iniciar Xvfb, y xinit resuelve este problema. Mira mi edición.
Gilles 'SO- deja de ser malvado'

Gracias por la edición, ahora está más claro. Sin embargo, obtengo una opción no reconocida: Xvfb al iniciar el comando xinit, con o sin la llamada al script.
kursus

1

Tuve el mismo problema ayer, usando el audio Pulse para raspberrypi 0 W con DBus en un entorno sin cabeza creado con yocto sin x11 y sin systemd, necesita ejecutar y exportar dbus antes de ejecutar pulseaudio.

if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
     echo "Starting dbus" 
     export $(dbus-launch)
fi

En etc / pulse / client.conf, habilite allow-autospawn-for-root = yes

Ejecute pulseaudio -vpara verificar si hay otro problema en su configuración. No use el --systeminterruptor porque no será correcto.

pulseaudio -D --disallow-exit

0

¡Hay una manera más elegante de evitar que el script alcance EOF que usarlo sleep 99999999!

Usar en su sleep infinitylugar. Hace lo que dice...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.