Запустіть фальшивий / мінімальний X сеанс для Pulseaudio / dbus


13

Я використовую Pulseaudio для обміну звуком між робочим столом та Raspberry Pi.

Однак Pulseaudio потребує dbus, а dbus потрібен X сеанс. Без графічного сеансу Pulseaudio може працювати лише в системному режимі, що офіційно не рекомендується.

Окрім Raspberry Pi, вартість X сесії надзвичайно висока, тому я хотів би позбутися від неї найбільш ефективним (менш затратним) способом.

Як я можу розпочати найменший сеанс Х для запуску Pulseaudio?


Udev, безумовно, не потребує X. Я не знаю про Pulseaudio: що не вдається за відсутності X? Це пов’язано з D-Bus?
Жил "ТАК - перестань бути злим"

Ну, я це прочитав, але це може бути лише Pulseaudio. За відсутності X Pulseaudio запускається в системному режимі, що означає відсутність сеансу для кожного користувача, що погано, як пише офіційний веб-сайт: freedesktop.org/wiki/Software/PulseAudio/Documentation/User/…
kursus

Вибачте, я змішав udev та dbus, відредагований.
kursus

Відповіді:


11

Ви можете використовувати Xvfb , що являє собою X-сервер з віртуальним фреймбуфером, тобто X-сервер, який відображається лише в пам'яті і не підключається до жодного обладнання. Вам не потрібно запускати жодного клієнта, якого ви не хочете, на цьому сервері, і зокрема, немає середовища для робочого столу чи вікна.

Xvfb :1 -screen 0 1x1x8 &

Після цього:

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

Після запуску Xvfbдисплея потрібно трохи почекати, щоб дисплей став доступним. Ви можете використовувати xinitдля запуску X-сервера, а потім запускати клієнтів, коли він готовий. Покладіть команди, які потрібно запустити в сценарій (зауважте, що коли сценарій закінчується, X-сервер виходить):

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

Запустіть віртуальний X-сервер за допомогою

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

Якщо ви хочете запустити його під час завантаження, можете запустити його з cron. Запустіть crontab -e(як ваш користувач, а не як root) та додайте рядок

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

Якщо ви хочете вбити цей сеанс, вбийте xinitпроцес.


Вибачте, що турбуєте, я намагаюся автоматично виконати команду пуску pulseaudio (четвертий рядок вашого прикладу) під час завантаження. Цікаво, чи це властивість DISPLAY. Я спробував rc.local, /etc/init.d, rcS, але сценарій ніколи не запускається pulseaudio. Коли я запускаю свій скрипт через SSH, він прекрасно працює. Буду радий, якщо ви можете порадитись.
kursus

Xvfb повинен виконати певну настройку, перш ніж він буде готовий прийняти X-з'єднання, тому якщо пізніші команди запустяться занадто рано, ви можете виявити, що вони не зможуть підключитися до X-сервера. Ви можете вивчити використання xinit для запуску Xvfb і ввести ці команди в .xinitrc, щоб xinit запускав їх лише після того, як Xvfb буде готовий до них.
alanc

Вибачте, що я вас не поправив. Чи потрібно починати Xvfb з .xinitrc? Зараз він починається з rc.local. Якщо так, куди я кладу команду PA? Я спробував запустити команду PA в .xinitrc, але не пощастило, мені щось не вистачає.
kursus

@kursus Вам потрібно виконати всі ці команди як ваш користувач. Ви можете зробити це з кронтабула за допомогою @reboot. Також alanc має рацію, після запуску Xvfb має бути затримка, і xinit вирішує цю проблему. Дивіться мою редакцію.
Жил "ТАК - перестань бути злим"

Дякую за редагування, тепер це вже зрозуміліше. Однак я отримую нерозпізнаний варіант: Xvfb при запуску команди xinit, з або без скриптового виклику.
kursus

1

У мене була та сама проблема вчора, використовуючи імпульсне аудіо для малинових 0 Вт з DBus у безголовому середовищі, створюйте з yocto без x11 і без systemd, вам потрібно запустити та експортувати dbus, перш ніж запускати pulseaudio.

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

У etc / pulse / client.conf, будь ласка, увімкніть enable-autospawn-for-root = так

Запустіть, pulseaudio -vщоб перевірити, чи є інша проблема у вашому конфігурації. Не використовуйте --systemперемикач, оскільки він не буде правильним.

pulseaudio -D --disallow-exit

0

Є більш елегантний спосіб запобігти досягненню сценарію EOF, ніж використання sleep 99999999!

Використовуйте sleep infinityзамість цього. Він робить те, що говорить ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.