КулЛиб - Классная библиотека! Скачать книги бесплатно 

Линукс для музыканта: плагины ALSA [Иван Георгиевич Титаренко] (fb2) читать онлайн


 [Настройки текста]  [Cбросить фильтры]
  [Оглавление]

Титаренко Иван Георгиевич Линукс для музыканта: плагины ALSA (компиляция и перевод сетевых руководств)

Оглавление


1. Продвинутая звуковая архитектура, ALSA

2. Звуковые серверы

3. Утилиты ALSA

4. ALSA и systemd

5. Первичные настройки системы

6. Синтаксис файла .asoundrc

7. Аргументы ALSA

8. Вложение плагинов PCM

9. Аппаратные средства

10. Высококачественный ресемплинг

11. Инициализация

12. Именование устройств PCM

13. Псевдонимы

14. Фиктивные имена

15. Плагины ALSA

16. Определение ведомого устройства

17. Плагин plug

18. Микширование, плагин dmix

19. Плагин dmix и качество звука

20. Особенности настройки dmix

21. Запись звука

22. Микширование входных сигналов

23. Программная регулировка уровня громкости

24. Приложения и softvol

25. Поддержка OSS

26. Поддержка Jack

27. Модуль snd-aloop

28. Виртуальные карты

29. Поддержка Phonon

30. Многоканальный звук

31. Ручная настройка объемного звука

32. Понижающее микширование

33. Повышающее микширование

34. Фильтры LADSPA

35. Разделение каналов

36. Плагины ALSA, список

37. Плагин hw

38. Плагин mmap_emul

39. Плагин shm

40. Плагин null

41. Плагин copy

42. Плагин linear

43. Плагин lfloat

44. Плагин mulaw

45. Плагин alaw

46. Плагин adpcm

47. Плагин route

48. Плагин rate

49. Плагин plug

50. Плагин file

51. Плагин multi

52. Плагин share

53. Плагин hooks

54. Плагин dmix

55. Плагин dshare

56. Плагин dsnoop

57. Плагин ladspa

58. Плагин asym

59. Плагин iec958

60. Плагин softvol

61. Плагин empty

62. Плагин: remap

63. Используемая литература

64. Приложение, музыкальные программы

Продвинутая звуковая архитектура, ALSA

Усовершенствованная звуковая архитектура Linux (ALSA) предоставляет драйверы звуковой карты, управляемые ядром. ALSA заменяет оригинальную субсистему Open Sound System (OSS). Сегодня ALSA — часть ядра Linux, звуковая подсистема по умолчанию, обеспечивающая поддержку самого низкого уровня для звукового оборудования.


** Кроме драйверов звуковых устройств, ALSA предоставляет библиотеку для разработчиков приложений.


Так как ALSA — это набор встроенных модулей ядра Linux, ручная настройка обычно не требуется: udev автоматически обнаружит оборудование и выберет необходимые драйверы во время загрузки.

Иногда, чтобы разрешить пользователям работать с ALSA, приходится добавлять этих пользователей в группу audio, однако последнее не рекомендуется. Добавление пользователей в группу обеспечивает прямой доступ к звуковым устройствам. Это разрещает приложениям резервировать устройства вывода, что может нарушить программное микширование или затруднить быстрое переключение между приложениями в многопользовательских системах.

Звуковые серверы.

Как правило, ALSA или OSS работают со «звуковыми серверами», хотя это не обязательно, иногда даже нежелательно. В OS Linux звуковой сервер чаще всего организует микширование каналов, программную регулировку громкости, передачу звукового потока по сети.

Самые известные звуковые серверы следующие.

JACK Audio Connection Kit — звуковой сервер для профессионального применения, обеспечивает малую задержку звука при передаче по сети, поддержку аудио эффектов, синтез в реальном времени и многое другое.

PipeWire — альтернативная мультимедийная платформа, поддерживает контейнеры.

PulseAudio — наиболее популярная звуковая система общего назначения, также обеспечивает передачу звука по сети.

Утилиты ALSA

Некоторые утилиты пакета alsa-utils. Пакет содержит утилиты alsamixer и amixer. Утилита amixer — это команда оболочки для настройки звука; alsamixer предоставляет интуитивно понятный интерфейс настройки на основе ncurses.

Управление громкостью с помощью утилиты amixer:

$ amixer -c 1 sset Line,0 80%,40% unmute cap
$ amixer -c 1 -- sset Master playback -20dB
$ amixer -c 1 set PCM 2dB+
$ amixer -c 2 cset numid=34 40%

ALSA и systemd

Пакет alsa-utils поставляется с файлами конфигурации модулей systemd alsa-restore.service и alsa-state.service по умолчанию. Сервисы автоматически устанавливаются и активируются во время установки.

Основные команды для восстановления звуковых настроек:

~ alsactl store - сохраняет текущее значение;
~ alsactl restore - восстанавливает сохраненные ранее значения;
~ alsactl nrestore - команда похожа на restore, но уведомляет демон о необходимости повторного сканирования доступных звуковых карт;
~ alsactl init - пытается инициализировать все устройства "по умолчанию", если устройство неизвестно, возвращается код ошибки 99;
~ alsactl daemon - периодически сохраняет настройки звука;
~ alsactl rdaemon - сохраняет настройки звука, но сначала восстанавливает предыдущее состояние;
~ alsactl kill - уведомляет демон о выполнении указанной операции (выход, повторное сканирование, сохранение и выход);
~ alsactl monitor - мониторинг событий, полученных от данного устройства управления, если звуковые карты не указаны, настройки для всех карт будут сохранены, загружены или отслежены.
Варианты установки следующие.

1. Сервис alsa-restore.service читает файл /var/lib/alsa/asound.state при загрузке и записывает обновленные значения при завершении работы, если файл /etc/alsa/state-daemon.conf не существует. Это метод по умолчанию.

2. Сервис alsa-state.service запускает alsactl в режиме демона, чтобы постоянно отслеживать и сохранять изменения громкости, если пользователь создал файл /etc/alsa/state-daemon.conf.

Очевидно, что методы взаимоисключающие.

Первичные настройки системы

По умолчанию ALSA отключает звук на всех каналах. Звук можно включить вручную с помощью утилит amixer или alsamixer.

Посмотреть загруженные модули, их порядок можно с помощью следующей команды:

$ cat /proc/asound/modules
Или увидеть список устройств и модулей:

$ lsmod | grep snd
Получить имена карт:

$ aplay -l
Узнать текущую звуковую карту:

$ cat /proc/asound/cards
Список устройств PCM:

$ cat /proc/asound/pcm
Проверить каталог /dev/snd/ на наличие файлов устройств:

$ ls -l /dev/snd

** Если существуют хотя бы устройства controlC0 и pcmC0D0p (или аналогичные), то звуковые модули были загружены правильно. Разрешается загружать модули вручную.


Команда speaker-test тестирует настройки.

$ speaker-test -t wav -D plug:front -c2
$ speaker-test -t wav -Dplug:surround40 -c4
$ speaker-test -t wav -Dplug:surround51 -c6
$ speaker-test -t wav -Dplug:spdif -c2

** ALSA поддерживает форматы: S8 U8 S16_LE S16_BE U16_LE U16_BE S24_LE S24_BE U24_LE U24_BE S32_LE S32_BE U32_LE U32_BE FLOAT_LE FLOAT_BE FLOAT64_LE FLOAT64_BE IEC958_SUBFRAME_LE IEC958_SUBFRAME_BE MU_LAW A_LAW IMA_ADPCM MPEG GSM S24_3LE S24_3BE U24_3LE U24_3BE S20_3LE S20_3BE U20_3LE U20_3BE S18_3LE S18_3BE U18_3LE


Синтаксис файла .asoundrc

Скрытый файл ~/.asoundrc расположен в домашнем каталоге пользователя и управляет подсистемой ALSA и плагинами. В многопользовательской системе также можно использовать общий для всех пользователей файл /etc/asound.conf

Файлы конфигурации ALSA следуют простому синтаксису с иерархической структурой для параметров (ключей). Присваивания определяют значение данного ключа. Все, что находится после символа «#», будет игнорироваться ALSA.

Разделители применяются для обозначения начала и конца присваивания, но также возможно использование запятых или пробелов. В составных присваиваниях в качестве разделителей используются фигурные скобки. В определениях массивов в качестве разделителей используются скобки.

Типы данных.

ALSA применяет разные типы данных для значений параметров, которые должны быть установлены в соответствующем файле конфигурации пользователя. Некоторые ключи принимают несколько типов данных, большинство — нет.

Режимы работы.

Существуют разные режимы работы для узлов, режим по умолчанию — слияние и создание. Если режим работы — слияние/создание или слияние, выполняется проверка типа. Объединять можно только присваивания одного типа, поэтому строки нельзя объединять с целыми числами.

Префиксы режимов работы:

