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
    1. # Abhängigkeiten installieren
    2. sudo apt install python3-dasbus python3-venv
    3. # eine Shell in der User Session öffnen:
    4. sudo tmux -S /tmp/tmux-666/default
    5. # in der User-Session
    6. python -m venv --system-site-packages ~/.pulsectl-venv
    7. . ~/.pulsectl-venv/bin/activate
    8. 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
    1. # Wechsel auf HDMI-Ausgabe
    2. 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"
    3. # Wechsel auf S/PDIF
    4. 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.

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Hallo seahawk,

    Code
    1. 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"
    2. method return time=1640368731.473678 sender=:1.97 -> destination=:1.100 serial=5 reply_serial=2
    3. boolean true
    4. 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"
    5. method return time=1640368785.241251 sender=:1.97 -> destination=:1.101 serial=6 reply_serial=2
    6. boolean true



    Frohes Fest,


    Murry