Wie kann ich die VLC-Wiedergabe anhalten, wenn die Kopfhörer nicht angeschlossen sind?


12

Wie kann ich die Wiedergabe von VLC anhalten, wenn meine Kopfhörer angeschlossen sind? Ich kann die Lautsprecher über ALSA stumm schalten, möchte aber den Plug-Trigger verwenden, um die Wiedergabe zu stoppen, wie es bei Smartphones üblich ist.


1
Hinweis: Die zweite Antwort ist zum Zeitpunkt des Schreibens wesentlich effizienter: askubuntu.com/a/642898/20275
int_ua

Antworten:


5

Ok, basierend auf dem, was ich hier gelernt habe , versuche ich einen neuen Ansatz mit ACPI.

  1. Erstellen Sie ein Skript zum Anhalten und Aufheben der VLC-Pause:

    sudo touch /etc/acpi/headphone_jack.sh
    sudo chmod +x /etc/acpi/headphone_jack.sh
    

    und füge folgendes in diese Datei ein:

    _pid=`pgrep vlc`
    _pid="${_pid% *}"
    DBUS_SESSION_BUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$_pid/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
    _username=`grep -z USER= /proc/$_pid/environ |sed 's/.*=//'`
    
    if [ "$3" = unplug ]; then
        su $_username -c "DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause"
    else
        su $_username -c "DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS dbus-send --print-reply --session --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Play"
    fi
    
  2. Jetzt erstellen wir einen Ereignisauslöser (durch vimIhren bevorzugten Texteditor ersetzen ):

    sudo vim /etc/acpi/events/headphones
    

    und fügen Sie Folgendes hinzu:

    event=jack/headphone
    action=/etc/acpi/headphone_jack.sh %e
    
  3. Starten Sie zum Schluss den ACPI-Daemon neu:

    sudo service acpid restart
    

Ich denke, das sollte genau das sein, was Sie benötigen, ohne dass Umfragen erforderlich sind. Der einzige Nachteil, den ich bei dieser Implementierung feststellen kann, besteht darin, dass mehrere Benutzer gleichzeitig VLC ausführen. Ich nehme an, in diesem Fall kann es passieren, dass dieser Ansatz zufällig einen von ihnen anhält und wieder aufnimmt (oder einfach nicht funktioniert).

Ein großes Dankeschön an @int_ua und @Sneetsher, die mir wichtige Informationen zur Behandlung von ACPI-Ereignissen gegeben haben. Außerdem können Sie sich an @ user3073656 wenden, um das Verfahren zu vereinfachen.


1
Um einen Befehl auszuführen, der DBUS benötigt, müssen Sie die Umgebungsvariable der ausgeführten dbus-Sitzung exportieren. Siehe Germars Kommentar zu Sneetshers Antwort.
Daltonfury42

1
Gut erkannt. Hier ist der sauberste Weg, wie ich mir das vorstellen kann. Keine Notwendigkeit für Autostart-Skripte und so weiter.
Stunts

@Stunts, das ist der beste Ansatz, den ich je gesehen habe, um die Ziel-ENV zu erhalten. Es ist möglich, Benutzer auf die gleiche Weise grep -z USER /proc/$_pid/environabzurufen , damit dies für alle Benutzer auf dem Computer funktioniert (mit einer einzigen ausgeführten Sitzung / vlc). Ich habe nach einer solchen Option gesucht.
user.dz

@ Snetsher: Süß! Sieht jetzt viel besser aus. Es kam mir letzte Nacht in den Sinn, aber ich war letzte Nacht zu müde, um klar darüber nachzudenken. Vielen Dank für den Vorstoß in diese Richtung.
Stunts

1
Sie können die Antwort noch verbessern, indem Sie% e verwenden und nur eine einzige Skriptdatei verwenden. Sieh das .
Daltonfury42

9

Ok, dafür müssen Sie ein paar Dinge tun:

  1. Erkennen Sie, wenn die Kopfhörer ausgesteckt sind.
  2. Senden Sie nach dem Ereignis in (1) einen "Pause" -Befehl an VLC.
  3. Erkennen Sie, wann die Kopfhörer wieder eingesteckt sind.
  4. Senden Sie nach dem Ereignis in (3) einen "Play" -Befehl an VLC.

Für (1) und (3): Sie können mit Gezeigten hier . Diese Antwort enthält eine kleine Prozedur zum Ermitteln des Unterschieds zwischen einer gesteckten und einer nicht gesteckten Buchse sowie ein Skript, das Sie an Ihren Fall anpassen können.

Für (2) und (4): Sie sollten die Dbus-Schnittstelle von VLC verwenden. Der relevante Code sollte dies sein:

dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Pause

dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Play

Zum Anhalten bzw. Spielen.

Nun zum Drehbuch. In Ihrem Fall sollte es ungefähr so ​​aussehen:

#!/bin/bash
# This scripts detecs unplugging headphones.

oldstatus="unrelated string"
while [ 1 ]; do
    # The following line has to be changed depending on the difference (use diff) in '/proc/asound/card0/code#0'
    status=$(grep -A 4 'Node 0x16' '/proc/asound/card0/codec#0' |  grep 'Amp-Out vals:  \[0x80 0x80\]')
    if [ "$status" != "$oldstatus" ]; then
        if [ -n "$status" ]; then
            echo "Plugged in"
             dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Play
            oldstatus="$status"
        else
            echo "Unplugged"
            dbus-send --print-reply --session --dest=org.mpris.vlc /Player org.freedesktop.MediaPlayer.Pause
            oldstatus="$status"
        fi
    fi
    # Now sleep for 250 milli-seconds as per @Serg's request (who learnt if from @Fabby)
    # sleep is timer-based so doesn't use *any* processor cycles while sleeping.
    sleep 0.25
done

Fügen Sie dieses geänderte Skript Ihren Startanwendungen hinzu, und Sie sind fertig. Ich denke, es sollte tun, was du wolltest.

PS: Beachten Sie, dass es effizientere Möglichkeiten gibt, dies zu tun, z. B. inotifydas Erkennen von Ereignisänderungen (und möglicherweise auch andere Ansätze). Diese sollten Ihnen jedoch den Einstieg erleichtern (und die anderen liegen über meinem Können und meiner Erfahrung). Ich nehme an, Sie können mit diesem "hackischen" Ansatz beginnen und von hier aus aufbauen.


1
Vielen Dank, das ist sehr hilfreich. Ich werde die Punkte belohnen, falls keine bessere Antwort veröffentlicht wird. Das einzige, was mir nicht gefällt, ist das ständige Umfragen.
Dafür

1
Ich werde dieser Frage folgen! Ich könnte dieses Wissen nutzen.
Stunts

3
Sie können sleep 0.25am Ende eine hinzufügen , was einer Viertelsekunde Verzögerung entspricht. Das schont die CPU und geht trotzdem schnell genug. Ich benutze dies manchmal auch in meinen eigenen Skripten
Sergiy Kolodyazhnyy

2
ACPI behandelt das Abziehen des Kopfhörers. Fügen Sie dies Ihrer Antwort hinzu? askubuntu.com/a/642404/20275
int_ua

Genial! Ich werde heute Abend etwas damit arbeiten.
Stunts
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.