~ "+" - объединить и создать;
~ "-" - объединить;
~ "?" - не переопределять;
~ "!" - переопределить.
Обратите внимание. Переопределение узла PCM сделает подсистему ALSA неработоспособной, так как каждое определение плагина будет удалено. Поэтому не используйте настройку !pcm.key.

Файлы конфигурации .asoundrc, asound.conf не требуются для правильной работы ALSA. Многие приложения будут работать без них. Однако эти файлы необходимы для тонкой настройки звуковой системы и предоставления функций маршрутизации, преобразования частоты через слой alsa-lib.


** Пакет alsa-lib определяет файл /usr/share/alsa/alsa.conf в качестве основного конфигурационного файла. Этот файл отвечает за включение в систему .asoundrc


Аргументы ALSA

Библиотека ALSA может принимать аргументы для некоторых блоков конфигурации. Это расширение построено поверх основного.

Аргументы определяются с использованием идентификатора (ключа) @args и значений массива, содержащих строковые имена аргументов:

@args [ CARD ]
@args.0 CARD
Тип аргумента указывается с помощью идентификатора (ключа) @args и имени аргумента. Тип и значение по умолчанию указываются в составном блоке:

@args.CARD {
type string
default "abcd"
}
Аргументы обозначаются знаком доллара ($) и именем аргумента:

Простые математические выражения идентифицируются в зависимости от синтаксиса выражения, подобного оболочке unix, со знаком доллара ($) и квадратной скобкой ([):

card "1"
Чтобы использовать блок с аргументами, запишите значения аргументов после ключа, разделив их двоеточием (:).

Например, все имена для интерфейсов PCM дают один и тот же результат:

hw:0,1
hw:CARD=0,DEV=1
hw:{CARD 0 DEV 1}
plug:"hw:0,1"
plug:{SLAVE="hw:{CARD 0 DEV 1}"}
Аргументы можно указывать по порядку или по имени. Обратите внимание, что аргументы, заключенные в фигурные скобки, переопределяются.

Пример.

pcm.demo {
@args [ CARD DEVICE ]
@args.CARD {
type string
default "supersonic"
}
@args.DEVICE {
type integer
default 0
}
type hw
card
device
}

Вложение плагинов PCM

pcm.azalia {type hw; card 0 }
pcm.!default { type plug; slave.pcm "azalia" }
Эквивалентное написание.

pcm.!default { type plug; slave.pcm {type hw; card 0; } }
Допустимо оформить в следующем стиле.

plug pcm.!default.type;
pcm.default.slave.pcm.type hw;
pcm.default.slave.pcm.card 0;

Аппаратные средства

Установка звуковой карты по умолчанию через defaults. Чтобы применить предыдущий пример к defaults.pcm.card и defaults.pcm.device на практике, если у нас есть две звуковые карты с индексами 0 и 1, следует назначить новые настройки для карты с индексом 1.

defaults.pcm.card 1
defaults.ctl.card 1
Если порядок определения звуковой карты меняется при загрузке, допускается указать порядок в файле, оканчивающемся на .conf в директории /etc/modprobe.d (например, /etc/modprobe.d/alsa-base.conf).

Укажите индекс «-2», чтобы подсистема ALSA никогда не обращалась к звуковой карте как к основной.


** Для ALSA созданы программы-эквалайзеры, например, общесистемный эквалайзер alsaequal AUR или mbeq. Последняя программа - типичный многополосный графический эквалайзер. Однако программа mbeq требует подключения плагина LADSPA, который способен сильно нагружать процессор во время воспроизведения. Также потребуется установить пакеты alsa-plugins, ladspa и swh-plugins.


Высококачественный ресемплинг


** Если вам нужен высококачественный ресемплинг, установите пакет alsa-plugins, чтобы включить повышающее/понижающее микширование и другие расширенные функции.


Когда программное микширование включено, подсистема ALSA вынуждена передискретизировать все потоки до одной и той же частоты (по умолчанию 48 кГц). Если качество звука плохое из-за передискретизации, скорее всего вам потребуется установить пакет alsa-plugins.

Для еще более качественной повторной выборки вы можете поменять установку преобразователя на speexrate_medium или speexrate_best.

Например, чтобы изменить преобразователь по умолчанию, поместите следующее в ваш ~/.asoundrc или /etc/asound.conf:

defaults.pcm.rate_converter "speexrate_medium"
Разрешается применять libsamplerate или ресемплеры lavcrate (FFmpeg). Некоторые приложения (например, MPlayer и его клоны) самостоятельно выполняют передискретизацию.

~ 44100 Гц. Частота дискретизации стандартных аудио компакт-дисков Red Book.
~ 88000 Гц. Частота дискретизации высокой четкости SACD. Вряд ли обычная звуковая карта поддерживает настройку.
~ 96000 Гц. Частота дискретизации звуковых карт высокой четкости.
~ 192000 Гц. Частота дискретизации BluRay и профессиональных звуковых карт.

Инициализация

Вставьте следующий текст в файл .asoundrc

pcm.!default {
type hw
card 0
}
ctl.!default {
type hw
card 0
}
Здесь ключевое слово default определено в ALSA API и всегда принимает значение по умолчанию hw:0,0. Установка !default заменяет имя, определенное в ALSA API.

Можно протестировать конфигурацию.

$ aplay -D default test.wav

Именование устройств PCM


** PCM аббревиатура от «Импульсно-кодовая модуляция».


Чтобы звуковая карта правильно распознавалась ALSA, она должна быть объявлена в .asoundrc. Например, ниже определяется виртуальное устройство.

pcm.snd_card {
type hw
card 0
device 0
}
ctl.snd_card {
type hw
card 0
device 0
}
Здесь «snd_card» — это имя устройства. Вы можете выбрать любое имя (буквы A до Z, нижнее подчеркивание и числа); имя будет псевдонимом для звуковой карты.

Как принято в языке C, «card 0» означает, что это первая звуковая карта, обнаруженная ALSA на компьютере. Если в компьютере установлено несколько звуковых карт или добавляются новые USB-устройства, они нумеруются последовательно: вторая карта записывается как 1, третья как 2 и т.д.

Как правило, .asoundrc начинается с «PCM hw type», что дает приложению ALSA возможность запускать виртуальную звуковую карту (плагин или ведомое устройство) с заданным именем. Звуковая карта, устройство должны быть доступны с именами hw:0,0.

$ aplay -D hw:0,0 test.wav
$ ecasound -i test.wav -o alsa,hw:0,0

Псевдонимы

С помощью настройки «type PCM hw» вы можете определить псевдонимы для устройств.

Синтаксис следующий.

pcm.NAME {
type hw # PCM
card INT/STR # Название или номер карты
[device] INT # Номер устройства (по умолчанию 0)
[subdevice] INT # Номер подустройства, первым доступным -1 (по умолчанию -1)
mmap_emulation BOOL # включить эмуляцию mmap для устройств ro/wo
}
Например, определим для первой звуковой карты псевдоним:

pcm.primary {
type hw
card 0
device 0
}
Проверим работу с помощью команды:

$ aplay -D primary test.wav

** Если вы хотите использовать цифровой выход SPDIF вместо стандартного линейного выхода, нужно определить устройства. Для этого необходимо узнать соответствующий номер устройства. Это делается в терминале с помощью команды «aplay -l».


Фиктивные имена.

Необходимо внимательно подходить к выбору имен в плагинах: есть программно зависимые имена виртуальных устройств, например, default и dmix (тип плагина, а также предопределенное виртуальное устройство), jack, linear.

Некоторые приложения пытаются открыть устройство управления CTL с именем, утройств PCM, поэтому иногда требуется создавать фиктивное устройство CTL с необходимым именем:

pcm.myplugdev {
type plug
slave {
pcm default
rate 44100
}
}
ctl.myplugdev {
type hw
card 0
}

Плагины ALSA

В ALSA плагины расширяют функциональность и возможности устройств PCM и CTL. Плагины автоматически выполняют присвоение имен устройствам, преобразование частоты дискретизации, копирование семплов между каналами, запись в файл, объединение звуковых карт для нескольких входов/выходов (без синхронизации сэмплов), использование многоканальных звуковых устройств и т.д.


** Плагины обрабатывают звуковой поток, сложная обработка сильно нагружает процессор и может привести к сбоям в работе звуковой подсистемы.


Плагины создают виртуальные потоки, их можно использовать как обычные аппаратные устройства.

Чтобы увидеть полный список плагинов и опций, посмотрите документацию alsa-lib

https://www.alsa-project.org/wiki/ALSA_Library_API

Определение ведомого устройства

Подключаемый модуль можно указать непосредственно или как дополнительный параметр внутри определения. Также могут быть указаны настройки: количество каналов, формат и т.д.

Пример 1.

pcm_slave.NAME {
pcm STR # имя
pcm { } # определение
format STR # формат или "без изменений"
channels INT # количество каналов или "неизменная" строка
rate INT # частота в Гц или " без изменений" строка
period_time INT # период или "неизменная" строка
buffer_time INT # буфер или "неизмененная" строка
}
Пример 2.

pcm_slave.slave_rate44100Hz {
pcm "hw:0,0"
rate 44100
}
pcm.rate44100Hz {
type plug
slave slave_rate44100Hz
}
Эквивалентная конфигурация.

pcm.rate44100Hz {
type plug
slave {
pcm "hw:0,0"
rate 44100
}
}
Простое ведомое устройство может быть определено следующим образом:

pcm_slave.sltest {
pcm "hw:1,0"
}
Это определяет ведомое устройство без каких-либо параметров, как псевдоним. Укажем некоторые параметры:

pcm_slave.sl2 {
pcm "hw:1,0"
rate 48000
}
pcm.rate_convert {
type rate
slave sl2
}
Теперь вы можете вызвать это вновь созданное виртуальное устройство:

$ aplay -D rate_convert test.wav
Команда выводит звук с частотой дискретизации 44,1 кГц.

В краткой форме настройки можно записать так.

pcm.rate_convert {
type rate
slave {
pcm
rate 48000
}
}

Плагин plug

Более сложным инструментом является плагин plug. Мы можем использовать плагин следующим образом.

pcm_slave.sl3 {
pcm "hw:1,0"
format S16_LE
channels 1
rate 16000
}
pcm.complex_convert {
type plug
slave sl3
}
Проверьте работу с помощью команды:

$ aplay -vD complex_convert test.wav
Настройка определяет формат S16_LE, один канал и частоту дискретизации 16 кГц. Команда aplay с параметром -v (вывод подробной информации) покажет настройки.

$ aplay -v test.wav

Микширование, плагин dmix

Программное микширование — возможность одновременного воспроизведения нескольких звуковых файлов или приложений на одном устройстве. Существует множество способов программного микширования в среде Linux. Обычно для этого требуется серверное приложение, такое как ARTSD, ESD, JACK.

В ALSA есть собственный плагин для микширования, dmix. Интересным и потенциально полезным свойством плагина можно считать возможность его применения как плагина "по умолчанию"". Теоретически это означает, что все приложения, имеющие встроенную поддержку ALSA, будут совместно использовать звуковое устройство.


** ALSA 1.0.9 rc2 и выше не треубет настройки dmix для аналогового выхода. Также dmix включен по умолчанию для звуковых карт, которые не поддерживают аппаратное микширование.


pcm.!default {
type plug
slave.pcm "dmixer"
}
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hw:1,0"
period_time 0
period_size 1024
buffer_size 4096
rate 44100
}
bindings {
0 0
1 1
}
}
ctl.dmixer {
type hw
card 0
}
(Чтобы включить плагин под своим именем, измените !default.)

