Como pausar a reprodução do VLC quando os fones de ouvido estão desconectados?

12

Como é possível pausar a reprodução do VLC quando meus fones de ouvido estão conectados? Eu posso silenciar os alto-falantes via ALSA, mas eu quero usar o gatilho plug para parar a reprodução, como é habitual em smartphones.

    
por HerHde 08.09.2014 / 06:36

2 respostas

5

Ok, então com base no que aprendi de aqui , estou tentando uma nova abordagem, usando ACPI.

  1. Crie um script para pausar e liberar o VLC:

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

    e coloque o seguinte neste arquivo:

    _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 [ "" = 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. Agora vamos criar um acionador de evento (substitua vim pelo seu editor de texto favorito):

    sudo vim /etc/acpi/events/headphones
    

    e adicione o seguinte:

    event=jack/headphone
    action=/etc/acpi/headphone_jack.sh %e
    
  3. Finalmente, reinicie o daemon da ACPI:

    sudo service acpid restart
    

Acho que deve ser exatamente o que você precisa, sem pesquisa envolvida. A única desvantagem que posso encontrar com essa implementação é no caso de você ter vários usuários executando o VLC ao mesmo tempo. Suponho que, nesse caso, o que pode acontecer é que essa abordagem pause aleatoriamente e retome uma delas (ou simplesmente não funcionará).

Grandes parabéns para @int_ua e @Sneetsher por me fornecerem conhecimentos importantes sobre o tratamento de eventos da ACPI. Também gostei do @ user3073656 por ajudar a simplificar o procedimento.

    
por Stunts 30.06.2015 / 23:06
9

Ok, então você precisará fazer algumas coisas para isso:

  1. Detectar quando os fones de ouvido estão desconectados;
  2. Após o evento em (1), envie um comando "pause" para o VLC;
  3. Detectar quando os fones de ouvido estão de volta no plugue;
  4. Após o evento em (3), envie um comando "play" para o VLC;

Para (1) e (3): Você pode usar o que é mostrado aqui . Esta resposta contém um pequeno procedimento para encontrar a diferença entre um conector conectado e desconectado e um script que você pode modificar para se adequar ao seu caso.

Para (2) e (4): Você deve usar a interface Dbus do VLC. O código relevante deve 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 pausar e reproduzir, respectivamente.

Agora, sobre o roteiro. No seu caso, deve ser algo como isto:

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

Adicione este script modificado aos seus aplicativos de inicialização e você está pronto. Eu acho que deveria fazer o que você queria.

PS - Observe que existem maneiras mais eficientes de fazer isso, como usar inotify para detectar alterações de eventos (e talvez até outras abordagens), mas essa deve ser um começo (e as outras estão acima do meu nível de habilidade) e experiência). Eu suponho que você pode começar com essa abordagem "hackish" e construir a partir daqui.

    
por Stunts 24.06.2015 / 18:16