Используя acpi_listen управляют в сценарии оболочки

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

1
задан 13 April 2017 в 15:24

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

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

3
ответ дан 3 December 2019 в 06:38

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

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

Так или иначе, здесь изменил сценарий одного @Sergiy. Я не говорю, что это оптимизировано или что бы то ни было, но это работает. Я радовался бы если кто-то (Убийца Pro?; p) улучшил бы его.:)

Btw, я пытался использовать его с 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
2
ответ дан 3 December 2019 в 06:38

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

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