Проверка работы.

$ aplay -f cd -D default test.wav
Частота дискретизации для устройства по умолчанию задается как 48000 Гц. Если вы хотите поменять ее без правок .asoundrc для программы aplay, укажите новую настройку, например, с помощью аргументов командной строки.

$ aplay -D"plug:'dmix:RATE=44100'" test.wav
Ниже пример команды для плагина dmix, настройка частоты дискретизации 44100 Гц, устройство вывода hw:1,0.

$ aplay -Dplug:\'dmix:SLAVE=\"hw:1,0\",RATE=44100\' test.wav
Имя dmix PCM уже определено в файле глобальной конфигурации /usr/share/alsa/alsa.conf (slave "hw:0,0", rate 48000).


** Обратите внимание, что плагин dmix не основан на архитектуре клиент/сервер, но напрямую пишет в буфер DMA звуковой карты. Количество экземпляров, которые можно запускать одновременно, не ограничено.


Плагин dmix и качество звука

Как было сказано выше, плагин dmix по умолчанию определяет частоту дискретизации 48 кГц. Если ваш источник звука работает на частоте 44,1 кГц, dmix применит передискретизацию до 48 кГц.

Чтобы этого не произошло, вы должны явно указать в настройках требуемые параметры.

pcm.swmixer {
type dmix
ipc_key 1234
slave {
pcm "hw:0,0" # аналоговый выход
#pcm "hw:0,1" # цифровой выход
format S32_LE # если поддерживается
period_size 1024
buffer_size 4096
rate 44100
}
}
Следует иметь в виду, что полноценное программное микширование возможно только в том случае, если все сигналы имеют одинаковую частоту дискретизации. Так, если вы хотите воспроизводить диск DVD 48 кГц на системе с поддержкой 44100 Гц, плагин "пересчитает" поток. К сожалению, это может привести к снижению качества звука.

Задержка dmix зависит от периода и размера буфера. Плагин dmix не разработан с точностью вывода до семпла, поскольку это не требуется в аудиосистеме общего назначения. Если вам нужен семпловый и полностью синхронизированный микшер, следует рассмотреть возможность использования звукового сервера Jack.

Также общая задержка аудиосистемы зависит от размера периода. Насколько малым может быть размер периода, настолько малой задержки вы добьетесь. Низкая задержка требует хорошего планировщика задач в ядре. Если вы получаете xruns, придется настроить ядро и перейти к работе в реальном времени.

Особенности настройки dmix

Иногда необходимо указать размер буфера для "проблемных" звуковых карт.

Попробуйте следующую настройку, где размер буфера меньше 6653.

period_size 1024
buffer_size 4096 # размер буфера < 6653, но pow(x, 2)
Для некоторых карт маленький размер буфера приводит к прерываниям проигрывания звуковых фрагментов при высокой нагрузке. В этом случае можно увеличить буфер.

period_size 2048 # 1024/8192!
buffer_size 32768

Запись звука

Плагин dsnoop — аналог dmix, разработанный для записи звука. Плагин позволяет нескольким приложениям одновременно записывать звуковой поток.

По умолчанию ALSA настраивает интерфейс dsnoop. Проверить интерфейс записи можно следующей командой.

$ arecord -L
Если вывод содержит строку с упоминанием dsnoop (например, "dsnoop cards.pcm.dsnoop"), интерфейс записи доступен.

Подключите источник звука (микрофон, линейный вход) к звуковому устройству, запустите amixer, чтобы выбрать источник ввода, введите команду:

$ arecord -f cd -c 2 -D dsnoop foobar.wav
Ниже показан пример пользовательского интерфейса dsnoop. Как видим, синтаксис похож на синтаксис плагина dmix.

pcm.dsnooped {
type dsnoop
slave {
pcm "hw:0,0"
channels 2
}
}
Вы также можете указать дополнительные параметры записи.

pcm.dsnooped {
type dsnoop
slave {
pcm "hw:0,0"
channels 2
period_size 1024
buffer_size 4096
rate 48000
periods 0
period_time 0
}
}
В этом примере звук записывается с частотой дискретизации 48000 Гц.


** Обратите внимание. Если звуковая карта не поддерживает запрошенную частоту, поток преобразуется на программном уровне.


Иногда возникает необходимость записать только левый или правый канал стереофонического звука.

Например, аудиоустройство Edirol UA-25 имеет два монофонических микрофонных входа. Некоторое программное обеспечение может преобразовывать стереофонический звук в монофонический только смешивая каналы, что ухудшает качество записи.

Плагин dsnoop решает эту проблему.

Определим два виртуальных интерфейса dsnoop для левого и правого канала:

pcm.record_left {
type dsnoop
ipc_key 234884
slave {
pcm "hw:0,0"
channels 2
}
bindings.0 0
}
pcm.record_right {
type dsnoop
ipc_key 2241234
slave {
pcm "hw:0,0"
channels 2
}
bindings.0 1
}
Теперь вы можете записывать левый канал с помощью команды:

$ arecord -f cd -c 1 -D record_left foobar.wav

Микширование входных сигналов

Совместная работа dmix и dsnoop.

Плагин dmix предназначен для смешивания нескольких потоков вывода (воспроизведения), но если вы хотите смешать несколько клиентов ввода (захвата), можно подключить плагин dsnoop:

pcm.mixin {
type dsnoop
ipc_key 5978293 # ключ должен быть уникальным
ipc_key_add_uid yes
slave {
pcm "hw:0,0"
channels 2
period_size 1024
buffer_size 4096
rate 44100
periods 0
period_time 0
}
bindings {
0 0
0 1
}
}

Программная регулировка уровня громкости

Откройте файл .asoundrc в редакторе и создайте новой устройство softvol.

pcm.softvol {
type softvol
slave {
pcm "<device_name>"
}
control {
name "<control_name>"
card 0
}
}
Мы создали новое устройство PCM с именем softvol, которое управляется регулятором громкости <control_name> и передает звуковые данные с измененной громкостью подчиненному устройству <device_name>.

Но прежде чем применить новый файл .asoundrc, проверьте, какие существуют устройства звуковой карты, например, запрашивая устройство "Master".

