Uruchom fałszywą / minimalną sesję X dla Pulseaudio / dbus

13

Używam Pulseaudio do udostępniania dźwięku między komputerem stacjonarnym a Raspberry Pi.

Jednak Pulseaudio potrzebuje dbus, a dbus potrzebuje sesji X. Bez sesji graficznej Pulseaudio może działać tylko w trybie systemowym, co oficjalnie nie jest zalecane.

Poza tym na Raspberry Pi koszt sesji X jest dramatycznie wysoki, więc chciałbym się go pozbyć w najbardziej wydajny (mniej kosztowny) sposób.

Jak mogę rozpocząć najmniejszą sesję X, aby Pulseaudio mogło się rozpocząć?

kursus
źródło
Udev zdecydowanie nie potrzebuje X. Nie wiem o Pulseaudio: co zawiedzie pod nieobecność X? Czy to jest związane z D-Bus?
Gilles „SO- przestań być zły”
Cóż, przeczytałem to, ale może to być tylko Pulseaudio. W przypadku braku X Pulseaudio uruchamia się w trybie ogólnosystemowym, co oznacza brak sesji dla użytkownika, co jest złe, jak podaje oficjalna strona: freedesktop.org/wiki/Software/PulseAudio/Documentation/User/…
kursus
Przepraszam, że zmiksowałem udev i dbus, zredagowane.
kursus

Odpowiedzi:

11

Możesz użyć Xvfb , czyli serwera X z wirtualnym buforowaniem ramek, tj. Serwera X, który wyświetla się tylko w pamięci i nie łączy się z żadnym sprzętem. Nie musisz uruchamiać żadnego klienta, którego nie chcesz na tym serwerze, w szczególności środowiska pulpitu lub menedżera okien.

Xvfb :1 -screen 0 1x1x8 &

Po tym:

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

Musisz poczekać chwilę po uruchomieniu, Xvfbaby wyświetlacz był dostępny. Możesz użyć, xinitaby uruchomić serwer X, a następnie uruchomić klientów, gdy będzie gotowy. Umieść polecenia, które chcesz uruchomić w skrypcie (zwróć uwagę, że gdy skrypt kończy działanie, serwer X kończy działanie):

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

Uruchom wirtualny serwer X za pomocą

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

Jeśli chcesz uruchomić go w czasie rozruchu, możesz uruchomić go z crona. Uruchom crontab -e(jako użytkownik, nie jako root) i dodaj linię

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

Jeśli chcesz zabić tę sesję, zabij xinitproces.

Gilles „SO- przestań być zły”
źródło
Przepraszam, że przeszkadzam, staram się automatycznie wykonać komendę pulseaudio start (4. linia twojego przykładu) przy starcie. Zastanawiam się, czy jest to właściwość DISPLAY. Próbowałem rc.local, /etc/init.d, rcS, ale skrypt nigdy nie uruchamia pulseaudio. Kiedy uruchamiam skrypt za pośrednictwem SSH, działa idealnie. Byłbym szczęśliwy, gdybyś mógł doradzić.
kursus
Xvfb musi przeprowadzić konfigurację, zanim będzie gotowy do zaakceptowania połączeń X, więc jeśli późniejsze polecenia zostaną uruchomione zbyt wcześnie, może się okazać, że nie mogą połączyć się z serwerem X. Możesz spróbować użyć xinit do uruchomienia Xvfb i umieścić te polecenia w .xinitrc, aby xinit uruchomił je dopiero, gdy Xvfb będzie na nie gotowy.
alanc
Przepraszam, że nie zrozumiałem cię dobrze. Czy muszę uruchomić Xvfb z .xinitrc? W tej chwili jest uruchamiany z rc.local. Jeśli tak, to gdzie mam umieścić polecenie PA? Próbowałem uruchomić polecenie PA w .xinitrc, ale bez powodzenia, coś mi brakuje.
kursus
@kursus Musisz uruchomić wszystkie te polecenia jako użytkownik. Możesz to zrobić z crontab za pomocą @reboot. Alanc ma rację, po uruchomieniu Xvfb musi nastąpić opóźnienie, a xinit rozwiązuje ten problem. Zobacz moją edycję.
Gilles „SO- przestań być zły”,
Dzięki za edycję, teraz jest bardziej jasne. Jednak dostaję opcję nierozpoznaną: Xvfb podczas uruchamiania polecenia xinit , z lub bez wywołania skryptu.
kursus
1

Wczoraj miałem ten sam problem, używając dźwięku Pulse dla Raspberrypi 0 W z DBusem w środowisku bezgłowym, twórz z yocto bez x11 i bez systemu, musisz uruchomić i wyeksportować dbus, zanim uruchomisz pulseaudio.

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

W etc / pulse / client.conf włącz enable-autospawn-for-root = yes

Uruchom, pulseaudio -vaby sprawdzić, czy jest inny problem w twojej konfiguracji. Nie używaj --systemprzełącznika, ponieważ nie będzie poprawny.

pulseaudio -D --disallow-exit
Drl Sherif Omran
źródło
0

Istnieje bardziej elegancki sposób, aby zapobiec dotarciu skryptu do EOF niż użycie sleep 99999999!

Użyj sleep infinityzamiast tego. Robi to, co mówi ...

Jost
źródło