Comment est-il possible de suspendre la lecture de VLC lorsque mes écouteurs sont débranchés? Je peux désactiver les haut-parleurs via ALSA, mais je souhaite utiliser la gâchette pour arrêter la lecture, comme c'est le cas dans les smartphones.
Ok, donc basé sur ce que j'ai appris de ici , j'essaie une nouvelle approche, en utilisant ACPI.
Créez un script pour mettre VLC en pause et le mettre en pause:
Sudo touch /etc/acpi/headphone_jack.sh
Sudo chmod +x /etc/acpi/headphone_jack.sh
et placez ce qui suit dans ce fichier:
_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
Créons maintenant un déclencheur d’événement (remplacez vim
par votre éditeur de texte préféré):
Sudo vim /etc/acpi/events/headphones
et ajoutez ce qui suit:
event=jack/headphone
action=/etc/acpi/headphone_jack.sh %e
Enfin, redémarrez le démon ACPI:
Sudo service acpid restart
Je pense que le devrait être exactement ce que vous avez besoin, sans sondage. Le seul inconvénient de cette implémentation réside dans le fait que plusieurs utilisateurs exécutent VLC en même temps. Je suppose que dans ce cas, ce qui peut arriver, c’est que cette approche met en pause et reprend aléatoirement l’une d’elles (ou que cela ne fonctionne tout simplement pas).
Un grand bravo à @int_ua et @Sneetsher pour m'avoir fourni des connaissances importantes sur la gestion des événements ACPI. Merci également à @ user3073656 pour vous aider à simplifier la procédure.
Ok, vous devrez donc faire quelques choses pour cela:
Pour (1) et (3): Vous pouvez utiliser ce qui est montré ici . Cette réponse contient une petite procédure permettant de trouver la différence entre une prise branchée et une prise débranchée et un script que vous pouvez modifier pour vous conformer à votre cas.
Pour (2) et (4): Vous devez utiliser l'interface Dbus de VLC. Le code approprié devrait être ceci:
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
Pour faire une pause et jouer respectivement.
Maintenant, à propos du script. Dans votre cas, cela devrait ressembler à quelque chose comme ça:
#!/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
Ajoutez ce script modifié à vos applications de démarrage et vous êtes prêt. Je pense que ça devrait faire ce que tu voulais.
PS - Notez qu’il existe des moyens plus efficaces de le faire, comme utiliser inotify
pour détecter les changements d’événement (et peut-être même d’autres approches), mais celle-ci devrait vous aider à démarrer (et les autres sont au-dessus de mon niveau de expérience). Je suppose que vous pouvez commencer avec cette approche "hackish", et construire à partir de là.