$ amixer controls | grep "Master"
Если на выходе команды уже указан элемент управления Master, вы не должны называть новый элемент таким же именем.

К сожалению, существующие элементы управления не могут быть перезаписаны, поэтому потребуется придумать другое имя.

К выбору имени следует подходить с осторожностью. Например, если вы хотите, чтобы softvol управлял только громкостью воспроизведения, имя должно записываться как "Playback Volume". Это имя не позволяет микшеру отображать его как элемент управления захватом (CTL).

$ speaker-test -Dsoftvol -c<channel count> -twav
Обратите внимание. Новый регулятор громкости появится в системе не сразу. Введите следующую команду, чтобы ALSA "увидела" регулятор громкости.

$ amixer controls | grep <control name>
Микшеры, включенные до первого использования, необходимо перезапустить, чтобы изменения вступили в силу.

Если вы по-прежнему не видите новый элемент управления, попробуйте перезагрузить компьютер.

Приложения и softvol

Можно заставить все приложения использовать программный регулятор громкости. Для этого переопределите устройство по умолчанию, направьте его на softvol с помощью плагина plug.

pcm.!default {
type plug
slave.pcm "softvol"
}
Здесь softvol управляет как воспроизведением, так и захватом.

Если вы предпочитаете управлять через softvol только воспроизведением, измените настройки, например, с помощью плагина asym.

pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "softvol"
}
capture.pcm {
type plug
slave.pcm "<device name>"
}
}
Если у вас многоканальная звуковая карта, вы можете сначала смикшировать стереосигналы.


** Убедитесь, что все приложения использует устройство с регулятором громкости softvol, неподдерживаемые устройства не будут программно контролироваться. В этом случае акустическая система оглушит вас музыкой на полной громкости или даже выйдет из строя из-за перегрузок. (Если вы подключили к звуковой карте внешний усилитель мощности и маломощную акустику.)


В последних версиях ALSA dmix определен по умолчанию, чтобы воспользоваться функциями softvol и dmix придется дополнить конфигурацию.

pcm.!default {
type plug
slave.pcm "softvol"
}
pcm.softvol {
type softvol
slave {
pcm "dmix" # dmix ("hw:0,0:")
}
control {
name "PCM" #
card 0
}
}

Поддержка OSS

Поддержка OSS обеспечивается плагинами. Совместимость с OSS важна, когда программы запрашивают доступ файлов-устройств /dev/dsp, /dev/snd/seq. Эмуляция OSS может быть необходимой для устаревших приложений. Плагины ALSA дают возможность перехватывать вызовы OSS, перенаправлять их. Для старых приложений может быть создано виртуальное устройство OSS, чтобы подобные программы могли работать через ALSA и плагин «dmix».

pcm.dsp0 {
type plug
slave.pcm "duplex"
}
ctl.dsp0 {
type plug
slave.pcm "snd_card"
}
ctl.mixer0 {
type plug
slave.pcm "snd_card"
}
Распространенной программой, которая поддерживает OSS, считается Audacity. (Сейчас Audacity работает с ALSA.) Какие-то плагины для браузера также взаимодействуют только с интерфейсом OSS.

Поддержка Jack

Чтобы подключить интерфейс Jack Audio Connection Kit, файл .asoundrc необходимо дополнить.

pcm.jackplug {
type plug
slave { pcm "jack" }
}
pcm.jack {
type jack
playback_ports {
0 alsa_pcm:playback_1
1 alsa_pcm:playback_2
}
capture_ports {
0 alsa_pcm:capture_1
1 alsa_pcm:capture_2
}
}
Программы, которые имеют только интерфейс ALSA, но не поддерживают Jack, теперь могут обращаться к устройству «jackplug».


** В конкретном случае аппаратные монофонические каналы 1 и 2 объединены в стереофоническое устройство «jackplug». Необходимая библиотека libasound_module_pcm_jack.so находится в пакете Lucid libasound2-plugins, она должна быть установлена.


Модуль snd-aloop

Вы можете включить виртуальную звуковую карту (модуль snd-aloop), чтобы ALSA общалась с Jack. Преимущество — живучесть соединения, недостаток — повышенное потребление ресурсов. Подробности доступны по ссылке ниже.

https://www.alsa-project.org/wiki/Matrix:Module-aloop
Сначала потребуется создать виртуальную звуковую карту, загрузить модуль ядра:

$ modprobe snd-aloop pcm_substreams=2
Это создает звуковую карту с двумя каналами. Простейший файл .asoundrc выглядит так:

pcm.amix {
type dmix
ipc_key 1234
slave.pcm "hw:Loopback,0,0"
}
pcm.asnoop {
type dsnoop
ipc_key 1235
slave.pcm "hw:Loopback,0,1"
}
pcm.aduplex {
type asym
playback.pcm "amix"
capture.pcm "asnoop"
}
pcm.ploop {
type plug
slave.pcm "hw:Loopback,1,1"
}
pcm.cloop {
type dsnoop
ipc_key 1236
slave.pcm "hw:Loopback,1,0"
}
pcm.!default {
type plug
slave.pcm "aduplex"
}
Затем создаются каналы (обратите внимание на &, запуск фонового процесса):

$ alsa_in -j cloop -dcloop -q1 &
$ alsa_out -j ploop -dploop -q1 &
Теперь каналы можно подключить к Jack. Параметр "q" определяет качество передискретизации (значения 0 до 4): чем выше, тем лучше, но при лучшем качестве требуется значительно больше вычислительных ресурсов.

Виртуальные карты

Если вы хотите создать несколько виртуальных звуковых карт (например, для маршрутизации через Jack), потребуется определить их при загрузке модуля:

$ modprobe snd-aloop index=1,2,3 enable=1,1,1 pcm_substreams=8,2,6 id=xine,mplayer,vdr
Это создаст три виртуальные звуковые карты: первая с именем «xine» с 8 каналами, вторая с именем «mplayer» с двумя каналами и третья с именем vdr с шестью каналами. Цифры индексов, конечно, основаны на ваших предпочтениях. Имена для виртуальных звуковых карт в примере не произвольные, потому что программы имеют тенденцию вызывать xruns при прямом подключении к Jack.

Поддержка Phonon

Чтобы Phonon отображал устройство в списке доступных, в файл .asoundrc необходимо добавить следующее.

pcm.phonon {
type plug
slave.pcm "duplex"
hint {
show on
description "DMix"
}
}

Многоканальный звук

Современные звуковые карты многоканальные. Есть соглашение, какие буквенные наименования следует использовать для описания карт. Например, «xy». «x» каналы без фильтров, «y» канал сабвуфера.

Карта «5.1» имеет в общей сложности 6 каналов: «фронтальный левый», «фронтальный правый», «тыловой левый», «тыловой правый», «центральный» и «бас».

Предопределенные каналы.

ALSA предлагает предопределенные устройства объемного звучания для многих звуковых карт. Вы можете легко проверить, поддерживается ли ваша карта:

$ speaker-test -D surround51 -c 6
Если поддерживается, все шесть каналов (опция "-c 6") адресуются через устройство объемного звучания 5.1 (опция "-D Surround51").

Другие предопределенные устройства имеют аналогичные названия «surround40», «surround71» и т.д. Обратите внимание, что в обычных обозначениях опущена точка.

Ручная настройка объемного звука

Поскольку в объемном звуке используется больше каналов, чем в стерео, вышеприведенные определения необходимо скорректировать. С плагином «dmixer» это делается путем расширения привязки канала. С плагином «dsnooper» это имеет смысл только в том случае, если карта действительно имеет более двух физических каналов для записи и может использовать их одновременно.

bindings {
0 0
1 1
2 2
3 3
4 4
5 5
}
Этот пример для системы 5.1. У некоторых звуковых чипов каналы имеют другую внутреннюю нумерацию, так что вам, возможно, придется переписать настройку.

Определено, что карта имеет 6 каналов и что вход с номером x направляется на выход с номером x. В качестве альтернативы можно также использовать следующее определение:

pcm.dmix51 {
type dmix
ipc_key 1024
slave {
pcm "hw:0,0"
rate 44100
channels 6
period_time 0
period_size 1024
buffer_time 0
buffer_size 4096
}
}
Адрес устройства PCM также может быть "hw:0,1", это зависит от вашего оборудования.

Понижающее микширование

Настройкой .asoundrc вы можете преобразовать сигнал 5.1 в обычное стерео (от 5.1 до 2.0):

