Tester gesucht für programmatische Wahl des Ausgabegeräts über Pulseaudio

  • Hallo,

    ich experimentiere gerade, wie man von außerhalb der Desktop-Session das Ausgabegerät setzen könnte (z.B. um das über das Playbook oder später auch über das Webfrontend zu machen) - damit das unabhängig von einem laufenden VDR möglich ist (das pulsecontrol-Plugin von mini73 bietet da ja schon ein SVDRP-Interface) wäre mein Ansatz ist ein kleines Python-Skript zu nutzen, das in der Session läuft, aber auf dem System-Bus über DBus erreichbar ist - damit DBus das erlaubt, benötigt man folgende Policy:

    Für das Skript benötigt werden das Paket python3-dasbus und python-pulse-control (das kann man der Einfachheit halber zum Testen in einem venv installieren, später würde ich ein Paket dafür erstellen):

    Code
    # Abhängigkeiten installieren
    sudo apt install python3-dasbus python3-venv
    # eine Shell in der User Session öffnen:
    sudo tmux -S /tmp/tmux-666/default
    # in der User-Session
    python -m venv --system-site-packages ~/.pulsectl-venv
    . ~/.pulsectl-venv/bin/activate
    pip install -U pip pulsectl

    Das Skript sieht so aus (der Pfad kann grundsätzlich beliebig gewählt werden):

    Jetzt sollte man es aus der User-Session heraus so aufrufen können:

    ~/.pulsectl-venv/bin/python ~/bin/pulse_dbus_ctl.py

    Was mich jetzt interessiert, sind in einem zweiten Terminal die Ausgaben von dbus-send --system --type=method_call --dest=org.yavdr.PulseDBusCtl --print-reply /org/yavdr/PulseDBusCtl org.yavdr.PulseDBusCtl.ListSinks

    Und ob das Wechseln des Ausgabegeräts inkl. bewegen der Input-Sinks auf das neue Ausgabegerät klappt - z.B. hat mein Test-System einen optischen SPDIF-Ausgang und einen HDMI-Ausgang - der erste String im struct ist der Name des Ausgabegeräts, den man nutzen kann, um die Ausgabe umzustellen:

    Mit dem Device-Namen kann ich programmatisch das Ausgabegerät wechseln:

    Code
    # Wechsel auf HDMI-Ausgabe
    dbus-send --system --type=method_call --dest=org.yavdr.PulseDBusCtl --print-reply /org/yavdr/PulseDBusCtl org.yavdr.PulseDBusCtl.SetDefaultSink string:"alsa_output.pci-0000_01_00.1.hdmi-stereo"
    # Wechsel auf S/PDIF
    dbus-send --system --type=method_call --dest=org.yavdr.PulseDBusCtl --print-reply /org/yavdr/PulseDBusCtl org.yavdr.PulseDBusCtl.SetDefaultSink string:"alsa_output.pci-0000_00_1b.0.iec958-stereo"

    Wie sieht das bei euch aus? Mich würde da vor allem interessieren, wie das mit Receivern funktioniert, die mehr als Stereo-Ausgabeprofile unterstützen.

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hallo seahawk,

    Code
    vdr@vdr:/home/norbert$ dbus-send --system --type=method_call --dest=org.yavdr.PulseDBusCtl --print-reply /org/yavdr/PulseDBusCtl org.yavdr.PulseDBusCtl.SetDefaultSink string:"alsa_output.pci-0000_00_1b.0.iec958-stereo"
    method return time=1640368731.473678 sender=:1.97 -> destination=:1.100 serial=5 reply_serial=2
    boolean true
    vdr@vdr:/home/norbert$ dbus-send --system --type=method_call --dest=org.yavdr.PulseDBusCtl --print-reply /org/yavdr/PulseDBusCtl org.yavdr.PulseDBusCtl.SetDefaultSink string:"alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1"
    method return time=1640368785.241251 sender=:1.97 -> destination=:1.101 serial=6 reply_serial=2
    boolean true



    Frohes Fest,

    Murry

    Mein vdr

    SilverStone Milo ML03 schwarz, ASRock H67M-GE/HT, Gigabyte GT1030 Silent, Intel Pentium G630T, DD Cine S2 V6.2, yavdr ansible, Onkyo 508, LG55LA6608, Unicable

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!