Недавно я купил usb-аудиокарту Creative X-Fi HD. Карта воспроизводила звук в моем раче с pulseaudio без каких-либо усилий с моей стороны. Уж не знаю может этот звук далек от аудифилии, задуманной производителем, но в целом я получил то, что хотел: больше басов, чище звук и самое главное – громче звук. На встройке у меня было обычным делом громкость, выкрученная на 100% в фильмах, некоторых музыкальных композициях и ютубе, сейчас та же громкость на 30-40%. Кстати, слышал гипотезу, что у хорошей встройке звук по качеству почти не отличается от дискретной аудиокарты, но за счет усилителя и, соответственно, более высокой громкости, звучание дискретки воспринимается как более качественное. Может оно и так.
Звук есть – уже хорошо, но на карте есть железная крутилка громкости, которая не работала. Небольшое гугление показало, что настраивать его нужно через lirc. Довольно интересная штука эта lirc. Помнится несколько лет назад кто-то хотел удалить его откуда-то, потому что он представлял из себя невероятный говнокод. Готов в это поверить. lirc, значит, перехватывает события наших устройств, а irexec на эти события позволяет навесить какие-нибудь действия, например, увеличить/уменьшить громкость или вообще выключить звук. Я даже нашел полезные статьи, что конкретно надо записать в конфиг lirc и irexec для моей карты. Путем мытарств было установлено, что для моей задачи lirc должен быть собран с драйвером devinput и.. в раче он почему-то собран без него. Одинокие забытые треды на просторах интернета оставляют больше вопросов, чем ответов. Кто виноват я не выяснил, а вот что делать придумал: установить lirc-git из aur, который был собран правильно.
lirc перестал ругаться на devinput и наконец-то запустился. Читатель, возможно, подумал, что проблема решена и ОП смог насладиться радостью настоящей железной крутилки, о которой всегда мечтал, но приятный холодок металического кругляша не хотел ничего делать. Но ведь я прописал в конфиг именно то, что нужно. Статья вот.. Про мою карту.. irexec так и не заработал и я сделал небольшой грязный скрипт, который просто читал события из irw и крутил громкость. Успех.
На следующий день индеец Зоркий Глаз заметил, что lirc почему-то жрет 100% одного ядра процессора. Причем запускается он нормально, ничего не жрет, но только ты начинаешь крутить крутилку, потребление процессора подскакивает до 100% и.. на таком же уровне и остается, даже если к крутилке больше не притрагиваешься. Одинокие забытые треды, традиционные для lirc, конечно же ничего путного не советуют. Что же делать? Так ведь жить нельзя. И тут, назло хейтерам приходит на помощь systemd: в нем можно для любого сервиса задать параметры для ограничения потребления процессора: CPUAccounting=true, CPUQuota=2%. Но и этого мало, можно не меняя системный сервис просто сделать оверрайд некоторых настроек! /etc/systemd/system/lircd.service.d/override.conf Как вам такое, хейтеры? Удобно? Как по мне – очень. И заметьте, это все работает на любом дистрибутиве.
В общем, lircd у меня все так же жрет 100% доступного ему ЦПУ, но доступно ему только 2%, которых хватает, чтобы менять мне громкость крутилкой без тормозов.
Ошибку в конфиге irexec я тоже нашел, оказывается в конфиге для моей карты был лишний параметр remote = devinput с которым ничего не работало.
К чему я это все написал? Куча каких-то ошибок и багов, все сделано как-то сложно, а мы лепим для них костыли и подпорки. Особенно меня удивило ограничение процессорного времени для процесса, который жрет 100% CPU – это настолько нелепо и криво, что даже красиво.