¿Cómo pausar la reproducción VLC cuando los auriculares están desconectados?

12

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

HerHde
fuente
1
Aviso: la segunda respuesta es mucho más eficiente al momento de escribir: askubuntu.com/a/642898/20275
int_ua

Respuestas:

5

Ok, entonces, en base a lo que he aprendido de aquí , estoy probando un nuevo enfoque, usando ACPI.

  1. 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
    
  2. Ahora creemos un activador de evento (reemplace vimcon 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
    
  3. 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.

Acrobacias
fuente
1
Para ejecutar cualquier comando que necesite DBUS, debe exportar la variable de entorno de la sesión dbus en ejecución. Vea el comentario de Germar sobre la respuesta de Sneetsher.
daltonfury42
1
Bien descrito. Aquí está la forma más limpia que se me ocurre para hacer eso. No hay necesidad de scripts de inicio automático y demás.
Acrobacias
@ Stunts, ese es el mejor enfoque que he visto para obtener ENV objetivo. Es posible obtener el mismo usuario grep -z USER /proc/$_pid/environpara que funcione para todos los usuarios de la máquina (con una sola sesión / vlc en ejecución). Estaba buscando esa opción.
user.dz 01 de
@Sneetsher: ¡Dulce! Se ve mucho mejor ahora. Anoche se me pasó por la cabeza, pero anoche estaba demasiado cansada para pensarlo con claridad. Gracias por empujar en esa dirección.
Trucos del
1
Aún podría mejorar la respuesta usando% e, y usando solo un archivo de script. Mira esto .
daltonfury42 01 de
9

Ok, entonces necesitarás hacer algunas cosas para esto:

  1. Detecta cuando los auriculares están desconectados;
  2. Después del evento en (1), envíe un comando de "pausa" a VLC;
  3. Detecta cuando los auriculares se vuelven a enchufar;
  4. Después del evento en (3), envíe un comando "reproducir" a VLC;

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 inotifypara 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í.

Acrobacias
fuente
1
Muchas gracias, eso es realmente útil. Recompensaré los puntos en caso de que no se publique una mejor respuesta. Lo único que no me gusta es el sondeo constante, he creado una pregunta separada para eso: askubuntu.com/questions/640741/…
int_ua
1
¡Seguiré esa pregunta! Podría usar ese conocimiento.
Acrobacias
3
Puede agregar un sleep 0.25al 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
Sergiy Kolodyazhnyy
2
ACPI maneja los auriculares desconectados, ¿agregará esto a su respuesta? askubuntu.com/a/642404/20275
int_ua
¡Increíble! Trabajaré algo con eso esta noche.
Acrobacias