pcm.51to20 {
type route
slave.pcm surround51
slave.channels 6
ttable.0.0 1 # левый фронтальный
ttable.1.1 1 # правый фронтальный
ttable.2.0 0.707 # тыловой левый, 3dB
ttable.3.1 0.707 # тыловой правый, 3dB
ttable.4.0 0.5 # центральный, 6dB
ttable.4.1 0.5 # центральный, 6dB
ttable.5.0 0.5 # bass, 6dB
ttable.5.1 0.5 # bass, 6dB
}
Теперь вы можете назначить устройство «51to20», созданное выше, например, для программы XINE в качестве стерео аудиовыхода. Первое число после ttable задает входные каналы (от 0 до 5), второе число обозначает выходной канал (0 и 1 для левого и правого), третье число устанавливает затухание входного сигнала.

Повышающее микширование

По аналогии с понижающим микшированием стереосигнал может быть преобразован в систему 5.1:

pcm.20to51 {
type route
slave.pcm surround51
slave.channels 6
ttable.0.0 1
ttable.1.1 1
ttable.0.2 1
ttable.1.3 1
ttable.0.4 0.5
ttable.1.4 0.5
ttable.0.5 0.5
ttable.1.5 0.5
}
Два канала стереосигнала копируются и распределяются по каналам 5.1. Установите микширование вверх или вниз по умолчанию.

Чтобы установить повышающее или понижающее микширование по умолчанию, настройте плагин дуплекса.

Даунмикс (вниз).

pcm.duplex {
type asym
playback.pcm "51to20"
capture.pcm "dsnooper"
}
Апмикс (вверх).

pcm.duplex {
type asym
playback.pcm "20to51"
capture.pcm "dsnooper"
}

Фильтры LADSPA

Вы можете определить виртуальные устройства как фильтры. Неважно, какой фильтр будет применяться. LADSPA предлагает большой выбор фильтров, которые легко интегрируются в Linux.

pcm.lowpass {
type ladspa
slave.pcm "plughw:0"
path "/usr/lib/ladspa"
plugins [ { label lpf input { controls [ 150 ] } } ]
}
pcm.test {
type plug
slave.pcm "lowpass"
}
Пример определяет фильтр нижних частот; на выход пропускаются только частоты ниже 150 Гц. Это адресуется через устройство "test". Конечно, вы также можете отправить обрезанный сигнал на ранее определенный «dmixer». Тогда slave.pcm для устройства "lowpass" должен указывать на "plug:dmixer".

Вы должны убедиться, что выбранный фильтр LADSPA соответствует требованиям. Многие фильтры работают как монофонические. Если подходящий многоканальный фильтр недоступен, придется вручную установить несколько монофильтров в .asoundrc с соответствующей маршрутизацией.

Еще один пример фильтра.

pcm.ladspa {
type ladspa
slave.pcm "plughw:0,0";
path "/usr/lib/ladspa";
plugins [{
label delay_5s
input {
controls [ 0.8 0.3 ]
}
}]
}
Проверьте работу плагина.

$ aplay -Dplug:ladspa some_sound_file.wav
Чтобы сохранить префикс «plug:», можно определить устройство PCM с именем «pladspa»:

pcm.pladspa {
type plug
slave.pcm "ladspa";
}
$ aplay -Dpladspa some_sound_file.wav
$ mplayer -ao alsa:device=pladspa some_movie.avi
Приложения ALSA, которые можно настроить для использования определенного устройства PCM, должны быть совместимыми.

Вы можете узнать, какие плагины есть в вашей системе, если установите пакет ladspa-sdk (Debian):

~ listplugins - выводит список всех плагинов, найденных в LADSPA_PATH;
~ analyseplugin - предоставляет подробную информацию об элементах управления плагинами;
~ applyplugin — применяет плагин к wav-файлу, чтобы прослушать эффект плагина.
Подробнее о LADSPA см. https://en.wikipedia.org/wiki/LADSPA

Примечание. К сожалению, в некоторых версиях Ubuntu нет поддержки LADSPA в ALSA.

Разделение каналов

С 8-канальной звуковой картой определены 4 независимых стереовыхода.

pcm.snd-card {
type hw
card 0
device 0
}
ctl.snd-card {
type hw
card 0
device 0
}
pcm.dmixer {
type dmix
ipc_key 1024
ipc_perm 0666
slave.pcm "snd-card"
slave {
period_time 0
period_size 1024
buffer_size 4096
rate 96000
channels 8
}
bindings {
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
}
}
pcm.!default {
type plug
slave.pcm "dmixer"
}
pcm.stereo1 {
type plug
slave {
pcm "dmixer"
channels 8
}
ttable.0.0 1
ttable.1.1 1
}
pcm.stereo2 {
type plug
slave {
pcm "dmixer"
channels 8
}
ttable.0.2 1
ttable.1.3 1
}
pcm.stereo3 {
type plug
slave {
pcm "dmixer"
channels 8
}
ttable.0.4 1
ttable.1.5 1
}
pcm.stereo4 {
type plug
slave {
pcm "dmixer"
channels 8
}
ttable.0.6 1
ttable.1.7 1
}
Возможные источники ошибок.

Неверное количество каналов. Если в каналах или привязках указано больше каналов, чем доступно на самом деле, вывод или запись не выполняются. Например, микрофонные входы иногда имеют только один канал.

Если музыка звучит как плохой компакт-диск, попробуйте изменить частоту дискретизации на 44100 Гц. (Однако иногда для звуковых карт требуется частота 48000 Гц.) Например, если вы хотите изменить частоту для устройства «dmixer» (как описано выше) сделайте прямое присвоение pcm.dmixer.slave.rate 44100.


** В редких случаях файл .asoundrc игнорируется звуковой системой. Чаще всего это аппаратная проблема.


Плагины ALSA, список

Плагин hw

Плагин соединяется напрямую с драйвером ядра ALSA, никакие изменения в поток не вносятся. Эмуляция mmap включается опционально, но в этом случае возможны задержки.

Параметр "nonblock" указывает, как открывать устройство. Опция не изменяет блокировку чтение/запись, но влияет на блокировку открытия устройства. Если вы хотите сохранить совместимость со старыми версиями ALSA, отключите эту опцию.

pcm.name {
type hw # PCM
card INT/STR # карта (строка) или номер (целое число)
[device INT] # устройство (по умолчанию 0)
[subdevice INT] # подустройство (по умолчанию -1: первое доступное)
[sync_ptr_ioctl BOOL] # SYNC_PTR ioctl
[nonblock BOOL]
[format STR] # формат
[channels INT] # каналы
[rate INT] # частота дискретизации
[chmap MAP] # карты каналов, MAP
}

** Предупреждение. Простое назначение «type hw» для карты по умолчанию эквивалентно прямому обращению к оборудованию, что делает устройство недоступным для других приложений. Этот метод рекомендуется только в том случае, если он является частью более сложной настройки ~/.asoundrc или если пользователь намеренно хочет напрямую обращаться к звуковой карте.


Плагин mmap_emul

pcm.name {
type mmap_emul
slave PCM
}

Плагин shm

Плагин работает с сервером через разделяемую память. Коммуникация не подразумевает преобразований, но возможно ухудшение производительности.

pcm.name {
type shm
server STR # сервер
pcm STR # PCM
}

Плагин null

Плагин создает поток с нулевыми семплами.

Используются файл-устройство /dev/null (для воспроизведения, файл должен быть доступен для записи) и /dev/full (захват, файл должен быть доступен для чтения).

pcm.name {
type null
[chmap MAP] # карта каналов
}

Плагин copy

Плагин копирует семплы из основного PCM в подчиненный PCM. Формат, настройки каналов должны совпадать для ведущего и ведомого.

pcm.name {
type copy
slave STR # подчиненное устройство
slave { # определение подчиненного устройства
pcm STR # ведомое устройство PCM
pcm { } # определение подчиненного PCM
}
}

Плагин linear

Плагин преобразует линейные семплы из основного линейного PCM в подчиненный PCM. Настройки (каналы, формат) для ведущего и ведомого должны совпадать.

pcm.name {
type linear
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
format STR # формат
}
}

Плагин lfloat

Плагин преобразует линейные семплы в семплы с плавающей запятой. Настройки должны быть одинаковыми для подчиненного и ведущего.

pcm.name {
type lfloat
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
format STR # формат
}
}

Плагин mulaw

Плагин преобразует выборки Mu-Law в линейные. Настройки каналов, форматов должны совпадать для ведущего и ведомого.

pcm.name {
type mulaw
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
format STR # формат
}
}

Плагин alaw

Плагин преобразует выборки A-Law. Количество каналов, формат и скорость должны совпадать для ведущего и ведомого.

pcm.name {
type alaw
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
format STR # формат
}
}

Плагин adpcm

Плагин преобразует выборки Ima-ADPCM в линейные или линейные в выборки Ima-ADPCM. Количество каналов, формат должны совпадать для ведущего и ведомого.

pcm.name {
type adpcm
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
format STR # формат
}
}

Плагин route

Плагин конвертирует каналы с преобразованиями во время конвертации. Формат и частота дискретизации должны совпадать для ведущего и ведомого.

