Линукс для музыканта: плагины 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)


  1. SADKO
    12.03.2022 11:17
    +1

    Не плохо, и наверное даже хорошо, когда всё в одном месте, и я без иронии даже. Из замечаний, я разве бы что слово "насыщение" заменил на "сатурацию" или "перегруз" более привычный русскоговорящему музыканту. Ну и раскрытие терминологии не помешало-бы, хотя это тянет на отдельный талмуд...
    Правда в том, что функционал ALSA очень базовый, и хорош возможностью не пыльно дописывать и переписывать плагины под себя, тем кто в теме. И лучшее что может сделать с ней музыкант, это выставить рабочую частоту, и отдать все входы-выходы JACKу, дабы с ресэмплерами и микшером дел не иметь, по аналогии с ASIO.

    Хотя и пульс и труба, потенциально способны обеспечить bit-accuracy для отдельных приложений.


    1. renice Автор
      12.03.2022 12:01

      С терминологией да, получалась неразбериха и путаница. А 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 придется еще буферы тщательно настраивать.


  1. astenix
    12.03.2022 13:31

    Замечательный файл!

    ЗЫ В заголовках точки точно нужны?!


    1. renice Автор
      12.03.2022 13:48

      Ну, файл .asoundrc скрытый. Или вы о заголовках в тексте? если pcm.jack то так и нужно. Там два потока - pcm на выход и ctl на вход. Вот пример с официального сайта https://alsa.opensrc.org/Ladspa_(plugin)


      1. astenix
        12.03.2022 13:54

        Я про заголовки в тексте.

        В пишущей братии (розентальцев) это один из первых постулатов — не завершать заголовки точками. Допускаются только ! ? … и их вариации.

        Тем более, что у вас заголовки явно отформатированы, как и полагается.


        1. renice Автор
          12.03.2022 14:52

          не буду оправдываться, но вы правы. Верстка там автоматическая, скриптами на sed & Perl. Заголовки для fb2 "берутся" из текста, созданного ntroff. Это я в этом году решил часть переводов выложить, да и написал несколько программ. Более менее они, программы, в fb2 верстают, однако написал я их для txt. То есть без заголовков по умолчанию. Буду теперь читать Справочник для редакторов Розенталя, он у меня есть и я даже его просматривал на досуге)