Архитектура аудио стека

Структура аудиокарты, микшера и аудио стека

Данная глава включает в себя:

Аритектура аудио стека (SA, Sound Architecture)
Аудио устройства
Контролирующее устройство
Микшер
PCM-устройство (Pulse Code Modulation)
Форматы данных PCM
Машина состояний PCM
Программное микширование PCM-данных
Плагины конвертирования данных

Аритектура аудио стека (SA, Sound Architecture)

Для предоставления приложению возможности воспроизводить звук система должна иметь:

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

Основное внимание в данном руководстве уделяется API и примерам его использования. Но прежде следует рассмотреть саму архитектуру.

Аудио устройства

Аудио стек поддерживает более одного аудио устройства, имеющего функции воспроизведения или захвата (записи) звука, в том числе посредством включения/отключения «на лету».

cards.png
Рисунок 1. Аппаратные и логические устройства

Логические устройства могут включать:

Листинг доступных в системе устройств может быть получен следующим образом:

ls /dev/snd

В имени устройства закодирована принадлежность аппаратному устройству (например, C0D1). Индексация начинается с 0.

Контролирующее устройство

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

Микшер

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

Подробнее см. в статье Архитектура микшера.

PCM-устройство (Pulse Code Modulation)

PCM-устройства отвечают за конвертирование цифровых сигналов в аналоговые или наоборот. Каждое устройство способно конвертировать данные лишь в одном направлении: канал воспроизведения (playback) конвертирует сигналы из цифровой формы в аналоговую, а канал захвата (capture) в противоположном направлении. Атрибуты PCM-устройств:

Форматы данных PCM

Аудио стек поддерживает различные форматы аудио данных. Заголовочный файл <asound.h> определяет набор констант, разделенных на два множества (с возможностью взаимной конвертации):

SND_PCM_SFMT_*
Одиночные ворматы данных. Подробнее см. snd_pcm_get_format_name().
SND_PCM_FMT_*
Групповые форматы (объединение одного или нескольких форматов). Удобны для определения возможностей устройства.

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

Сконфигурировать формат можно исходя из его "ширины" и атрибутов с помощью вызова snd_pcm_build_linear_format().

Следующие функции могут быть использованы для проверки параметров конкретного формата:

Машина состояний PCM

Простейшее PCM-устройство представляет из себя буфер данных, который преобразует по одному семплу за раз с помощью ЦАП или АЦП, в зависимости от направления передачи информации (захват или воспроизведение звука). Данная концепция немного усложняется, учитывая, что субканал может находиться в следующих состояниях:

SND_PCM_STATUS_NOTREADY
Начальное состояние устройства в момент инициализации.
SND_PCM_STATUS_READY
Устройство имеет настроенные параметры для работы.
SND_PCM_STATUS_PREPARED
Устройство готово к выполнению операций.
SND_PCM_STATUS_RUNNING
Устройство выполняет операции по передаче аудио данных в/из буфера.
SND_PCM_STATUS_UNDERRUN
Состояние устройства воспроизведения, при котором исчерпаны данные для проигрывания.
SND_PCM_STATUS_OVERRUN
Состояние устройства захвата, при котором закончилось место в заполняемом буфере.
SND_PCM_STATUS_PAUSED
Не поддерживаемое аудио стеком состояние.

states.png
Рисунок 2. Диаграма состояний и переходов PCM-устройства

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

Программное микширование PCM-данных

Для PCM-устройства с единственным субканалом, драйвер может задействовать программный микшер. На уровне системы такое устройство выглядит как новое устройство воспроизведения, имеющее несколько субканалов. Его отличия от реального микшера:

Программный микшер специально подключается к одному аппаратному PCM-устройству. Мапирование один-к-одному позволяет вызовам API идентифицировать устройство программного микшера.

Плагины конвертирования данных

В ряде случаев приложение передает аудио данные в неподдерживаемом оборудованием формате. Приложение, может самостоятельно «на лету» конвертировать данные в нужный формат, либо это может выполнять аудио стек.

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

Для преобразования вызывается минимальное число конвертеров, чтобы минимизировать издержки со стороны CPU. Для этого приложение может использовать соответствующее API плагинов, имена функций в котором имеют префикс "plugin":


Caution: Не следует смешивать вызовы API, относящиеся к плагинам, с остальными.




Предыдущий раздел: Библиотека libasound