Использование команды acpi_listen в сценарии оболочки

Я на UBuntu 16.04. Я задал вопрос здесь относительно события отключения вилки наушников. То, что я попробовал, не сработало. Я хочу использовать команду acpi_listen для прослушивания события, связанного с наушниками, и отображения сообщения с помощью уведомления-отправки. Как использовать acpi_listen в сценарии оболочки?

2 ответа

Решение

Написание такого скрипта довольно просто - вам нужно acpi_listen в while IFS= read -r line ; do ... done структурировать и позаботиться об обработке событий внутри этой структуры. read встроенная команда оболочки будет ожидать строку текста из acpi_listen и обработка произойдет, когда if оператор видит, что строка содержит соответствующий текст. В качестве альтернативы можно использовать case заявление для лучшей переносимости скрипта.

Вот простой скрипт, который я лично использовал бы. Протестировано на Ubuntu 16.04 LTS

#!/bin/bash
acpi_listen | while IFS= read -r line;
do
    if [ "$line" = "jack/headphone HEADPHONE plug" ]
    then
       notify-send "headphones connected"
       sleep 1.5 && killall notify-osd
    elif [ "$line" = "jack/headphone HEADPHONE unplug" ]
    then
       notify-send "headphones disconnected"
       sleep 1.5 && killall notify-osd
    fi
done

Обратите внимание, что если вы планируете запустить это из задания cron или через /etc/rc.local, вам нужно будет экспортировать ваш DBUS_SESSION_BUS_ADDRESS за notify-send работать.

Я искал что-то похожее, но вместо уведомления я хотел сделать паузу, когда отключен (и музыка играет), и играть, когда подключен (и музыка была приостановлена).

Я знаю, что это не совсем то, о чем просил ОП, но я не могу комментировать здесь (как жаль, что сайты Stack Exchange не накапливают репутацию друг друга).

Во всяком случае, вот модифицированный сценарий @Sergiy's. Я не говорю, что это оптимизировано или что-то еще, но это работает. Я был бы рад, если бы кто-то (Basher Pro?; P) улучшил бы это.:)

Кстати, я пытался использовать его с vlc (или же cvlc , nvlc ), но я не смог найти способ переключать воспроизведение / паузу с терминала, когда vlc работал в фоновом режиме (что я делаю все время).

И обратите внимание, что я использую audacious игрок - если вы используете что-то еще, вам нужно изменить $state переменные и играющие / паузы команды.

ОБНОВЛЕНИЕ Добавлен контроль для vlc (на основе этого ответа, как указал @BenjaminR).

# Play/pause music like in smartphones

# Play when the headphone was plugged in,
# pause when the headphone was unplugged

# As there is no separate option in Audacious
# for playing even if it is already playing
# (or for pausing even if it is already paused),
# only toggles (e.g. play when paused, otherwise pause),
# I was forced to check the state of playback
# from PulseAudio (using `pacmd`).

# Added control for vlc (src: https://stackoverflow.com/a/43156436/3408342)

#!/bin/bash
acpi_listen | while IFS= read -r line; do
    test=$(pacmd list-sink-inputs | grep "application.process.binary\|state" | \sed 's/[="]//g' - | awk '{print $2}')
    if [[ $test ]]; then
        stateAud=$(echo "$test" | grep audacious -B1 | head -1)
        stateVlc=$(echo "$test" | grep vlc -B1 | head -1)

        # Play music when headphone jack has been plugged in AND the stateAud is corked/paused
        if [[ "$line" = "jack/headphone HEADPHONE plug" && $stateAud = "CORKED" ]]; then
            audacious -t
        fi
        if [[ "$line" = "jack/headphone HEADPHONE plug" && $stateVlc = "CORKED" ]]; then
            dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Play
        fi
        if [[ "$line" = "jack/headphone HEADPHONE unplug" && $stateAud = "RUNNING" ]]; then
            audacious -t
        fi
        if [[ "$line" = "jack/headphone HEADPHONE unplug" && $stateVlc = "RUNNING" ]]; then
            dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause
        fi
        echo
    fi
done
Другие вопросы по тегам