Come mettere in pausa la riproduzione VLC quando le cuffie sono disconnesse?


12

Come è possibile mettere in pausa la riproduzione di VLC quando le cuffie sono scollegate? Posso silenziare gli altoparlanti tramite ALSA, ma voglio usare il grilletto per interrompere la riproduzione, come al solito negli smartphone.


1
Avviso: la seconda risposta è molto più efficiente al momento in cui scrivo: askubuntu.com/a/642898/20275
int_ua

Risposte:


5

Ok, quindi in base a ciò che ho imparato da qui , sto provando un nuovo approccio, usando ACPI.

  1. Crea uno script, per mettere in pausa e non sospendere VLC:

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

    e posizionare quanto segue su questo file:

    _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. Ora creiamo un trigger di evento (sostituiscilo vimcon il tuo editor di testo preferito):

    sudo vim /etc/acpi/events/headphones
    

    e aggiungi quanto segue:

    event=jack/headphone
    action=/etc/acpi/headphone_jack.sh %e
    
  3. Infine, riavvia il demone ACPI:

    sudo service acpid restart
    

Penso che dovrebbe essere esattamente ciò di cui hai bisogno, senza il polling coinvolto. L'unico inconveniente che posso trovare con questa implementazione è nel caso in cui più utenti eseguano VLC contemporaneamente. Suppongo che in quel caso, ciò che può accadere è che questo approccio si interromperà e riprenderà casualmente uno di essi (o potrebbe semplicemente non funzionare).

Complimenti a @int_ua e @Sneetsher per avermi fornito importanti conoscenze sulla gestione degli eventi ACPI. Pollice fino a @ user3073656 per aiutare a semplificare la procedura.


1
per eseguire qualsiasi comando che richiede DBUS, è necessario esportare la variabile di ambiente della sessione dbus in esecuzione. Vedi il commento di Germar sulla risposta di Sneetsher.
daltonfury42,

1
Ben individuato. Ecco il modo più pulito a cui potrei pensare di farlo. Non sono necessari script di avvio automatico e quant'altro.
Acrobazie

@Stunts, questo è l'approccio migliore che ho visto per ottenere ENV target. È possibile ottenere lo stesso utente in modo grep -z USER /proc/$_pid/environche funzioni per tutti gli utenti della macchina (con singola sessione in esecuzione / vlc). Stavo cercando tale opzione.
user.dz

@Sneetsher: Sweet! Sembra molto meglio ora. Mi è passato per la mente la scorsa notte, ma ero troppo stanco la scorsa notte per pensarci chiaramente. Grazie per la spinta in quella direzione.
Acrobazie dal

1
Puoi ancora migliorare la risposta usando% e usando solo un singolo file di script. Vedere questo .
daltonfury42,

9

Ok, quindi dovrai fare alcune cose per questo:

  1. Rileva quando le cuffie sono scollegate;
  2. Dopo l'evento in (1), invia un comando "pause" a VLC;
  3. Rileva quando le cuffie sono ricollegate;
  4. Dopo l'evento in (3), invia un comando "play" a VLC;

Per (1) e (3): è possibile utilizzare ciò che viene mostrato qui . Questa risposta contiene una piccola procedura per trovare la differenza tra un jack collegato e unplugged e uno script che è possibile modificare per conformarsi al proprio caso.

Per (2) e (4): utilizzare l'interfaccia Dbus di VLC. Il codice pertinente dovrebbe essere questo:

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

Per mettere in pausa e suonare rispettivamente.

Ora, sulla sceneggiatura. Nel tuo caso, dovrebbe assomigliare a questo:

#!/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

Aggiungi questo script modificato alle tue applicazioni di avvio e sei pronto. Penso che dovrebbe fare quello che volevi.

PS: tieni presente che esistono modi più efficienti per farlo, come l'utilizzo inotifyper rilevare i cambiamenti di eventi (e forse anche altri approcci), ma questo dovrebbe iniziare (e gli altri sono al di sopra del mio livello di esperienza e competenza). Suppongo che tu possa iniziare con questo approccio "hackish", e costruire da qui.


1
Grazie mille, è davvero utile. Premierò i punti nel caso in cui non venga pubblicata una risposta migliore. L'unica cosa che non mi piace è il polling costante, ho creato una domanda separata per questo: askubuntu.com/questions/640741/…
int_ua

1
Seguirò questa domanda! Potrei usare quella conoscenza.
Acrobazie il

3
È possibile aggiungere un sleep 0.25alla fine, che è un quarto di secondo di ritardo. Ciò facilita la CPU e funziona ancora abbastanza velocemente. Lo uso a volte anche nei miei script
Sergiy Kolodyazhnyy,

2
ACPI gestisce la disconnessione delle cuffie, lo aggiungerai alla tua risposta? askubuntu.com/a/642404/20275
int_ua

Eccezionale! Ci lavorerò qualcosa stasera.
Acrobazie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.