Lancer une session X fausse / minimale pour Pulseaudio / dbus

13

J'utilise Pulseaudio pour partager de l'audio entre un ordinateur de bureau et un Raspberry Pi.

Cependant, Pulseaudio a besoin de dbus, et dbus a besoin d'une session X. Sans session graphique, Pulseaudio ne peut fonctionner qu'en mode système, ce qui n'est officiellement pas recommandé.

En plus sur un Raspberry Pi, le coût d'une session X est considérablement élevé, donc je voudrais m'en débarrasser de la manière la plus efficace (la moins coûteuse).

Comment puis-je démarrer la plus petite session X pour que Pulseaudio démarre?

kursus
la source
Udev n'a certainement pas besoin de X. Je ne connais pas Pulseaudio: qu'est-ce qui échoue en l'absence de X? Est-ce lié au D-Bus?
Gilles 'SO- arrête d'être méchant'
Eh bien, j'ai lu ça, mais ce n'est peut-être que Pulseaudio. En l'absence de X, Pulseaudio est lancé en mode système, ce qui signifie aucune session par utilisateur, ce qui est mauvais comme le dit le site officiel: freedesktop.org/wiki/Software/PulseAudio/Documentation/User/…
kursus
Désolé d'avoir mélangé udev et dbus, édité.
kursus

Réponses:

11

Vous pouvez utiliser Xvfb , qui est un serveur X avec un tampon d' images virtuel, c'est-à-dire un serveur X qui s'affiche uniquement en mémoire et ne se connecte à aucun matériel. Vous n'avez pas besoin d'exécuter un client dont vous ne voulez pas sur ce serveur, et en particulier aucun environnement de bureau ou gestionnaire de fenêtres.

Xvfb :1 -screen 0 1x1x8 &

Après ça:

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

Vous devez attendre un peu après le démarrage Xvfbpour que l'affichage soit disponible. Vous pouvez utiliser xinitpour démarrer un serveur X, puis démarrer les clients lorsqu'il est prêt. Mettez les commandes que vous souhaitez exécuter dans un script (notez que lorsque le script se ferme, le serveur X se ferme):

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

Démarrez le serveur X virtuel avec

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

Si vous souhaitez l'exécuter au démarrage, vous pouvez le démarrer à partir de cron. Exécutez crontab -e(en tant qu'utilisateur, pas en tant que root) et ajoutez la ligne

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

Si vous voulez tuer cette session, arrêtez le xinitprocessus.

Gilles 'SO- arrête d'être méchant'
la source
Désolé de déranger j'ai du mal à exécuter automatiquement la commande de démarrage pulseaudio (4ème ligne de votre exemple) au démarrage. Je me demande si c'est la propriété DISPLAY. J'ai essayé rc.local, /etc/init.d, rcS, mais le script ne démarre jamais pulseaudio. Lorsque j'exécute mon script via SSH, cela fonctionne parfaitement. Je serais heureux si vous pouviez me conseiller.
kursus
Xvfb doit effectuer une configuration avant d'être prêt à accepter les connexions X. Par conséquent, si les commandes ultérieures s'exécutent trop tôt, il se peut qu'elles ne parviennent pas à se connecter au serveur X. Vous pouvez envisager d'utiliser xinit pour démarrer Xvfb et placer ces commandes dans le .xinitrc afin que xinit ne les démarre qu'une fois que Xvfb est prêt pour elles.
alanc
Je suis désolé de ne pas t'avoir bien compris. Dois-je démarrer Xvfb avec .xinitrc? À l'heure actuelle, il démarre avec rc.local. Si oui, où dois-je placer la commande PA? J'ai essayé de démarrer la commande PA en .xinitrc mais pas de chance, il me manque quelque chose.
kursus
@kursus Vous devez exécuter toutes ces commandes en tant qu'utilisateur. Vous pouvez le faire à partir d'un crontab avec @reboot. Alanc a également raison, il doit y avoir un délai après le démarrage de Xvfb, et xinit résout ce problème. Voir mon montage.
Gilles 'SO- arrête d'être méchant'
Merci pour l'édition, c'est plus clair maintenant. Cependant, j'obtiens une option non reconnue: Xvfb lors du lancement de la commande xinit, avec ou sans l'appel de script.
kursus
1

J'ai eu le même problème hier, en utilisant Pulse audio pour raspberrypi 0 W avec DBus dans un environnement sans tête créé avec yocto sans x11 et sans systemd, vous devez exécuter et exporter dbus avant d'exécuter pulseaudio.

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

Dans etc / pulse / client.conf, veuillez activer allow-autospawn-for-root = yes

Exécutez pulseaudio -vpour vérifier s'il y a un autre problème dans votre configuration. N'utilisez pas --systemswitch car il ne sera pas correct.

pulseaudio -D --disallow-exit
Drl Sherif Omran
la source
0

Il existe un moyen plus élégant d'empêcher le script d'atteindre EOF que de l'utiliser sleep 99999999!

Utilisez sleep infinityplutôt. Il fait ce qu'il dit...

Jost
la source