Bagaimana mungkin untuk menghentikan sementara pemutaran VLC ketika headphone saya dicolokkan? Saya dapat membisukan speaker melalui ALSA, tetapi saya ingin menggunakan pemicu colokan untuk menghentikan pemutaran, seperti biasa di smartphone.
Bagaimana mungkin untuk menghentikan sementara pemutaran VLC ketika headphone saya dicolokkan? Saya dapat membisukan speaker melalui ALSA, tetapi saya ingin menggunakan pemicu colokan untuk menghentikan pemutaran, seperti biasa di smartphone.
Jawaban:
Ok, jadi berdasarkan apa yang saya pelajari dari sini , saya mencoba pendekatan baru, menggunakan ACPI.
Buat skrip, untuk menjeda dan menghapus VLC:
sudo touch /etc/acpi/headphone_jack.sh
sudo chmod +x /etc/acpi/headphone_jack.sh
dan letakkan yang berikut di file ini:
_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
Sekarang mari kita buat pemicu acara (ganti vim
dengan editor teks favorit Anda):
sudo vim /etc/acpi/events/headphones
dan tambahkan yang berikut ini:
event=jack/headphone
action=/etc/acpi/headphone_jack.sh %e
Terakhir, restart daemon ACPI:
sudo service acpid restart
Saya pikir seharusnya persis apa yang Anda butuhkan, tanpa melibatkan pemungutan suara. Satu-satunya kelemahan yang dapat saya temukan dengan implementasi ini adalah jika Anda memiliki banyak pengguna yang menjalankan VLC pada saat yang sama. Saya kira dalam kasus itu, apa yang bisa terjadi adalah bahwa pendekatan ini akan secara acak berhenti dan melanjutkan salah satunya (atau mungkin tidak berhasil).
Big Kudos to @int_ua dan @Sneetsher untuk memberi saya pengetahuan penting tentang penanganan acara ACPI. Juga jempol ke @ user3073656 untuk membantu menyederhanakan prosedur.
grep -z USER /proc/$_pid/environ
sehingga akan bekerja untuk semua pengguna di mesin (dengan sesi berjalan tunggal / vlc). Saya mencari opsi seperti itu.
Oke, jadi Anda perlu melakukan beberapa hal untuk ini:
Untuk (1) dan (3): Anda dapat menggunakan apa yang ditunjukkan di sini . Jawaban ini berisi prosedur kecil untuk menemukan perbedaan antara colokan yang dicolokkan dan yang dicabut, dan skrip yang dapat Anda modifikasi agar sesuai dengan kasus Anda.
Untuk (2) dan (4): Anda harus menggunakan antarmuka Dbus VLC. Kode yang relevan harus ini:
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
Untuk jeda dan mainkan masing-masing.
Sekarang, tentang skripnya. Dalam kasus Anda, seharusnya terlihat seperti ini:
#!/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
Tambahkan skrip yang dimodifikasi ini ke aplikasi startup Anda, dan Anda siap. Saya pikir itu harus melakukan apa yang Anda inginkan.
PS - Perhatikan bahwa ada cara yang lebih efisien untuk melakukan ini, seperti menggunakan inotify
untuk mendeteksi perubahan acara (dan mungkin bahkan pendekatan lain), tetapi yang ini harus Anda mulai (dan yang lain di atas tingkat keterampilan dan pengalaman saya). Saya kira Anda bisa mulai dengan pendekatan "retas" ini, dan membangun dari sini.
sleep 0.25
di akhir, yang merupakan seperempat dari penundaan kedua. Itu memudahkan CPU dan masih bekerja cukup cepat. Saya kadang-kadang menggunakan ini dalam skrip saya sendiri