SCHANNEL может быть именем канала (FL, LFE). В этом случае для ведомого устройства будет выбрана соответствующая карта каналов.

pcm.name {
type route
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
[format STR] # формат
[channels INT] # каналы
}
ttable { # таблица переноса (двумерная, соединения каналы*номера)
CCHANNEL {
SCHANNEL REAL # значение маршрута (0.0 - 1.0)
}
}
[chmap MAP] # карты каналов, MAP
}

Плагин rate

Плагин конвертирует частоту дискретизации. Форматы ввода и вывода должны быть линейными.

pcm.name {
type rate
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
rate INT # частота дискретизации
[format STR] # формат
}
converter STR # необязательный параметр
converter [ STR1 STR2 ... ] # необязательный параметр; тип конвертера по умолчанию определяется в defaults.pcm.rate_converter
converter { # необязательный параметр
name STR
xxx yyy # необязательная конфигурация для конкретного преобразователя
}
}

Плагин plug

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

pcm.name {
type plug
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
[format STR] # формат
[channels INT] # каналы
[rate INT] # частота дискретизации
}
route_policy STR # политика маршрутизации
ttable { # таблица переноса (двумерное соединение каналов*номера)
CCHANNEL {
SCHANNEL REAL # значение маршрута (0.0 - 1.0)
}
}
rate_converter STR
rate_converter [ STR1 STR2 ... ] # значение по умолчанию указывается в defaults.pcm.rate_converter
}

Плагин file

Плагин сохраняет поток PCM в файл или направляет поток в приложение, также использует существующий файл в качестве источника входных данных (например, если определен "виртуальный микрофон")

pcm.name {
type file
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
}
file STR # имя выходного файла
or
file INT # дескриптор выходного файла
infile STR # имя входного файла, необязательно
or
infile INT # дескриптор входного файла
[format STR] # формат файла ("raw" или "wav")
[perm INT] # разрешение выходного файла (восьмеричное, по умолчанию 0600)
}
Имя выходного файла может быть определено как поток для команды оболочки, если STR начинается с символа "|" (передача конвейера Unix).

STR может определять формат, где ключи заменены на реальные значения, соответствующие потоку.

Возможны следующие замены:

~ %r заменят 48000;
~ %c, 2 канала;
~ %b, бит на выборку, 16 битов;
~ %f, формат, S16_LE по умолчанию;
~ %% заменяет на %.

Плагин multi

Плагин объединяет несколько потоков в один.

pcm.name {
type multi
slaves { # определение ведомых устройств
ID STR # ведомый PCM
ID {
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
channels INT # каналы
}
}
bindings { # таблица привязок
N {
slave STR # ключ ведомого
channel INT # канал
}
}
[master INT] # определяет ведущий/ведомый
}
Например, чтобы связать два потока двухканального стерео (hw:0,0 и hw:0,1) в один квадрофонический поток, определите следующие настройки:

pcm.quad {
type multi
slaves.a.pcm "hw:0,0"
slaves.a.channels 2
slaves.b.pcm "hw:0,1"
slaves.b.channels 2
bindings.0.slave a
bindings.0.channel 0
bindings.1.slave a
bindings.1.channel 1
bindings.2.slave b
bindings.2.channel 0
bindings.3.slave b
bindings.3.channel 1
}

** Обратите внимание, что квадрофонический выход будет определен как "complex". Следовательно, он недоступен приложениям, которые могут обрабатывать только формат с чередованием. Возможно, потребуется добавить плагин route или plug.


pcm.quad2 {
type route
slave.pcm "quad"
ttable.0.0 1
ttable.1.1 1
ttable.2.2 1
ttable.3.3 1
}

Плагин share

Плагин позволяет делиться несколькими каналами с большим количеством клиентов. Доступ к каждому каналу эксклюзивный (семплы не смешиваются). Если нулевой канал используется с первым клиентом, этот канал нельзя использовать со вторым. Если необходим плагин для микширования, подключите плагин dmix.

Плагин отличается от dshare: плагину общего доступа требуется серверная программа "aserver", в то время как плагину dshare явный сервер не нужен, он работает с общим буфером.

pcm.name {
type share
slave STR
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
[format STR] # формат
[channels INT] # каналы
[rate INT] # частота дискретизации
[period_time INT] # период, slave
[buffer_time INT] # буфер, slave
}
bindings {
N INT # INT для клиентского канала N
}
}

Плагин hooks

Плагин запускает вызов некоторой функции-ловушки в том случае, если происходит определенное событие. Как правило, применяется для изменения управляющих значений заданных состояний PCM.

Пример: определение аргументов хука.

hook_args.NAME {
... # произвольные аргументы
} # хук PCM
pcm_hook_type.NAME {
[lib STR] # файл библиотеки (по умолчанию libasound.so)
[install STR] # функция установки (по умолчанию _snd_pcm_hook_NAME_install)
} # хук PCM
pcm_hook.NAME {
type STR # хук (см. pcm_hook_type)
[args STR] # аргументы для функции STR (см. hook_args)
[args { }] # аргументы установки
} # хук PCM
pcm.NAME {
type hooks
slave STR
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
}
hooks {
ID STR # хук (см. pcm_hook)
ID { } # хук (см. pcm_hook)
}
}
Пример работы плагина.

hooks.0 {
type ctl_elems
hook_args [
{
name "Wave Surround Playback Volume"
preserve true
lock true
optional true
value [ 0 0 ]
}
{
name "EMU10K1 PCM Send Volume"
index { @func private_pcm_subdevice }
lock true
value [ 0 0 0 0 0 0 255 0 0 0 0 255 ]
}
]
}
Здесь элементы управления "Wave Surround Playback Volume" и "EMU10K1 PCM Send Volume" устанавливаются на заданные значения при доступе к PCM. Поскольку элементы управления принимают несколько значений, они записывается в виде массива. Если для сохранения указано значение "true", прежние значения сохраняются и восстанавливаются при закрытии PCM. Блокировка подразумевает, что элемент управления не работает во время открытия потока и не может быть изменен. Когда задано неправильное значение, ошибка не возвращается, но игнорируется, даже если указанный элемент управления не существует.

Плагин dmix

Плагин определяет прямое микширование нескольких потоков. Разрешение для 32-битного микширования только 24-битное. Младший значащий байт заполняется нулями. Дополнительные 8 бит используются для насыщения.

pcm.name {
type dmix
ipc_key INT # уникальный ключ IPC
ipc_key_add_uid BOOL # добавить текущий uid к уникальному ключу IPC
ipc_perm INT # разрешения IPC (восьмеричное, по умолчанию 0600)
hw_ptr_alignment STR # ведомое, указатель hw, STR авто (по умолчанию) или округленным, отсутствовать
tstamp_type STR # метка времени, STR "default", "gettimeofday", "monotonic", "monotonic_raw"
slave STR
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение PCM
format STR # формат
rate INT # частота дискретизации
channels INT
period_time INT
period_size INT
buffer_time INT
buffer_size INT
periods INT # если не указаны period_size или buffer_time
}
bindings { # не зависит от клиента
N INT # сопоставляет ведомый канал с клиентским каналом N
}
slowptr BOOL # медленное, но более точное обновление указателя
}
ipc_key определяет ключ IPC как целое число. Число должно быть уникальным для каждого dmix, так как разделяемая память создается с указанным номером ключа. Когда ipc_key_add_uid определен как "true", uid добавляется к значению ipc_key. Это позволит избежать конфликта пользовательских ключей IPC.

hw_ptr_alignment определяет подчиненное приложение и выравнивание аппаратного указателя. По умолчанию hw_ptr_alignment установлен как "auto".

Ниже приведены возможные конфигурации.

1. no: минимальная задержка с минимальным количеством пропущенных при запуске кадров.

2. roundup: гарантирует, что все кадры будут воспроизведены при запуске.

3. rounddown: гарантирует, что пробуждение произойдет для каждого периода, кадры могут быть записаны из приложения.

4. auto: выбирает наилучший подход в зависимости от используемого периода и размера буфера.


** Обратите внимание, что плагин dmix поддерживает только одну конфигурацию. То есть он поддерживает только фиксированную частоту дискретизации 48000 (по умолчанию), формат S16, 2 канала и period_time 125000. Если необходима иная конфигурация, следует явно задать значения в определении ведомого PCM. Формат, каналы, частота дискретизации могут быть определены дополнительным подключаемым плагином к единственной базовой конфигурации.


Плагин dshare

Плагин меняет каналы. В отличие от подключаемого модуля общего доступа, модуль не нуждается в явной серверной программе, но обращается к общему буферу, подобно dmix и dsnoop. Приведенные ниже параметры практически идентичны для этих плагинов.

