Структура аудиокарты, микшера и аудио стека
Данная глава включает в себя:
Для предоставления приложению возможности воспроизводить звук система должна иметь:
В совокупности эти компоненты представляют архитектуру аудио стека (SA), которая во многом соответствует дизайну ALSA версии 0.5.2, включая достоинства и недостатки. Но, поскольку оба стека длительное время развивались независимо, прямая совместимость между ними утрачена (в том числе по интерфейсам).
Основное внимание в данном руководстве уделяется API и примерам его использования. Но прежде следует рассмотреть саму архитектуру.
Аудио стек поддерживает более одного аудио устройства, имеющего функции воспроизведения или захвата (записи) звука, в том числе посредством включения/отключения «на лету».
Логические устройства могут включать:
Листинг доступных в системе устройств может быть получен следующим образом:
ls /dev/snd
В имени устройства закодирована принадлежность аппаратному устройству (например, C0D1
). Индексация начинается с 0
.
Каждому аппаратному устройству соответствует единственное подобное устройство. Оно является особенном, поскольку в реальности не контролирует оборудование, но концентрирует в себе информацию как о самом устройстве, так и о подключенных к нему. Основная информация, при этом, включает число и типы дополнительных устройств.
Микшеры отвечают за комбинирование (микширование) различных потоков аналоговых данных внутри устройства. Он также может включать серию элементов управления для выбора микшируемых сигналов, способов микширования, управления усилением (громкость) и отключением (mute) звука.
Подробнее см. в статье Архитектура микшера.
PCM-устройства отвечают за конвертирование цифровых сигналов в аналоговые или наоборот. Каждое устройство способно конвертировать данные лишь в одном направлении: канал воспроизведения (playback) конвертирует сигналы из цифровой формы в аналоговую, а канал захвата (capture) в противоположном направлении. Атрибуты PCM-устройств:
Максимальное число субканалов ограничено аппаратно. Для устройств с одним субканалом оно может быть преодолено программно: с помощью программного микшера, что позволяет в одном аппаратном субканале организовать 8 программных.
Количество анонсированных устройством субканалов, соответствует наилучшему сценарию. В реальности может поддерживаться меньше. Так, например, может заявляться 32 субканала, если все они работают на частоте 48КГц. При этом, на частоте 44.1КГц это число может быть аппаратно сокращено до 8.
Аудио стек поддерживает различные форматы аудио данных. Заголовочный файл <asound.h>
определяет набор констант, разделенных на два множества (с возможностью взаимной конвертации):
В общем случае, константы SND_PCM_FMT_*
используются для обозначения потенциальных возможностей, а константы SND_PCM_SFMT_*
для выбора и использования конкретных конфигураций.
Сконфигурировать формат можно исходя из его "ширины" и атрибутов с помощью вызова snd_pcm_build_linear_format().
Следующие функции могут быть использованы для проверки параметров конкретного формата:
Простейшее PCM-устройство представляет из себя буфер данных, который преобразует по одному семплу за раз с помощью ЦАП или АЦП, в зависимости от направления передачи информации (захват или воспроизведение звука). Данная концепция немного усложняется, учитывая, что субканал может находиться в следующих состояниях:
Переход из одного состояния в другое происходит в результате вызовов API или аппаратных событий. Подробнее см. в статье Воспроизведение и захват аудио данных.
Для PCM-устройства с единственным субканалом, драйвер может задействовать программный микшер. На уровне системы такое устройство выглядит как новое устройство воспроизведения, имеющее несколько субканалов. Его отличия от реального микшера:
Программный микшер специально подключается к одному аппаратному PCM-устройству. Мапирование один-к-одному позволяет вызовам API идентифицировать устройство программного микшера.
В ряде случаев приложение передает аудио данные в неподдерживаемом оборудованием формате. Приложение, может самостоятельно «на лету» конвертировать данные в нужный формат, либо это может выполнять аудио стек.
Последнее осуществляется путем вызова плагинов-конвертеров. Например, существуют конвертеры частоты дискретизации потока. Кроме того, существуют плагины для преобразования битовой ширины данных (8-битные данные в 16-битные и т.п.), порядка байт (прямой порядок в обратный и наоборот), голоса (стерео в моно и т.п.) и другие.
Для преобразования вызывается минимальное число конвертеров, чтобы минимизировать издержки со стороны CPU. Для этого приложение может использовать соответствующее API плагинов, имена функций в котором имеют префикс "plugin":
![]() | Не следует смешивать вызовы API, относящиеся к плагинам, с остальными. |
Предыдущий раздел: Библиотека libasound