Як можна призупинити відтворення 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
в кінці, що становить чверть секунди. Це полегшує процесор і все ще працює досить швидко. Я інколи використовую це і в своїх власних сценаріях