¿Cómo es posible pausar la reproducción de VLC cuando mis auriculares están desconectados? Puedo silenciar los altavoces a través de ALSA, pero quiero usar el disparador para detener la reproducción, como es habitual en los teléfonos inteligentes.
¿Cómo es posible pausar la reproducción de VLC cuando mis auriculares están desconectados? Puedo silenciar los altavoces a través de ALSA, pero quiero usar el disparador para detener la reproducción, como es habitual en los teléfonos inteligentes.
Respuestas:
Ok, entonces, en base a lo que he aprendido de aquí , estoy probando un nuevo enfoque, usando ACPI.
Cree una secuencia de comandos, para pausar y descomprimir VLC:
sudo touch /etc/acpi/headphone_jack.sh
sudo chmod +x /etc/acpi/headphone_jack.sh
y coloque lo siguiente en este archivo:
_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
Ahora creemos un activador de evento (reemplace vim
con su editor de texto favorito):
sudo vim /etc/acpi/events/headphones
y agregue lo siguiente:
event=jack/headphone
action=/etc/acpi/headphone_jack.sh %e
Finalmente, reinicie el demonio ACPI:
sudo service acpid restart
Creo que debería ser exactamente lo que necesita, sin necesidad de encuestas. El único inconveniente que puedo encontrar con esta implementación es en caso de que haya varios usuarios ejecutando VLC al mismo tiempo. Supongo que en ese caso, lo que puede suceder es que este enfoque pause aleatoriamente y reanude uno de ellos (o simplemente podría no funcionar).
Felicitaciones a @int_ua y @Sneetsher por proporcionarme conocimientos importantes sobre el manejo de eventos ACPI. También agradece a @ user3073656 por ayudar a simplificar el procedimiento.
grep -z USER /proc/$_pid/environ
para que funcione para todos los usuarios de la máquina (con una sola sesión / vlc en ejecución). Estaba buscando esa opción.
Ok, entonces necesitarás hacer algunas cosas para esto:
Para (1) y (3): puede usar lo que se muestra aquí . Esta respuesta contiene un pequeño procedimiento para encontrar la diferencia entre un conector enchufado y desconectado, y un script que puede modificar para adaptarlo a su caso.
Para (2) y (4): debe usar la interfaz Dbus de VLC. El código relevante debería ser este:
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
Para pausa y reproducción respectivamente.
Ahora, sobre el guión. En su caso, debería verse más o menos así:
#!/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
Agregue este script modificado a sus aplicaciones de inicio y estará listo. Creo que debería hacer lo que quisieras.
PD: tenga en cuenta que hay formas más eficientes de hacer esto, como usar inotify
para detectar cambios de eventos (y tal vez incluso otros enfoques), pero este debería ayudarlo a comenzar (y los otros están por encima de mi nivel de experiencia y experiencia). Supongo que puede comenzar con este enfoque "hackish" y construir desde aquí.
sleep 0.25
al final, que es un cuarto de segundo de retraso. Eso facilita la CPU y todavía funciona lo suficientemente rápido. A veces también uso esto en mis propios guiones