Làm thế nào có thể tạm dừng phát lại VLC khi tai nghe của tôi được cắm? Tôi có thể tắt tiếng loa qua ALSA, nhưng tôi muốn sử dụng trình kích hoạt phích cắm để dừng phát lại, như thường thấy trong điện thoại thông minh.
Làm thế nào có thể tạm dừng phát lại VLC khi tai nghe của tôi được cắm? Tôi có thể tắt tiếng loa qua ALSA, nhưng tôi muốn sử dụng trình kích hoạt phích cắm để dừng phát lại, như thường thấy trong điện thoại thông minh.
Câu trả lời:
Ok, vì vậy dựa trên những gì tôi đã học được từ đây , tôi đang thử một cách tiếp cận mới, sử dụng ACPI.
Tạo một tập lệnh, để tạm dừng và bỏ tạm dừng VLC:
sudo touch /etc/acpi/headphone_jack.sh
sudo chmod +x /etc/acpi/headphone_jack.sh
và đặt như sau vào tập tin này:
_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
Bây giờ, hãy tạo trình kích hoạt sự kiện (thay thế vim
bằng trình soạn thảo văn bản yêu thích của bạn):
sudo vim /etc/acpi/events/headphones
và thêm vào như sau:
event=jack/headphone
action=/etc/acpi/headphone_jack.sh %e
Cuối cùng, khởi động lại daemon ACPI:
sudo service acpid restart
Tôi nghĩ rằng nên chính xác những gì bạn yêu cầu, không có bỏ phiếu liên quan. Hạn chế duy nhất tôi có thể tìm thấy với việc triển khai này là trong trường hợp bạn có nhiều người dùng chạy VLC cùng một lúc. Tôi cho rằng trong trường hợp đó, điều có thể xảy ra là cách tiếp cận này sẽ ngẫu nhiên tạm dừng và tiếp tục một trong số chúng (hoặc đơn giản là nó không hoạt động).
Big Kudos gửi @int_ua và @Sneetsher vì đã cung cấp cho tôi kiến thức quan trọng về xử lý sự kiện ACPI. Đồng thời đưa ngón tay cái lên tới @ user3073656 để giúp đơn giản hóa thủ tục.
grep -z USER /proc/$_pid/environ
để nó sẽ hoạt động cho tất cả người dùng trong máy (với phiên chạy / vlc duy nhất). Tôi đã tìm kiếm lựa chọn như vậy.
Ok, vì vậy bạn sẽ cần phải làm một vài điều cho việc này:
Đối với (1) và (3): Bạn có thể sử dụng những gì được hiển thị ở đây . Câu trả lời này chứa một quy trình nhỏ để tìm sự khác biệt giữa giắc cắm được cắm và rút phích cắm và tập lệnh mà bạn có thể sửa đổi để phù hợp với trường hợp của mình.
Đối với (2) và (4): Bạn nên sử dụng giao diện Dbus của VLC. Mã có liên quan nên là:
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
Để tạm dừng và chơi tương ứng.
Bây giờ, về kịch bản. Trong trường hợp của bạn, nó sẽ trông giống như thế này:
#!/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
Thêm tập lệnh sửa đổi này vào các ứng dụng khởi động của bạn và bạn đã thiết lập. Tôi nghĩ rằng nó nên làm những gì bạn muốn.
Tái bút - Lưu ý rằng có nhiều cách hiệu quả hơn để thực hiện việc này, chẳng hạn như sử dụng inotify
để phát hiện các thay đổi sự kiện (và thậm chí có thể là các phương pháp khác), nhưng cách này sẽ giúp bạn bắt đầu (và những cách khác ở trên mức độ kỹ năng và kinh nghiệm của tôi). Tôi cho rằng bạn có thể bắt đầu với phương pháp "hackish" này và xây dựng từ đây.
sleep 0.25
ở cuối, đó là một phần tư của độ trễ thứ hai. Điều đó giúp giảm bớt CPU và vẫn hoạt động đủ nhanh. Đôi khi tôi cũng sử dụng điều này trong các kịch bản của riêng mình