Comment mettre en pause la lecture VLC lorsque le casque est déconnecté?

12

Comment est-il possible de suspendre la lecture de VLC lorsque mes écouteurs sont débranchés? Je peux couper les haut-parleurs via ALSA, mais je veux utiliser le déclencheur de prise pour arrêter la lecture, comme cela est habituel dans les smartphones.

HerHde
la source
1
Remarque: la deuxième réponse est beaucoup plus efficace au moment de la rédaction: askubuntu.com/a/642898/20275
int_ua

Réponses:

5

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

  1. Créez un script pour suspendre et réactiver VLC:

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

    et placez ce qui suit sur 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-le vimpar 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 cela devrait être exactement ce dont vous avez besoin, sans sondage. Le seul inconvénient que je peux trouver avec cette implémentation est dans le cas où plusieurs utilisateurs exécutent VLC en même temps. Je suppose que dans ce cas, ce qui peut arriver, c'est que cette approche s'arrêtera au hasard et reprendra l'un d'entre eux (ou cela pourrait tout simplement ne pas fonctionner).

Félicitations à @int_ua et @Sneetsher pour m'avoir fourni des connaissances importantes concernant la gestion des événements ACPI. Bravo également à @ user3073656 pour aider à simplifier la procédure.

Cascades
la source
1
pour exécuter une commande nécessitant DBUS, vous devez exporter la variable d'environnement de la session dbus en cours d'exécution. Voir le commentaire de Germar sur la réponse de Sneetsher.
daltonfury42
1
Bien repéré. Voici la manière la plus propre à laquelle je pourrais penser. Pas besoin de scripts de démarrage automatique et ainsi de suite.
Stunts
@Stunts, c'est la meilleure approche que j'ai vue pour atteindre la cible ENV. Il est possible d'obtenir l'utilisateur de la même manière grep -z USER /proc/$_pid/environafin que cela fonctionne pour tous les utilisateurs de la machine (avec une seule session en cours d'exécution / vlc). Je cherchais une telle option.
user.dz
@Sneetsher: Sweet! Ça a l'air beaucoup mieux maintenant. Cela m'a traversé l'esprit la nuit dernière, mais j'étais trop fatigué la nuit dernière pour y penser clairement. Merci pour la poussée dans cette direction.
Stunts
1
Vous pouvez toujours améliorer la réponse en utilisant% e et en utilisant un seul fichier de script. Regardez ça .
daltonfury42
9

Ok, vous devrez donc faire quelques choses pour cela:

  1. Détectez 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 de (3), envoyez une commande "play" à VLC;

Pour (1) et (3): vous pouvez utiliser ce qui est illustré ici . Cette réponse contient une petite procédure pour trouver la différence entre une prise branchée et non 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 pertinent doit être le suivant:

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 pause et lecture respectivement.

Maintenant, à propos du script. Dans votre cas, cela devrait ressembler à ceci:

#!/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 qu'il devrait faire ce que vous vouliez.

PS - Notez qu'il existe des moyens plus efficaces de le faire, tels que l'utilisation inotifypour détecter les changements d'événement (et peut-être même d'autres approches), mais celui-ci devrait vous aider à démarrer (et les autres sont au-dessus de mon niveau de compétence et de mon expérience). Je suppose que vous pouvez commencer avec cette approche "hackish" et construire à partir d'ici.

Cascades
la source
1
Merci beaucoup, c'est vraiment utile. Je récompenserai les points au cas où aucune meilleure réponse ne serait publiée. La seule chose que je n'aime pas, c'est le sondage constant, j'ai créé une question distincte pour cela: askubuntu.com/questions/640741/…
int_ua
1
Je vais suivre cette question! Je pourrais utiliser cette connaissance.
Stunts
3
Vous pouvez ajouter un sleep 0.25à la fin, ce qui représente un quart de seconde de retard. Cela facilite le processeur et fonctionne toujours assez rapidement. J'utilise parfois cela aussi dans mes propres scripts
Sergiy Kolodyazhnyy
2
ACPI gère le débranchement des écouteurs, l'ajouterez-vous à votre réponse? askubuntu.com/a/642404/20275
int_ua
Impressionnant! Je vais travailler quelque chose avec ce soir.
Stunts