Я написал небольшой «демон» в bash, который переключится на наушники, если они обнаружены, а если нет, переключится на внешний USB-динамик с помощью PulseAudio.
То, что я ищу, - это какой-то способ получать уведомления об изменениях в файле /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
и системные мониторы с графическим интерфейсом читают намного больше, чем/proc
за короткие промежутки времени. Конечно, они, вероятно, делают это гораздо более эффективно, чем скомпилированные исполняемые файлы, но суть в том, что опрос информации является обычной задачей.