пятница, 27 июня 2008 г.

Регулирование громкости Creative X-Fi X-MOD USB

Приобрел звуковуху Creative X-Fi X-MOD USB.
Подключил - звук пашет нормально (ядерный модуль snd_usb_audio).
Есть на ней аппаратный регулятор громкости, который на самом деле просто генерирует событие, которое можно отловить в системе, как нажатие на кнопку.

Для прикручивания использовал xbindkeys и amixer.
В домашний каталог необходимо поместить файл .xbindkeysrc (~/.xbindkeysrc), настроить его, и засунуть xbindkeys в автозапуск окружения рабочего стола.
Конфигурационный файл .xbindkeysrc имеет простой синтаксис:

"команда для запуска"
связанная клавиша

Коды клавиш смотрим командой xev, нажимая на них.
У меня получилось:
вращение по часовой стрелке - m:0x10 + c:176
вращение против часовой стрелке - m:0x10 + c:174
нажатие - m:0x10 + c:160
Файл настроек получился таким:

"amixer -c 0 get PCM | grep off > /dev/null; if [ $? = 1 ]; then amixer -q -c 0 set PCM mute; else amixer -q -c 0 set PCM unmute; fi;"
m:0x10 + c:160

"pgrep amixer; if [ $? = 1 ]; then amixer -c 0 set PCM 3dB+; fi;"
m:0x10 + c:176

"pgrep amixer; if [ $? = 1 ]; then amixer -c 0 set PCM 3dB-; fi;"
m:0x10 + c:174

-с 0 -- это параметр передающий номер звуковухи с которой работаем (у меня нуль т.к. она в системе единственная)
Верхняя команда выполняет проверку состояния mute и производит переключение на противоположное значение.
Еще две командные строки - управление громкостью. Они несколько усложнены проверкой наличия amixer в таблице процессов. Это обусловлено там, что быстрый поворот регулятора вызвал бы множественный одновременный запуск amixer, что повлекло бы несколько неадекватную регулировку из-за асинхронности вызовов на чтение и установку значения громкости (ничего страшного, но неприятно).
Можно убедиться в вышесказанном, попробовав использовать просто amixer -c 0 set PCM 3dB+ и amixer -c 0 set PCM 3dB- соответственно.
pgrep отрабатывает значительно быстрее amixer, что позволяет практически отвергать попытки запустить дубли процессов изменения громкости (теоретически, это, конечно, возможно т.к. pgrep операция отнюдь не атомарная, а bash-код тем более).

P.S.
~ $ time amixer -c 0 set PCM 3dB+ > /dev/null
real 0m0.228s
user 0m0.000s
sys 0m0.000s
~ $ time pgrep amixer
real 0m0.007s
user 0m0.000s
sys 0m0.004s

Комментариев нет: