Линукс для музыканта: плагины ALSA
Здравствуй, Хабр!
Перевод-справка: плагины ALSA, краткое описание API следующих плагинов: hw, mmap_emul, shm, null, copy, linear, lfloat, mulaw, alaw, adpcm, route, rate, plug, file, multi, share, hooks, dmix, dshare, dsnoop, ladspa, asym, iec958, softvol, empty, remap.
Музыканты, поклонники «лампового звука», живущие около волшебного леса Linux, рано или поздно замечают среди деревьев темную тень — зверя с дурной славой и громким именем ALSA. И правда, ALSA — загадочный зверь, не любящий света. (Кажется, первая встреча с ALSA всегда неприятна и обычно случается в момент, когда из акустических колонок пропадает звук во время просмотра любимого кинофильма.)
На самом деле надежность подсистемы ALSA не вызывает сомнений: почти все проблемы звука в Линукс связаны или с неправильно настроенными плагинами ALSA, или с PulseAudio, а также демонами автосохранения настроек (это те самые таинственные программы, которые вызываются из командной строки
Однако, если документация программы PulseAudio легко находится, то найти обширное описание плагинов ALSA задача не очень-то простая. Даже на сайте ALSA
вы найдете всего лишь немногие ссылки на страницы помощи и прочитаете призыв «написать недостающие комментарии».
Плагины ALSA - «самостоятельные», но необычные программы, как правило, «встраиваемые» в звуковой поток с помощью настроек файла .asoundrc.
Зачем они нужны? Допустим, чтобы чтобы превратить ALSA в систему с «низкой задержкой», включить включить виртуальную звуковую карту (модуль snd-aloop), чтобы ALSA общалась с Jack.
«Общение» с Jack в данном случае происходит через две программы:
$ alsa_in -j cloop -dcloop -q1 & (на выход)
$ alsa_out -j ploop -dploop -q1 & (на вход)
Или придется настроить .asoundrc
pcm.jack {
type jack
playback_ports {
0 alsa_pcm:playback_1
1 alsa_pcm:playback_2
}
}
Настройка через плагины, между прочим, меньше нагружает процессор.
Плагины почти всегда требует «тонкой» настройки, например, явного указания битрейта. Ошибка в описании приведет к неработающей звуковой подсистемы или к не всегда очевидным проблемам PCM. (Например, когда микшируемый поток из-за неявного указания в .asoundrc записывается как S16, а воспроизводится как S32_LE — попробуй-ка «на слух» найти ошибочную запись в .asoundrc!)
Плагины легко позволяют сделать «качественную» выборку ALSA, например, поменять установку внутреннего конвертера на speexrate_medium или speexrate_best.
Всегот лишь добавьте в .asoundrc следующие строки: defaults.pcm.rate_converter "speexrate_medium"
Эти значения определены в ALSA так:
- speexrate_best, use quality 10 (equivalent to SRC_SINC_BEST_QUALITY)
- speexrate_medium, use quality 5 (equivalent to SRC_SINC_MEDIUM_QUALITY)
- speexrate, use quality 3 (equivalent to SRC_SINC_FASTEST)
И да, разрешается применять libsamplerate или ресемплеры lavcrate (Ffmpeg).
«Грамотная» настройка плагинов творит чудеса: позволяет снизить нагрузку на процессор, отказаться от избыточного функционала PulseAudio (если вы используете этот сервер), избежать неприятного треска и «заморозки» звука.
Строго говоря, плагины могут превратить ALSA в «звуковой сервер»: смикшировать потоки, включить софтовую регулировку громкости, эквализацию прямо в звуковую подсистему.
Звуковая подсистема Linux многолика. Здесь есть место традиционным фильтрам для музыкантов LADSPA и для модернового плагина asum.
Почему бы не слушать записи Леонарда Бернстайна с огромным динамическим диапазоном со включенным компрессором?
pcm.ladspa {
type ladspa
slave.pcm "plughw:0,0";
path "/usr/lib/ladspa";
plugins [{
label se4
input {
# RMS/peak attac time (ms) release time (ms) thresh
old (dB) ratio knee radius attenuation
controls [0.7 30 550 -25
6.5 6 0]
}
}]
}
Я переводил текст «для себя», потому что хотелось разобраться, как же грамотно настроить ALSA на домашнем компьютере (не очень-то крутом, со слабеньким процессором на четырех ядрах и 4 Gb памяти). В процессе перевода текста я выбрал «минималистскую стратегию»: старался максимально сжимать информацию, не перегружать текст избыточной информацией.
Конечно, плагины описывают как часть API звуковой подсистемы, это прежде всего информация для разработчиков, поэтому как-то незаметно я начал переводить комментарии к плагинам немецких музыкантов, японских программистов и даже форумные сообщения известного англоязычного ресурса LinuxMusicians
Надеюсь, мой перевод заинтересует энтузиастов «сложной» настройки звука в Линукс.
Скачать или прочитать можно здесь.
Комментарии (6)
astenix
12.03.2022 13:31Замечательный файл!
ЗЫ В заголовках точки точно нужны?!
renice Автор
12.03.2022 13:48Ну, файл .asoundrc скрытый. Или вы о заголовках в тексте? если pcm.jack то так и нужно. Там два потока - pcm на выход и ctl на вход. Вот пример с официального сайта https://alsa.opensrc.org/Ladspa_(plugin)
astenix
12.03.2022 13:54Я про заголовки в тексте.
В пишущей братии (розентальцев) это один из первых постулатов — не завершать заголовки точками. Допускаются только
! ? …
и их вариации.Тем более, что у вас заголовки явно отформатированы, как и полагается.
renice Автор
12.03.2022 14:52не буду оправдываться, но вы правы. Верстка там автоматическая, скриптами на sed & Perl. Заголовки для fb2 "берутся" из текста, созданного ntroff. Это я в этом году решил часть переводов выложить, да и написал несколько программ. Более менее они, программы, в fb2 верстают, однако написал я их для txt. То есть без заголовков по умолчанию. Буду теперь читать Справочник для редакторов Розенталя, он у меня есть и я даже его просматривал на досуге)
SADKO
Не плохо, и наверное даже хорошо, когда всё в одном месте, и я без иронии даже. Из замечаний, я разве бы что слово "насыщение" заменил на "сатурацию" или "перегруз" более привычный русскоговорящему музыканту. Ну и раскрытие терминологии не помешало-бы, хотя это тянет на отдельный талмуд...
Правда в том, что функционал ALSA очень базовый, и хорош возможностью не пыльно дописывать и переписывать плагины под себя, тем кто в теме. И лучшее что может сделать с ней музыкант, это выставить рабочую частоту, и отдать все входы-выходы JACKу, дабы с ресэмплерами и микшером дел не иметь, по аналогии с ASIO.
Хотя и пульс и труба, потенциально способны обеспечить bit-accuracy для отдельных приложений.
renice Автор
С терминологией да, получалась неразбериха и путаница. А c Jack почти всегда возникают неожиданные сложности. Во-первых, конечно, лучше «соединять» все через zita-njbridge - вроде бы надежнее получается работа. Во-вторых, если «понижать» встроенную передискретизацию Jack (параметр q), то и правда надо настраивать в Alsa. Причем делать это до dmix, который в Alsa по умолчанию сейчас 48000 и только. Или вообще отказываться от софтового миксера, регулятора громкости, но тогда неудобно смотреть фильмы и слушать музыку (у меня нет PulseAudio, только Jack и настроенная плагинами Alsa) — потому что в том же Jack есть только один более-менее интересный, качественный плагин регулятора громкости. Тоже не совсем понятно, как настраивать Alsa по умолчанию. S32 (с плавающей) или S24? 96000? Последняя настройка будет нагружать процессор, я пробовал. Alsa оптимизировали именно под «приемлемые» условия, то есть «обязательный» сегодня dmix поддерживает только одну первичную конфигурацию: фиксированную частоту дискретизации 48000, формат S16, 2 канала и period_time 125000. А для low latency придется еще буферы тщательно настраивать.