Jak można wstrzymać odtwarzanie VLC, gdy słuchawki są podłączone? Mogę wyciszyć głośniki za pomocą ALSA, ale chcę użyć spustu wtyczki, aby zatrzymać odtwarzanie, jak to zwykle jest w smartfonach.
Jak można wstrzymać odtwarzanie VLC, gdy słuchawki są podłączone? Mogę wyciszyć głośniki za pomocą ALSA, ale chcę użyć spustu wtyczki, aby zatrzymać odtwarzanie, jak to zwykle jest w smartfonach.
Odpowiedzi:
Ok, więc bazując na tym, czego się tutaj nauczyłem , próbuję nowego podejścia, używając ACPI.
Utwórz skrypt do wstrzymywania i cofania VLC:
sudo touch /etc/acpi/headphone_jack.sh
sudo chmod +x /etc/acpi/headphone_jack.sh
i umieść w tym pliku:
_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
Teraz utwórzmy wyzwalacz zdarzeń (zamień na vim
swój ulubiony edytor tekstu):
sudo vim /etc/acpi/events/headphones
i dodaj następujące:
event=jack/headphone
action=/etc/acpi/headphone_jack.sh %e
Na koniec zrestartuj demona ACPI:
sudo service acpid restart
Myślę, że powinno być dokładnie to, czego potrzebujesz, bez udziału sondowania. Jedyną wadą, jaką mogę znaleźć w tej implementacji, jest to, że wielu użytkowników korzysta z VLC w tym samym czasie. Przypuszczam, że w takim przypadku to podejście może losowo wstrzymać i wznowić jedno z nich (lub może po prostu nie działać).
Wielkie podziękowania dla @int_ua i @Sneetsher za przekazanie mi ważnej wiedzy na temat obsługi zdarzeń ACPI. Również kciuki do @ user3073656 za uproszczenie procedury.
grep -z USER /proc/$_pid/environ
aby działał dla wszystkich użytkowników na maszynie (z pojedynczą uruchomioną sesją / vlc). Szukałem takiej opcji.
Ok, więc musisz zrobić kilka rzeczy:
Dla (1) i (3): Możesz użyć tego, co pokazano tutaj . Ta odpowiedź zawiera małą procedurę, aby znaleźć różnicę między podłączonym i odłączonym gniazdem, oraz skrypt, który można zmodyfikować w celu dopasowania do przypadku.
Dla (2) i (4): Powinieneś użyć interfejsu Dbus VLC. Odpowiedni kod powinien być następujący:
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
Odpowiednio do pauzy i odtwarzania.
Teraz o skrypcie. W twoim przypadku powinno to wyglądać mniej więcej tak:
#!/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
Dodaj ten zmodyfikowany skrypt do aplikacji startowych i gotowe. Myślę, że powinien zrobić to, co chciałeś.
PS - Zauważ, że istnieją bardziej wydajne sposoby, aby to zrobić, takie jak inotify
wykrywanie zmian zdarzeń (a może nawet inne podejścia), ale ten powinien zacząć od ciebie (a inne są powyżej moich umiejętności i doświadczenia). Podejrzewam, że możesz zacząć od tego „hackish” podejścia i budować odtąd.
sleep 0.25
na końcu, co stanowi kwadrans opóźnienia. Ułatwia to procesor i nadal działa wystarczająco szybko. Czasami używam tego również we własnych skryptach