Обработка аудио данных в формате PCM

Написание PCM устройства

В этой главе...

Что такое устройство PCM?
Создание PCM устройства
Функция ado_pcm_create()
Как работает поток PCM?

Что такое устройство PCM?

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

Создание PCM устройства

Библиотека аудио драйвера должна предоставлять точку входа вызовом ctrl_init(). Глава разработка драйвера описывает общую инициализацию, которую функция должна выполнять независимо от общей функциональности драйвера.

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

Функция ado_pcm_create()

Прототип функции ado_pcm_create():

int32_t ado_pcm_create( ado_card_t *card,
char *name,
uint32_t flags,
char *id,
uint32_t play_subchns,
ado_pcm_cap_t *play_cap,
ado_pcm_hw_t *play_hw,
uint32_t cap_subchns,
ado_pcm_cap_t *cap_cap,
ado_pcm_hw_t *cap_hw,
ado_pcm_t **rpcm );

Аргументы:

card
Аргумент, который io-audio передает в ctrl_init() функцию драйвера. Библиотека использует этот аргумент для определения карты для подключения нового устройства.
name
id
Текстовые метки PCM устройства. Обычно это вариации имени звуковой карты. Они используются только для отображения информации клиентскими приложениями.
flags
Информация об устройстве для использования клиентским приложением. Например, указывается возможность одновременной записи и воспроизведения. Флаги носят исключительно информационный характер, соблюдение любого из этих условий выполняется исключительно кодом.
play_subchns
cap_subchns
Количество поддерживаемых подканалов воспроизведения и записи. Если значение равно нулю, канал не поддерживается.
play_cap
cap_cap
Структуры, в которых перечислены полные возможности каналов воспроизведения и записи. Включая поддерживаемые формат, частоту и голоса. Верхние уровни аудио стека используют эту информацию для проверки клиентского запроса до того как он будет передан в оборудование. Данная информация также передается клиенту как сведения о возможностях устройства.
play_hw
cap_hw
Структуры, содержащие callback-функции, вызываемые верхними уровнями аудио стека. Именно в этих функциях происходит работа с оборудованием. Подробнее см. далее в параграфе "Как работает поток PCM?".
rpcm
Место в памяти, где хранится указатель на внутреннюю структуру дескриптора устройства PCM. Этот указатель будет передаваться в другие драйверные вызовы.

Как работает поток PCM?

Для того чтобы заставить устройство PCM работать, необходимо определить callback-функции в структурах ado_pcm_hw_t для контуров захвата и воспроизведения PCM устройства.

Перед более детальным их рассмотрением необходимо понять, как поток PCM работает в аппаратной части. Основной объект здесь – DMA буфер в памяти, разделенный на два или более фрагмента. Аппаратное обеспечение взаимодействует с фрагментом с помощью DMA, а затем генерирует прерывание при завершении работы по чтению или записи фрагмента. Например, если рассматривать упрощенный случай воспроизведения буфера размером 50К, собранным из двух фрагментов, при отправке пользовательским приложением данных происходит следующее:

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




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