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.
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.
Antworten:
Ok, basierend auf dem, was ich hier gelernt habe , versuche ich einen neuen Ansatz mit ACPI.
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
Jetzt erstellen wir einen Ereignisauslöser (durch vim
Ihren 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
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.
grep -z USER /proc/$_pid/environ
abzurufen , damit dies für alle Benutzer auf dem Computer funktioniert (mit einer einzigen ausgeführten Sitzung / vlc). Ich habe nach einer solchen Option gesucht.
Ok, dafür müssen Sie ein paar Dinge tun:
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. inotify
das 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.
sleep 0.25
am 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