Написание PCM устройства
В рассматриваемой архитектуре PCM устройство поддерживает либо канал захвата аудио данных, либо канал воспроизведения, либо оба. Канал захвата PCM преобразует аналоговый сигнал в цифровой поток, а канал воспроизведения выполняет обратное преобразование. Устройство PCM обычно поддерживает несколько параллельно преобразуемых потоков, каждый из которых называется подканалом.
Библиотека аудио драйвера должна предоставлять точку входа вызовом ctrl_init(). Глава разработка драйвера описывает общую инициализацию, которую функция должна выполнять независимо от общей функциональности драйвера.
Во многом таким же образом создается микшер. PCM устройство создается, используя функцию ado_pcm_create(). Последняя информирует высокие уровни аудио стека о наличии поддержки PCM устройства. При повторном вызове данной функции будет создано дополнительное устройство.
Прототип функции 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 );
Аргументы:
Для того чтобы заставить устройство PCM работать, необходимо определить callback-функции в структурах ado_pcm_hw_t для контуров захвата и воспроизведения PCM устройства.
Перед более детальным их рассмотрением необходимо понять, как поток PCM работает в аппаратной части. Основной объект здесь – DMA буфер в памяти, разделенный на два или более фрагмента. Аппаратное обеспечение взаимодействует с фрагментом с помощью DMA, а затем генерирует прерывание при завершении работы по чтению или записи фрагмента. Например, если рассматривать упрощенный случай воспроизведения буфера размером 50К, собранным из двух фрагментов, при отправке пользовательским приложением данных происходит следующее:
С точки зрения программирования, если оборудование может быть настроено на цикличное воспроизведение буфера с использованием DMA и генерацией прерываний каждые x байт, осуществление данного алгоритма очень простое. Вариацией на эту тему является перенастройка механизма DMA после каждого фрагмента в обработчике прерывания. В общем случае клиент может предложить размер фрагмента и их количество, но только драйвер может выбрать и установить эти параметры.
Предыдущий раздел: Библиотека libado