Я нахожусь на Ubuntu 16.04. Я задал вопрос здесь относительно разъема наушников, отключают событие. То, что я попробовал, не работало. Я хочу использовать команду acpi_listen, чтобы слушать соединенное событие наушников и отобразиться, использование сообщения уведомляют - отправляют. Как использовать acpi_listen в сценарии оболочки?
Запись сценария как этот довольно проста - необходимо передать по каналу 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
работал.
Я искал что-то подобное, но вместо уведомления, я хотел приостановиться при отключении (и музыка играла), и игра при включении (и музыка была приостановлена).
Я знаю, это не точно, что 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