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.
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.
Risposte:
Ok, quindi in base a ciò che ho imparato da qui , sto provando un nuovo approccio, usando ACPI.
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
Ora creiamo un trigger di evento (sostituiscilo vim
con 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
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.
grep -z USER /proc/$_pid/environ
che funzioni per tutti gli utenti della macchina (con singola sessione in esecuzione / vlc). Stavo cercando tale opzione.
Ok, quindi dovrai fare alcune cose per questo:
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 inotify
per 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.
sleep 0.25
alla 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