Iniciar uma sessão X falsa / mínima para o Pulseaudio / dbus

13

Eu uso o Pulseaudio para compartilhar áudio entre uma área de trabalho e um Raspberry Pi.

No entanto, o Pulseaudio precisa de dbus, e o dbus precisa de uma sessão X. Sem sessão gráfica, o Pulseaudio só pode ser executado no modo de sistema, que não é oficialmente recomendado.

Além de um Raspberry Pi, o custo de uma sessão X é muito alto, então eu gostaria de me livrar dela da maneira mais eficiente (menos cara).

Como posso iniciar a menor sessão X do Pulseaudio?

kursus
fonte
O Udev definitivamente não precisa do X. Eu não sei sobre o Pulseaudio: o que falha na ausência do X? Isso está relacionado ao D-Bus?
Gilles 'SO- stop be evil'
Bem, eu li isso, mas pode ser apenas o Pulseaudio. Na ausência do X Pulseaudio, é lançado no modo amplo do sistema, o que significa que nenhuma sessão por usuário é ruim, como diz o site oficial: freedesktop.org/wiki/Software/PulseAudio/Documentation/User/…
kursus
Desculpe eu misturei udev e dbus, editado.
kursus

Respostas:

11

Você pode usar o Xvfb , que é um servidor X com um buffer de estrutura virtual, ou seja, um servidor X que é exibido apenas na memória e não se conecta a nenhum hardware. Você não precisa executar nenhum cliente que não queira nesse servidor e, em particular, nenhum ambiente de desktop ou gerenciador de janelas.

Xvfb :1 -screen 0 1x1x8 &

Depois disto:

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

Você precisa esperar um pouco depois de iniciar Xvfbpara que a exibição esteja disponível. Você pode usar xinitpara iniciar um servidor X e, em seguida, iniciar clientes quando estiver pronto. Coloque os comandos que você deseja executar em um script (observe que, quando o script sai, o servidor X sai):

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

Inicie o servidor X virtual com

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

Se você deseja executá-lo no momento da inicialização, é possível iniciá-lo a partir do cron. Execute crontab -e(como seu usuário, não como root) e adicione a linha

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

Se você deseja matar esta sessão, mate o xinitprocesso.

Gilles 'SO- parar de ser mau'
fonte
Desculpe incomodar. Eu luto para executar automaticamente o comando pulseaudio start (quarta linha do seu exemplo) na inicialização. Gostaria de saber se é a propriedade DISPLAY. Tentei rc.local, /etc/init.d, rcS, mas o script nunca inicia o pulseaudio. Quando executo meu script via SSH, ele funciona perfeitamente. Eu ficaria feliz se você pudesse aconselhar.
Kursus
O Xvfb precisa fazer algumas configurações antes de estar pronto para aceitar conexões X, portanto, se os comandos posteriores forem executados muito cedo, você poderá descobrir que eles não conseguem se conectar ao servidor X. Você pode querer usar o xinit para iniciar o Xvfb e colocar esses comandos no .xinitrc, para que o xinit os inicie apenas quando o Xvfb estiver pronto para eles.
Alanc
Sinto muito por não ter te curado. Preciso iniciar o Xvfb com .xinitrc? No momento, ele é iniciado com o rc.local. Se sim, onde coloco o comando PA? Tentei iniciar o comando PA no .xinitrc, mas sem sorte, estou perdendo alguma coisa.
Kursus
@kursus Você precisa executar todos esses comandos como usuário. Você pode fazer isso de um crontab com @reboot. Também alanc está certo, é preciso haver um atraso após iniciar o Xvfb, e o xinit resolve esse problema. Veja minha edição.
Gilles 'SO- stop be evil'
Obrigado pela edição, agora está mais claro. No entanto, recebo uma opção não reconhecida: Xvfb ao iniciar o comando xinit, com ou sem a chamada de script.
kursus
1

Eu tive o mesmo problema ontem, usando o Pulse audio para raspberrypi 0 W com DBus em um ambiente sem cabeça, crie com o yocto sem x11 e sem systemd, você precisa executar e exportar o dbus antes de executar o pulseaudio.

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

No etc / pulse / client.conf, ative allow-autospawn-for-root = yes

Execute pulseaudio -vpara verificar se há outro problema na sua configuração. Não use a --systemopção porque ela não estará correta.

pulseaudio -D --disallow-exit
Drl Sherif Omran
fonte
0

Existe uma maneira mais elegante de impedir que o script atinja o EOF do que usar sleep 99999999 !

Use em sleep infinityvez disso. Faz o que diz ...

Jost
fonte