Tôi đã viết một 'daemon' nhỏ trong bash sẽ chuyển sang tai nghe nếu chúng được phát hiện và nếu không, hãy chuyển sang loa USB bên ngoài với PulseAudio.
Những gì tôi đang tìm kiếm là một số cách để nhận thông báo về các thay đổi trên tệp /proc/asound/card0/codec#0
, giống như inotifywait
trên các tệp thực (coi các tệp trong / Proc là "tệp giả").
Tôi tìm thấy mã của tôi một chút điên rồ, bởi vì nó chạy sleep 1
với awk
cho cả ngày, có nghĩa là 86400 lần một ngày :)
while sleep 1; do
_1=${_2:-}
_2=$(awk '/Pin-ctls/{n++;if(n==4)print}' '/proc/asound/card0/codec#0')
[[ ${_1:-} = $_2 ]] ||
if [[ $_2 =~ OUT ]]; then
use_speakers
else
use_internal
fi
done
Những gì tôi đang tìm kiếm là một cái gì đó như (ví dụ này không hoạt động):
codec=/proc/asound/card0/codec#0
while inotifywait $codec; do
if [[ $(awk '/Pin-ctls/{n++;if(n==4)print}' $codec) =~ OUT ]]; then
use_speakers
else
use_internal
fi
done
Bằng cách này, các lệnh bên trong vòng lặp sẽ chỉ được chạy khi có những thay đổi thực sự trên $codec
tệp.
/proc
, có lẽ bạn có thể kích hoạt tập lệnh của mình bằng quy tắc udev , điều này sẽ khá lý tưởng. Ít lý tưởng hơn là làm thế nào tẻ nhạt có thể đến với các quy tắc udev;)
top
và màn hình hệ thống GUI đọc nhiều hơn thế so với/proc
những khoảng thời gian ngắn. Tất nhiên, họ có thể làm điều đó hiệu quả hơn nhiều khi thực thi được biên dịch, nhưng vấn đề là: bỏ phiếu cho thông tin là một nhiệm vụ phổ biến.