Как приостановить воспроизведение VLC, когда наушники разъединяются?

Как возможно приостановить воспроизведение VLC, когда мои наушники включаются? Я могу отключить звук динамиков через ALSA, но я хочу использовать триггер разъема для остановки воспроизведения, поскольку это обычно в смартфонах.

12
задан 30 June 2015 в 14:36

2 ответа

Хорошо, таким образом, на основе того, что я изучил отсюда, я пробую новый подход, с помощью ACPI.

  1. Создайте сценарий для приостановки и неприостановки VLC:

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

    и место следование этого файла:

    _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. Теперь давайте создадим триггер события (замена vim с Вашим любимым текстовым редактором):

    sudo vim /etc/acpi/events/headphones
    

    и добавьте следующее:

    event=jack/headphone
    action=/etc/acpi/headphone_jack.sh %e
    
  3. Наконец, перезапустите демона ACPI:

    sudo service acpid restart
    

Я думаю должен быть точно, чего Вы требуете без включенного опроса. Единственный недостаток, который я могу найти с этой реализацией, состоит в том в случае, если у Вас есть многочисленные пользователи, выполняющие VLC одновременно. Я предполагаю в этом случае, что может произойти, то, что этот подход случайным образом приостановит и возобновит один из них (или он не мог бы просто работать).

Большая Благодарность @int_ua и @Sneetsher для того, чтобы предоставить мне важное знание относительно обработки событий ACPI. Также ползунки до @user3073656 для помощи упрощают процедуру.

5
ответ дан 23 November 2019 в 03:39

Хорошо, таким образом, необходимо будет сделать несколько вещей для этого:

  1. Обнаруживают, когда наушники отключаются;
  2. После события в (1), отправьте команду "паузы" в VLC;
  3. Обнаруживают, когда наушники являются pluggd, въезжают задним ходом;
  4. После события в (3), отправьте команду "игры" в VLC;

Для (1) и (3): можно использовать то, что показывают здесь . Этот ответ содержит маленькую процедуру для нахождения различия между включенным и отключенным разъемом и сценарием, который можно изменить для приспосабливания случаю.

Для (2) и (4): необходимо использовать интерфейс Dbus VLC. Соответствующие нормы должны быть этим:

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

Для паузы и игры соответственно.

Теперь, о сценарии. В Вашем случае это должно выглядеть примерно так:

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

Добавляют этот измененный сценарий к Вашим приложениям запуска, и Вы установлены. Я думаю, что это должно сделать то, что Вы хотели.

пз - Примечание, что существуют более эффективные способы сделать это, такое как использование inotify для обнаружения изменений события (и возможно даже другие подходы), но этот должен получить Вас, запустилось (и другие выше моего уровня квалификации и опыта). Я предполагаю, что можно запустить с этого подхода "hackish" и расти отсюда.

9
ответ дан 23 November 2019 в 03:39

Другие вопросы по тегам:

Похожие вопросы: