web-dev-qa-db-fra.com

Comment mettre en pause la lecture de VLC lorsque les écouteurs sont déconnectés?

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.

12
HerHde

Ok, donc basé sur ce que j'ai appris de ici , j'essaie une nouvelle approche, en utilisant ACPI.

  1. 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
    
  2. 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
    
  3. 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.

5
Stunts

Ok, vous devrez donc faire quelques choses pour cela:

  1. Détecte quand les écouteurs sont débranchés;
  2. Après l’événement dans (1), envoyez une commande "pause" à VLC;
  3. Détectez quand les écouteurs sont rebranchés;
  4. Après l’événement dans (3), envoyez une commande "play" à VLC;

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à.

9
Stunts