Avvia una sessione X falsa / minima per Pulseaudio / dbus


13

Uso Pulseaudio per condividere l'audio tra un desktop e un Raspberry Pi.

Tuttavia, Pulseaudio ha bisogno di dbus e dbus ha bisogno di una sessione X. Senza sessione grafica, Pulseaudio è in grado di funzionare solo in modalità di sistema, che non è ufficialmente raccomandata.

Inoltre su un Raspberry Pi, il costo di una sessione X è drammaticamente alto, quindi vorrei liberarmene nel modo più efficiente (meno costoso).

Come posso avviare la più piccola sessione X per l'avvio di Pulseaudio?


Udev sicuramente non ha bisogno di X. Non so di Pulseaudio: cosa fallisce in assenza di X? Questo è legato al D-Bus?
Gilles 'SO- smetti di essere malvagio' il

Bene, l'ho letto, ma potrebbe essere solo Pulseaudio. In assenza di X Pulseaudio viene lanciato in modalità di sistema, il che significa nessuna sessione per utente, il che è male come dice il sito ufficiale: freedesktop.org/wiki/Software/PulseAudio/Documentation/User/…
kursus

Mi dispiace di aver mescolato udev e dbus, modificato.
kursus,

Risposte:


11

È possibile utilizzare Xvfb , che è un server X con un framebuffer virtuale, ovvero un server X che viene visualizzato solo in memoria e non si collega a nessun hardware. Non è necessario eseguire alcun client non desiderato su quel server, in particolare nessun ambiente desktop o gestore di finestre.

Xvfb :1 -screen 0 1x1x8 &

Dopodichè:

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

È necessario attendere un po 'dopo aver avviato Xvfbla visualizzazione del display. È possibile utilizzare xinitper avviare un server X e quindi avviare i client quando è pronto. Inserisci i comandi che vuoi eseguire in uno script (nota che quando lo script esce, il server X esce):

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

Avviare il server X virtuale con

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

Se vuoi eseguirlo all'avvio, puoi avviarlo da cron. Esegui crontab -e(come utente, non come root) e aggiungi la riga

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

Se vuoi uccidere questa sessione, uccidi il xinitprocesso.


Mi dispiace disturbare, faccio fatica ad eseguire automaticamente il comando pulseaudio start (4a riga del tuo esempio) all'avvio. Mi chiedo se è la proprietà DISPLAY. Ho provato rc.local, /etc/init.d, rcS, ma lo script non avvia mai pulseaudio. Quando eseguo il mio script tramite SSH funziona perfettamente. Sarei felice se potessi consigliarmi.
kursus

Xvfb deve eseguire alcune impostazioni prima che sia pronto per accettare le connessioni X, quindi se i comandi successivi vengono eseguiti troppo presto, è possibile che non riescano a connettersi al server X. Potresti voler esaminare l'uso di xinit per avviare Xvfb e inserire questi comandi in .xinitrc in modo che xinit li avvii solo quando Xvfb è pronto per loro.
alanc,

Mi dispiace di non averti guarito. Devo avviare Xvfb con .xinitrc? In questo momento è iniziato con rc.local. In tal caso, dove inserisco il comando PA? Ho provato ad avviare il comando PA in .xinitrc ma senza fortuna, mi manca qualcosa.
kursus,

@kursus È necessario eseguire tutti questi comandi come utente. Puoi farlo da un crontab con @reboot. Anche alanc ha ragione, ci deve essere un ritardo dopo l'avvio di Xvfb e xinit risolve questo problema. Vedi la mia modifica.
Gilles 'stop SO-essere malvagio'

Grazie per la modifica, ora è più chiaro. Tuttavia ottengo un'opzione non riconosciuta: Xvfb all'avvio del comando xinit, con o senza la chiamata di script.
kursus,

1

Ho avuto lo stesso problema ieri, usando Pulse audio per raspberrypi 0 W con DBus in un ambiente senza testa creato con yocto senza x11 e senza systemd, è necessario eseguire ed esportare dbus prima di eseguire pulseaudio.

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

In etc / pulse / client.conf, abilitare allow-autospawn-for-root = yes

Eseguire pulseaudio -vper verificare se c'è un altro problema nella vostra configurazione. Non utilizzare --systemswitch perché non sarà corretto.

pulseaudio -D --disallow-exit

0

Esiste un modo più elegante per impedire allo script di raggiungere EOF rispetto all'uso sleep 99999999!

Usa sleep infinityinvece. Fa quello che dice ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.