[solved][softhddevice] Soundausgabe über pipewire

  • Hi,


    ich starte den vdr über systemd als User=vdr. Klappt super.

    Dann möchte ich aber, dass der pipewire.service als PulseServer die Sound-Ausgabe von softhddevice macht.

    Ohne den klappt Sound bei mir mit plughw=0,3 wie gewünscht.

    Wenn ich aber den Sound über pipewire laufen lassen möchte, kommt nix aus den Lautsprechern, weil pipewire zu spät startet, und daher sowas wie "audio/alsa: playback open 'pulse' error: Connection refused" gemeldet wird. Wenn dann der pipewire endlich soweit ist, kann softhddevice nicht mehr connecten.

    Oder doch? Oder kann man das anders lösen?


    Danke und ciao.

    Michael.

  • Ich hab eine Methode gefunden, wie man zumindest auf systemd Maschinen eine session für den User vdr zum Zeitpunkt des VDR-Starts verfügbar haben kann, inkl. laufendem pipewire (sofern es für den User aktiviert ist):

    Code
    loginctl enable-linger vdr

    Trotzdem bekomme ich für "-a pulse" den Fehler "audio/alsa: playback open 'pulse' error: Connection refused".

    Für "-a pipewire" kommt stattdessen "audio/alsa: playback open 'pipewire' error: Host is down".

    Das Dumme ist, dass der VDR bei mir als root gestartet wird und erst später den Kontextswitch zum User vdr macht. Dadurch ist die laufende Session nicht die, die von ihm genutzt wird.

  • Kannst Du pipewire per systemd kontrollieren?


    Wenn ja, evtl. in etwa folgende Abhängigkeit per systemd definieren ("injecten"):

    Code
    cat /etc/systemd/system/vdr.service.d/vdrreqs.conf
    
    [Unit]
    After=pipewire.service
    Wants=pipewire.service

    VDR startet dann "After" und "Wants" würde relativ hart definieren, ohne pipewire startet VDR nicht ... "pipewire.service" hatte ich jetzt einfach mal als Service-Namen angenommen ...

    HowTo: APT pinning

    2 Mal editiert, zuletzt von fnu ()

  • Eventuell hilft der Ansatz, den ich für yavdr-ansible gewählt habe - da lasse ich eine extra Session für den Nutzer vdr starten (entweder mit oder ohne X-Server, je nachdem welches Ausgabeplugin genutzt wird) und definiere diese Systemd-Unit als Abhängigkeit für die vdr.service.


    Ansonsten gibt es wohl ein Analogon zu pulseaudio's System Mode, aber ich habe noch nicht ausprobieret, welche Implikationen das hat: https://gitlab.freedesktop.org…/issues/1610#note_1079810

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Eventuell hilft der Ansatz, den ich für yavdr-ansible gewählt habe - da lasse ich eine extra Session für den Nutzer vdr starten (entweder mit oder ohne X-Server, je nachdem welches Ausgabeplugin genutzt wird) und definiere diese Systemd-Unit als Abhängigkeit für die vdr.service.

    Wie startest du eine Session für den User vdr? Auch über den lingering Mechanismus von systemd?

    Und wie schaffst du es, einen X-Server als user zu starten?

    Das mit dem Systemmode von pipewire ist eher krampfig - IMHO. Hatte ich ausprobiert, aber das will man (ich) eigentlich nicht.


    Aber: Ich habe es miittlerweile geschafft, dass pipewire startet, bevor der VDR losläuft.

    Dummerweise klappt es trotzdem nicht - selbe Fehler wie oben.

    Irgendwelche Rechte fehlen da ggf. noch, oder softhddevice kann mit dem Service pulse oder pipewire nicht connecten, wenn es kein echtes Pulseaudio ist.

  • Ich beschreibe mal, was ich gemacht habe:

    1. Eine permanente Session für den User aktiviert:
      - loginctl enable-linger vdr
      - pipewire, pipewire-pulse und wireplumber als user services für die Kennung vdr enabled
      => Die Session wird mit laufenden Pipewire services bei Booten zur Verfügung gestellt.
    2. Zwei vdr Services kreiert:
      - einen system service für die Root-Aktionen - also X Server starten, tty Berechtigungen setzen, ...
      - einen user service für den Start von vdr, der ebenfalls in o.a. permanter Session mit gestartet wird

    Damit funktioniert im Groben alles bis auf den Connect von softhddevice zu pipewire - und wie gesagt, obwohl pipewire verfügbar ist.

    3 Mal editiert, zuletzt von nobanzai ()

  • Wie startest du eine Session für den User vdr? Auch über den lingering Mechanismus von systemd?

    Nein, über eine richtige Login-Session - die Variante mit X-Server sieht so aus (der X-Server startet da noch als root, ich hab noch nicht ausprobiert, ob das bei aktuellen Ubuntu Versionen noch notwendig ist:


    Will man den X-Server auf dem Virtuellen Terminal Nummer 7 haben, kann man systemctl enable x@vt7.service aufrufen.


    Die User-Session funktioniert über eine xlogin@.service, in der eine Login-Shell für den User gestartet wird - der ausgeführte Befehl muss endlos laufen:

    Für den User vdr schaltet man das mittels systemctl enable xlogin@vdr.service scharf.


    Bei yaVDR wird über die .xinitrc eine Openbox-Session gestartet:

    Code: /var/lib/vdr/.xinitrc
    #!/usb/bin/bash
    
    exec openbox-session

    Im Autostart von Openbox lasse ich u.a. die relevanten Umgebungsvariablen der Session in eine Datei schreiben, setze das Hintergrundbild und sorge dafür, dass ein paar Dienste verfügbar sind, die vom yavdr-desktop.target gezogen werden:

    Damit man alle Dienste für die Session in einem Rutsch starten bzw. stoppen kann gibt es eine übergeordnete Unit:


    Und damit der VDR die Umgebungsvariablen der gestarteten Session kennt, gibt es ein Snippet, das die vdr.service entsprechend erweitert:

    Code: /etc/systemd/system/vdr.service.d/load-environ.conf
    [Service]
    EnvironmentFile=-/etc/default/locale
    Environment=XDG_RUNTIME_DIR=/run/user/666/
    EnvironmentFile=-/home/vdr/.session-env
    Environment=VDR_ID=0

    Und eines, das dafür sorgt, dass der VDR erst nach der Session startet:

    Code: /etc/systemd/system/vdr.service.d/vdr-xorg.conf
    [Unit]
    After=x@vt7.service xlogin@vdr.service yavdr-xorg.service
    Wants=x@vt7.service xlogin@vdr.service yavdr-xorg.service
    #BindsTo=x@vt7.service  # this would cause the vdr to terminate if the X-Server is stopped, not necessary if the frontend is detached

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Uiui, das sieht aber richtig komplex aus.

    Danke fürs Teilen!

  • Also egal, was ich mache - ich kriege softhddevice mit "-a pulse|pipewire" nicht zum Laufen. "-a plughw:0,3" klappt.

    Auch wenn der VDR als User "vdr" nach pipewire, pipewire-pulse und wireplumber gestartet wird, kommen die Fehler "connection refused" bei pulse, "host is down" bei pipewire. Ein aplay -D pulse|pipewire klappt allerdings, wenn man als vdr angemeldet ist.

    Habe ich da irgendwo einen Denkfehler drin oder hat da softhddevice ein Problem? Denn an den Berechtigungen liegt es ja offenbar nicht.

  • -a hdmi:CARD=PCH,DEV=0 klappt ebenfalls - nur der Vollständigkeit halber

  • nobanzai

    Hat den Titel des Themas von „vdr über systemd mit pipewire“ zu „[softhddevice] Soundausgabe über pipewire“ geändert.
  • Ich hab mal den Titel geändert, weil das doch eher zu softhddevice passt. Der Rest scheint ja zu funktionieren.

  • So, ok, über pulseaudio klappt es wieder.

    Ich habe den ganzen Krempel von pipewire wieder de- und pulseaudio installiert.

    Dazu noch eine /home/vdr/.config/pulse/client.conf mit "autospawn=yes" erstellt.


    Jetzt nochmal neu mit pipewire anfangen - evtl. klappt es ja im n-ten Versuch :)

  • Welchen Sinn macht pipewire beim VDR?

    Test-VDR1: HP rp5700 Fertigsystem, Core2Duo E6400, 2GB RAM, FF-SD C-2300, nvidia Slim-GT218 x1 | easyVDR 2.0 64Bit
    VDR3: in Rente

    VDR4: MSI G31M2 v2, Digitainer2-Geh., t6963c 6" gLCD, E5200, 2GB, 3TB WD Red, GT730, 2x TT S2-3200; easyVDR 3.5 64bit
    VDR5: Gigabyte
    GA-G31M-S2L, Intel E2140, Zotac GT730 passiv, Digitainer2-Geh., t6963c 6 " gLCD, 2 TB WD Red, 2x TT S2-3200 (an 1 Kabel) easyVDR 3.5 64bit
    VDR6:
    Intel E5200, GT630 passiv, F1 750 GB, t6963c gLCD, 2x TT S2-3200 | easyVDR 3.5 64bit
    VDR-User #1068
    www.easy-vdr.de

  • Naja, dieselbe wie bei pulse :)

    Wenn noch etwas Sound ausgeben soll wie z.B. ein Umweltüberwachungssystem.

  • Welchen Sinn macht pipewire beim VDR?

    ab Ubuntu 22.10 wird nur noch pipewire unterstützt. Auch ich habe bei Ubuntu 22.04 die Erfahrung gemacht das pipewire sich sauber installieren lässt aber weder softhddrm, softhdvaapi .... etc dies zur Zeit am VDR unterstützen (z.B. bei Dolby 5.1 etc...). So konnte ich hierfür auch nur zurück auf Pulsaudio wechseln :/ ;(

    (VDR) NUC11PAH & GEEKOM MINI-IT11-11. Generation * BM2LTS * DD NET S2 Max * NC * (Sound) Cinebar Lux Set * (Stream) Apple TV 4K (2022) *

    (Light) PHILIPS Hue Play HDMI Sync Box & Gradient Lightstrip * (OLED TV) LG OLED65G29LA

  • Was ich hier mit pipewire-pulse nicht verstehe:

    Ich mache genau das, was in https://en.opensuse.org/openSUSE:Pipewire beschrieben ist. Da steht dann:

    "When the installation finishes, reboot the computer. The pipewire-pulse socket unit should be automatically enabled and active after that which will make PulseAudio applications to believe PulseAudio is running while PipeWire is actually used."

    Wenn ich reboote und mich dann als User vdr anmelde, habe ich auch wirklich den Socket aktiv wie beschrieben:

    Code
    systemctl --user status pipewire-pulse.socket
    ● pipewire-pulse.socket - PipeWire PulseAudio
         Loaded: loaded (/usr/lib/systemd/user/pipewire-pulse.socket; enabled; preset: enabled)
         Active: active (listening) since Wed 2023-04-12 15:12:45 CEST; 2min 0s ago
       Triggers: ● pipewire-pulse.service
         Listen: /run/user/11111/pulse/native (Stream)
         CGroup: /user.slice/user-11111.slice/user@11111.service/app.slice/pipewire-pulse.socket

    Wenn ich mit aplay schaue, ist der pulseaudio server auch da, und ich kann mit aplay was abspielen - der pipewire.service und der pipewire-pulse.service werden dabei automatisch mit hochgezogen:

    Wenn ich aber dann auch als User vdr den VDR mit "softhddevice -a pulse" starte, bekomme ich trotzdem "audio/alsa: playback open 'pulse' error: Connection refused".

    Das kommt aus snd_pcm_open, also aus den ALSA-Libs, die ja auch über aplay verwendet werden.

    Wieso?

    Achso ja - wenn ich den VDR starte, bevor ich einmal sowas wie aplay aufgerufen habe, dann existieren danach auch pipewire.service und der pipewire-pulse.service nicht, werden also trotz aktivem Socket nicht hochgezogen. Irgendwo fehlt da ein Bindeglied, aber wo?

    2 Mal editiert, zuletzt von nobanzai ()

  • Sind denn die Umgebungsvariablen für den VDR-Prozess passend gesetzt? Also das was ich über die .session-env Datei bei den oben geposteten Skripten mache?

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Sind denn die Umgebungsvariablen für den VDR-Prozess passend gesetzt? Also das was ich über die .session-env Datei bei den oben geposteten Skripten mache?

    Bei mir läuft der VDR ja als echter user service - da brauche ich das doch eigentlich nicht, weil es ja seine native Umgebung ist, oder?

    Wenn ich in dem Startscript, das der user service aufruft, ein env ausführe, kommt Folgendes raus:

    Das service file sieht so aus:

  • Code
    systemctl --user stop pulseaudio.service pulseaudio.socket
    systemctl --user disable pulseaudio.service pulseaudio.socket
    systemctl --user mask pulseaudio.service pulseaudio.socket
    systemctl --user enable pipewire.socket pipewire-pulse.socket
    systemctl --user start pipewire.socket pipewire-pulse.socket

    da sollte doch Pulsaudio deaktiviert werden


    Was gibt denn

    Code
    LANG=C pactl info | grep '^Server Name'

    aus?

    Server Name: PulseAudio (on PipeWire 0.3.68)

    Code
    apt list --installed | grep pipewire
    gstreamer1.0-pipewire/impish,now 0.3.68-1 amd64 [installed,automatic]
    libpipewire-0.3-0/impish,now 0.3.68-1 amd64 [installed,automatic]
    libpipewire-0.3-common/impish,now 0.3.68-1 all [installed,automatic]
    libpipewire-0.3-modules/impish,now 0.3.68-1 amd64 [installed,automatic]
    pipewire-audio-client-libraries/impish,now 0.3.68-1 amd64 [installed]
    pipewire-bin/impish,now 0.3.68-1 amd64 [installed,automatic]
    pipewire-media-session/impish,now 0.3.68-1 amd64 [installed,automatic]
    pipewire-pulse/impish,now 0.3.68-1 amd64 [installed]
    pipewire/impish,now 0.3.68-1 amd64 [installed,automatic]

    (VDR) NUC11PAH & GEEKOM MINI-IT11-11. Generation * BM2LTS * DD NET S2 Max * NC * (Sound) Cinebar Lux Set * (Stream) Apple TV 4K (2022) *

    (Light) PHILIPS Hue Play HDMI Sync Box & Gradient Lightstrip * (OLED TV) LG OLED65G29LA

    Einmal editiert, zuletzt von cinfo ()

  • Landet das auch in den Umgebungsvariablen für den VDR-Prozess?

    sudo cat /proc/$(pidof vdr)/environ | tr '\0' '\n'

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!