pcm.name {
type dshare
ipc_key INT # уникальный ключ IPC
ipc_key_add_uid BOOL # добавить текущий uid к уникальному ключу IPC
ipc_perm INT # разрешения IPC (восьмеричное, по умолчанию 0600)
hw_ptr_alignment STR # ведомое приложение и тип указателя hw, STR принимает несколько значений (см. dmix)
tstamp_type STR
slave STR
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение PCM
format STR # формат
rate INT # частота дискретизации
channels INT
period_time INT
period_size INT
buffer_time INT
buffer_size INT
periods INT # если не указаны buffer_size или buffer_time
}
bindings { # примечание: не зависит от клиента
N INT # сопоставляет ведомый канал с клиентским каналом N
}
slowptr BOOL # медленное, но более точное обновление указателя
}
hw_ptr_alignment определяет подчиненное приложение и выравнивание аппаратного указателя. По умолчанию hw_ptr_alignment определен как "auto".

Ниже приведены возможные конфигурации:

1. ne: минимальная задержка с минимальным количеством кадров, пропущенных при запуске.

2. roundup: гарантируется, что все кадры будут воспроизведены при запуске.

3. rounddown: гарантирует, что пробуждение произойдет для каждого периода, и кадры могут быть записаны из приложения. При запуске некоторые кадры будут отброшены.

4. auto: выбирает наилучший подход в зависимости от используемого периода и размера буфера. См. dmix

Если вы используете плагин dshare, рекомендуется учитывать следующие особенности настройки.

1. Определите свое оборудование как pcm_slave.

2. Определите количество каналов.

pcm_slave.nforce {
pcm "hw:0"
channels 6
rate 44100
buffer_size 4096
period_size 2048
periods 0
period_time 0
}
pcm.ch12 {
type dshare
ipc_key 47110815
slave nforce
bindings.0 0
bindings.1 1
}
pcm.ch34 {
type dshare
ipc_key 47110815
slave nforce
bindings.0 2
bindings.1 3
}
pcm.ch56 {
type dshare
ipc_key 47110815
slave nforce
bindings.0 4
bindings.1 5
}
В дополнение к каждому устройству dshare PCM можно создать подключаемое устройство с разной частотой дискретизации. Это позволит снизить нагрузку на процессор.

Плагин dsnoop

Плагин разбивает захваченный поток на несколько потоков. Использует обратный метод плагина dmix, одновременно считывая общий клиентский буфер захвата. Значения параметров практически идентичны значениям плагина dmix.

pcm.name {
type dsnoop
ipc_key INT # уникальный ключ IPC
ipc_key_add_uid BOOL # добавит текущий uid к уникальному ключу IPC
ipc_perm INT # разрешения IPC (восьмеричное, по умолчанию 0600)
hw_ptr_alignment STR
tstamp_type STR
slave STR
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение PCM
format STR # формат
rate INT # частота дискретизации
channels INT
period_time INT
period_size INT
buffer_time INT
buffer_size INT
periods INT # если buffer_size или buffer_time не указаны
}
bindings { # примечание: не зависит от клиента
N INT # сопоставляет ведомый канал с клиентским каналом N
}
slowptr BOOL # медленное, но более точное обновление указателя
}
hw_ptr_alignment определяет подчиненное приложение и тип выравнивания аппаратного указателя. По умолчанию hw_ptr_alignment настраивается как "auto". См. конфигурации dmix.

Плагин ladspa

Плагин включает LADPSA. Формат ввода и вывода всегда SND_PCM_FORMAT_FLOAT (тип также зависит от архитектуры).

Дублирование политики подразумевает, что для нулевого канала должно быть только одно определение привязки. Это определение автоматически распространяется на все каналы.

Если канал ALSA не существует для данного входного аудиопорта LADSPA, на этот порт LADSPA передаются нулевые выборки. На стороне вывода (ввод следующего плагина ALSA) каналы также проверяются. Если определенный канал ALSA не существует, выходной порт LADSPA подключается к фиктивной области выборки. Экземпляры плагинов LADSPA создаются динамически.

pcm.name {
type ladspa
slave STR
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение PCM
}
[channels INT] # считать входные каналы (ввод в цепочку плагинов LADSPA)
[path STR] # путь (каталог) с плагинами LADSPA
plugins | # определение для направлений
playback_plugins | # определение направления воспроизведения
capture_plugins { # определение направления захвата
N { # конфигурация плагина LADPSA [N]
[id INT] # идентификатор плагина LADSPA (например, 1043)
[label STR] # метка плагина LADSPA (например, "delay_5s")
[filename STR] # полное имя файла библиотеки .so с кодом плагина LADSPA
[policy STR] # политика, может быть "none" или "duplicate"
input | output {
bindings {
C INT or STR # C - канал, INT - индекс порта, STR - имя порта
}
controls { # действует только во входном блоке
I INT or REAL # I - индекс управляющего порта, INT или REAL - управляющее значение
STR INT or REAL # STR - имя порта управления, INT или REAL - значение управления
}
}
}
}
}

Плагин asym

Плагин комбинирует воспроизведение и захват. Ведомые PCM могут быть определены асимметрично для обоих направлений.

pcm.name {
type asym
playback STR # slave
playback { # определение подчиненного устройства воспроизведения
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
}
capture STR # захват ведомого устройства
capture { # определение подчиненного захвата
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
}
}
Здесь asym объединяет полудуплексные плагины, такие как dsnoop и dmix, в одно полнодуплексное устройство.

pcm.duplex {
type asym
playback.pcm "dmix"
capture.pcm "dsnoop"
}
Таким образом, вы можете использовать "дуплексный" PCM для комбинации dmix/dsnoop. Если задано только одно направление, поток будет полудуплексным.

% aplay -D duplex foo.wav
% arecord -D duplex bar.wav
Плагин asym также можно применить для совместной работы со звуковым сервером Jack, например, чтобы заставить сервер работать с многоканальными устройствами с разным количеством входов и выходов без микширования.

Плагин iec958.

Плагин преобразует 32-битные выборки подкадра IEC958 в линейные или линейные в 32-битные выборки подкадра IEC958.

pcm.name {
type iec958
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
}
[status status-bytes] # биты состояния IEC958, по умолчанию Z 0x08, Y 0x04, X 0x02
[preamble.z or preamble.b val]
[preamble.x or preamble.m val]
[preamble.y or preamble.w val]
[hdmi_mode true]
}
Когда hdmi_mode определяется как "true", 8-канальные сжатые данные форматируются как 4 смежных кадра одного потока IEC958 (требования спецификация HDMI HBR).

Плагин softvol

Плагин программной громкости. Формат, частота дискретизация, каналы должны совпадать как для источника, так и для места назначения.

Если поток стереофонический (два канала), предполагается, что каналы определены как моно, либо 2.0, 2.1, 4.0, 4.1, 5.1 или 7.1.

Если элемент управления уже существует и является системным элементом (т.е. не задается пользователем), плагин передает подчиненный элемент без каких-либо изменений.

pcm.name {
type softvol
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
[format STR] # формат
}
control {
name STR # строка идентификатора элемента управления
[card STR] # контрольная карта
[iface STR] # интерфейс элемента
[index INT] # индекс элемента
[device INT] # номер устройства элемента
[subdevice INT] # номер подустройства элемента
[count INT] # каналы управления 1 или 2 (по умолчанию: 2)
}
[min_dB REAL] # минимальное значение дБ (по умолчанию: -51,0)
[max_dB REAL] # максимальное значение дБ (по умолчанию: 0,0)
[resolution INT] # разрешение (по умолчанию: 256), где 2 означает выключатель звука
}

Плагин empty

Плагин перенаправляет поток PCM на другой плагин.

pcm.name {
type empty
slave STR # устройство slave
slave { # определение подчиненного устройства
pcm STR # ведомый PCM
pcm { } # определение подчиненного PCM
[format STR] # формат
[channels INT] # каналы
}
}

Плагин: remap

Плагин может переназначать (переименовывать) идентификаторы (кроме части numid) для дочернего элемента управления. Плагин также может объединить несколько дочерних элементов управления в один или разделить один элемент управления на несколько.

ctl.name {
type remap # преобразование route PCM
child STR # устройство slave
child { # определение подчиненного устройства
type STR
...
}
remap { # строки идентификатора анализируются в стиле amixer
SRC_ID1_STR DST_ID1_STR
SRC_ID2_STR DST_ID2_STR
...
}
map { # объединить два элемента управления стерео в один
CREATE_ID1_STR {
SRC_ID1_STR {
vindex.0 0 # исходный канал 0 в объединенный канал 0
vindex.1 1
}
SRC_ID2_STR {
vindex.2 0
vindex.3 1 # исходный канал 1 в объединенный канал 3
}
} # разделить стерео на моно
CREATE_ID2_STR {
SRC_ID3_STR {
vindex.0 0 # стерео в моно (первый канал)
}
}
CREATE_ID3_STR {
SRC_ID4_STR {
vindex.0 1 # стерео в моно (второй канал)
}
}
}
}
Дочерняя конфигурация (в одном соединении):

