Как можно приостановить воспроизведение VLC, когда мои наушники подключены? Я могу отключить звук через ALSA, но я хочу использовать пусковой курок, чтобы остановить воспроизведение, как это обычно бывает в смартфонах.
Как можно приостановить воспроизведение VLC, когда мои наушники подключены? Я могу отключить звук через ALSA, но я хочу использовать пусковой курок, чтобы остановить воспроизведение, как это обычно бывает в смартфонах.
Ответы:
Итак, основываясь на том, что я узнал здесь , я пробую новый подход с использованием ACPI.
Создайте сценарий для приостановки и приостановки 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
Теперь давайте создадим триггер события (замените его vim
на ваш любимый текстовый редактор):
sudo vim /etc/acpi/events/headphones
и добавьте следующее:
event=jack/headphone
action=/etc/acpi/headphone_jack.sh %e
Наконец, перезапустите демон ACPI:
sudo service acpid restart
Я думаю, что это именно то, что вам нужно, без участия в опросе. Единственный недостаток, который я могу найти в этой реализации, заключается в том, что у вас есть несколько пользователей, использующих VLC одновременно. Я полагаю, что в этом случае может случиться так, что этот подход случайным образом остановит и возобновит один из них (или он может просто не работать).
Большое спасибо @int_ua и @Sneetsher за предоставленную мне важную информацию об обработке событий ACPI. Также спасибо @ user3073656 за упрощение процедуры.
grep -z USER /proc/$_pid/environ
чтобы он работал для всех пользователей на машине (с одним запущенным сеансом / 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
Добавьте этот измененный скрипт в свои автозагрузки, и все готово. Я думаю, что это должно делать то, что вы хотели.
PS - Обратите внимание, что есть более эффективные способы сделать это, например, использовать inotify
для обнаружения изменений событий (и, возможно, даже другие подходы), но этот должен помочь вам начать (а другие выше моего уровня навыков и опыта). Я полагаю, что вы можете начать с этого "хакерского" подхода и продолжить отсюда.
sleep 0.25
в конце, что составляет четверть секунды задержки. Это облегчает работу процессора и все еще работает достаточно быстро. Я тоже иногда использую это в своих сценариях