我用bash编写了一个小的“守护程序”,如果检测到耳机,它将切换到耳机,否则,将切换到带有PulseAudio的外部USB扬声器。
我正在寻找的是一种获取文件更改通知的方法/proc/asound/card0/codec#0
,就像inotifywait
在真实文件上一样(将/ proc下的文件视为“伪文件”)。
我发现我的代码有点疯狂,因为它整天都可以运行sleep 1
,awk
每天运行86400次:)
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
我正在寻找的是类似的东西(此示例不起作用):
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
这样,仅当$codec
文件上有实际更改时,才会运行循环内的命令。
/proc
,您可能可以使用udev规则触发脚本,这将是非常理想的。不太理想的是使用udev规则会
top
GUI系统监视器之类的东西比从/proc
短时间间隔读取的东西要多得多。当然,它们作为已编译的可执行文件的执行效率可能更高,但要点是:轮询信息是一项常见的任务。