ctl.test {
type remap
child "hw:0"
... map/remap configuration ...
}
Дочерний элемент может быть определен как соединение, содержащее полную спецификацию:

ctl.test {
type remap
child {
type hw
card 0
}
... map/remap configuration ...
}

Используемая литература

Я подбирал статьи и материалы из открытых источников на английском и немецком языках.

Очень помогли мне следующие страницы.

https://www.alsa-project.org/alsa-doc/alsa-lib/index.html

(Jaroslav Kysela perex@perex.cz, Abramo Bagnara abramo@alsa-project.org, Takashi Iwai tiwai@suse.de, Frank van de Pol fvdpol@coil.demon.nl)

https://www.alsa-project.org/wiki/Matrix:Module-aloop
https://alsa.opensrc.org/Jack_and_Loopback_device_as_Alsa-to-Jack_bridge
https://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html
https://wiki.archlinux.org/title/Advanced_Linux_Sound_Architecture
https://wiki.archlinux.org/title/JACK_Audio_Connection_Kit
https://wiki.ubuntuusers.de/.asoundrc/
https://projects.vdr-developer.org/projects/plg-softhddevice/wiki/FAQ
https://gist.github.com/Eriner/ed68d07acab1e5cfae47
https://wiki.debian.org/ru/ALSA
https://www.kernel.org/doc/html/v4.11/sound/alsa-configuration.html
https://tldp.org/HOWTO/Alsa-sound-6.html
https://www.ladspa.org/
Увы, все ссылки будет трудно вспомнить.

Так как я делал подборку без какой-либо системной цели, мое представление о работе ALSA менялось со временем. Изменялись и правила написания конфигурационных скриптов, программы: ALSA очень старая система, она поддерживается уже много лет. Поэтому в тексте возможны неточности, не судите меня строго.

Приложение, музыкальные программы

Список известных музыкальных приложений для OS Linux из рассылок и форумных сообщений.

Серверы.

~ Music Player Daemon — аудиоплеер с клиент-серверной архитектурой.
~ Funkwhale — современный, бесплатный музыкальный сервер с открытым исходным кодом, в значительной степени подражает Grooveshark.
~ Sonospy — музыкальный сервер для Sonos.
Программы CLI.

~ cmus — многофункциональный музыкальный проигрыватель на основе ncurses.
~ Cplay — интерфейс ncurses для различных аудиоплееров (ogg123, mpg123, mpg321, splay, madplay, mikmod, xmp и sox).
~ davis — CLI-клиент для mpd, написанный на Rust.
~ Herrie — простой консольный музыкальный проигрыватель со встроенной поддержкой AudioScrobbler.
~ MOC — консольный аудиоплеер ncurses с поддержкой форматов MP3, OGG и WAV.
~ MPFC — аудиоплеер на базе Gstreamer с интерфейсом ncurses.
~ mpg123 — быстрый бесплатный консольный аудиоплеер MP3 для Linux, FreeBSD, Solaris, HP-UX и других систем UNIX (также декодирует файлы MP1 и MP2).
~ vitunes — музыкальный проигрыватель и менеджер списков воспроизведения на основе ncurses с сочетаниями клавиш vim.
~ whistle — аудиоплеер командной строки на основе ncurses.
~ XMMS2 — переработка популярного музыкального проигрывателя.
~ Banshee — клон iTunes, построенный с помощью GTK и Mono.
~ Byte — музыкальный проигрыватель, разработанный для elementary OS.
~ Clementine — клон Amarok 1.4, портированный на Qt5.
~ Cozy — современный проигрыватель аудиокниг для Linux с использованием GTK 3.
~ Exaile — GTK-клон Amarok.
~ GNOME Music — новое приложение для воспроизведения музыки GNOME.
~ Guayadeque — полнофункциональный медиаплеер, использует GStreamer.
~ Lollypop — музыкальный проигрыватель GNOME.
~ Melody — проигрыватель для прослушивания музыкальных файлов, онлайн-радиостанций и компакт-дисков.
~ Muine — музыкальный проигрыватель, написанный на C#.
~ Pantheon Music — быстрый и красивый музыкальный проигрыватель.
~ Parlatype — аудиоплеер для ручной транскрипции речи GNOME.
~ Pragha — легкий музыкальный менеджер GTK, написанный на C.
~ Quod Libet — аудиоплеер, написанный на GTK, Python и GStreamer с поддержкой регулярных выражений в плейлистах.
~ Rhythmbox — GTK-клон iTunes, используемый по умолчанию в GNOME.
~ Sayonara — Маленький, быстрый аудиоплеер для Linux, написанный на C++, фреймворк Qt.
~ Tauon Music Box — современный оптимизированный музыкальный проигрыватель.
~ Amarok — известный проигрыватель на основе Qt.
~ JuK — приложение для музыкального автомата, поддерживающее коллекции аудиофайлов MP3, Ogg Vorbis и FLAC.
~ Yarock — современный музыкальный проигрыватель с множеством функций, не зависящих от какой-либо конкретной среды рабочего стола.
~ Aqualung — продвинутый музыкальный проигрыватель.
~ Audacious — клон Winamp.
~ DeaDBeeF — легкий и быстрый музыкальный проигрыватель с множеством функций и без зависимостей от GNOME или KDE, поддерживает консоль и графический интерфейс GTK, поставляется со многими плагинами, имеет редактор метаданных.
~ Deepin Music — музыкальный проигрыватель с настраиваемым пользовательскиминтерфейсом на основе Deepin-UI.
~ Drumstick MIDI File Player — проигрыватель MIDI-файлов на основе Drumstick.
~ Elisa — музыкальный проигрыватель от сообщества KDE.
~ gmusicbrowser — музыкальный автомат с открытым исходным кодом для больших коллекций файлов MP3/OGG/FLAC.
~ Goggles Music Manager — менеджер музыкальных коллекций и проигрыватель, автоматически распределяет музыку по категориям, поддерживает непрерывное воспроизведение, имеет простое редактирование тегов и поддержку интернет-радио. Использует инструментарий Fox.
~ LXMusic — небольшой музыкальный проигрыватель на основе xmms2.
~ museeks — простой в использовании музыкальный проигрыватель.
~ Musique — неплохой музыкальный проигрыватель.
~ Qmmp — мультимедийный проигрыватель на основе Qt с пользовательским интерфейсом, похожим на Winamp или XMMS.
~ Vvave — музыкальный проигрыватель Tiny Qt.
Интернет-радио.

~ GNOME Internet Radio Locator.
~ Goodvibes — легкий проигрыватель интернет-радио.
~ Radiotray-NG — системный апплет.
~ Shortwave — приложение GTK 3 для поиска и прослушивания интернет-радиостанций.
~ Tuner — маленький проигрыватель радиостанций.
Клиенты потоковой передачи музыки.

~ Google Play Music Desktop Player — красивый кроссплатформенный настольный проигрыватель для Google Play Music.
~ Headset — настольное приложение YouTube.
~ MellowPlayer — бесплатное кроссплатформенное настольное приложение на основе Qt с открытым исходным кодом, которое запускает веб-службы потоковой передачи музыки в своем собственном окне и обеспечивает интеграцию с вашим рабочим столом.
~ Nuclear — современный музыкальный проигрыватель, ориентированный на стриминг из бесплатных источников.
~ Pianobar — консольный интерфейс для онлайн-радио Pandora.
~ Pithos — настольный клиент Python/GTK Pandora Radio.
~ Spotify — собственный сервис потоковой передачи музыки. Поддерживает локальное воспроизведение и потоковую передачу из обширной библиотеки Spotify (требуется бесплатная учетная запись).

Оглавление

  • Оглавление
  • Продвинутая звуковая архитектура, ALSA
  • Звуковые серверы.
  • Утилиты ALSA
  • ALSA и systemd
  • Первичные настройки системы
  • Синтаксис файла .asoundrc
  • Аргументы ALSA
  • Вложение плагинов PCM
  • Аппаратные средства
  • Высококачественный ресемплинг
  • Инициализация
  • Именование устройств PCM
  • Псевдонимы
  • Фиктивные имена.
  • Плагины ALSA
  • Определение ведомого устройства
  • Плагин plug
  • Микширование, плагин dmix
  • Плагин dmix и качество звука
  • Особенности настройки dmix
  • Запись звука
  • Микширование входных сигналов
  • Программная регулировка уровня громкости
  • Приложения и softvol
  • Поддержка OSS
  • Поддержка Jack
  • Модуль snd-aloop
  • Виртуальные карты
  • Поддержка Phonon
  • Многоканальный звук
  • Ручная настройка объемного звука
  • Понижающее микширование
  • Повышающее микширование
  • Фильтры LADSPA
  • Разделение каналов
  • Плагины ALSA, список
  • Плагин 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
  • Используемая литература
  • Приложение, музыкальные программы