Раздел дает понимание роли драйвера в аудио стеке
Раздел содержит:
Рассмотрим организацию аудио стека на примере отправки приложением информацию звуковой карте. На уровне архитектуры это выглядит следующим образом:
Все, что находится по правую сторону от разделителя – аудио драйвер. Для поддержки аудио устройства требуется наличие лишь библиотеки драйвера. Данный раздел описывает общие подходы к его разработке.
Рассмотрим основы разработки аудио драйвера.
API для аудио стека включает несколько внутренних структур менеджера io-audio, причем содержание известно только стеку. Следует просто сохранить указатели на них и передавать функциям, которым они необходимы.
Ниже приведен список приватных типов данных:
ado_card_t
ado_dswitch_t
ado_mixer_delement
ado_mixer_dgroup_t
ado_mixer_t
ado_pcm_subchn_mixer_t
ado_pcm_subchn_t
ado_pcm_t
Префикс ado означает "аудио".
Драйверу может понадобиться сохранить внутренние данные для последующего использования. Аудио стек позволяет определять конекстно-зависимые данные как для аппаратного обеспечения, так и для микшеров.
Для того, чтобы сделать API более гибким (и читаемым) стек использует следующие типы, которые можно определить по своему желанию:
По умолчанию эти типы представляют собой пустые структуры. Через директиву #define
их следует определить до включения любого из заголовочных файлов аудио стека. Например:
#define HW_CONTEXT_T my_hw_context_t#define MIXER_CONTEXT_T my_mixer_context_t
При желании можно даже определить HW_CONTEXT_T
и MIXER_CONTEXT_T
как один тип.
The MIXER_CONTEXT_T хранится как часть структры ado_mixer_t . Для доступа к контексту микшера необходимо вызвать ado_mixer_get_context(), потому что ado_mixer_t – внутренний тип данных менеджера io-audio. |
Драйвер должен указать точку входа вызовом ctrl_init() типа ado_ctrl_dll_init_t
. Когда io-audio загружает драйвер, первой будет вызвана именно ctrl_init():
int32_t ctrl_init( HW_CONTEXT_T **hw_context,ado_card_t *card,char *args );
Аргументы:
HW_CONTEXT_T
как произвольную структуру. По умолчанию она определена как структура hw_context
. ado_card_t
. Структура является приватной и ее содержание известно только менеджеру io-audio. Необходимо сохранить этот указатель для передачи в другие функции в качестве аргумента, например, в ado_mixer_create(). Первое, что необходимо сделать при инициализации – выделить контекстно-зависимую структуру состояния путем вызова ado_calloc() или ado_malloc().
Затем необходимо определить, присутствует ли поддерживаемое оборудование в системе. Точный способ зависит от драйвера и в некоторых случаях это вовсе невозможно:
Функция ado_pci_device() возвращает указатель на структуру struct ado_pci, которая описывает PCI устройство. Следует сохранить копию этого указателя в контексте устройства.
После этого следует задать короткое и длинное имена, которые приложения будут использовать для определения типа карты и имени конкретного экземпляра. Это доступно через вызовы ado_card_set_shortname() и ado_card_set_longname().
Инициализация также зависит от того, какие функции поддерживает драйвер:
Если инициализация была успешной ctrl_init() должна вернуть 0
и -1
в случае ошибки (в этом случае io-audio освободит устройство и отмонтирует его драйвер).
Драйвер также должен определить точку входа ctrl_destroy() типа ado_ctrl_dll_destroy_t
. Менеджер io-audio вызывает ctrl_destroy() независимо от того, была ли карта отмонтирована:
int32_t ctrl_destroy( HW_CONTEXT_T **hw_context );
Callback-функция должна отменить действия, которые выполнены в ctrl_init(), что обычно включает:
Если освобождение устройства было успешным, ctrl_destroy() должна вернуть 0
и -1
в случае ошибки.
Аудио стек использует несколько констант для включения и выключения отладочных сообщений. Главная из них - ADO_DEBUG
.
Стандартные make-файлы аудио стека позволяют задать переменную ADO_DEBUG
, если в окружении определена переменная DEBUG. Если компилируется отладочная версия драйвера, ADO_DEBUG
также будет определена для помощи в отладке.
Если определена ADO_DEBUG
, происходит следующее:
Можно вызвать ado_memory_dump() для получения полного списка используемой памяти. В режиме без отладки эти функции являются обертками над стандартными функциями системной библиотки.
Если установлена ADO_DEBUG
, также можно определить макрос для включения специализированного отладочного вывода:
ADO_MUTEX_DEBUG
— используется ado_mutex_destroy(), ado_mutex_init(), ado_mutex_lock() и ado_mutex_unlock(). ADO_RWLOCK_DEBUG
— используется ado_rwlock_destroy(), ado_rwlock_init(), ado_rwlock_rdlock(), ado_rwlock_unlock() и ado_rwlock_wrlock(). Эти макросы позволяют отлаживать логику использования мьютексов и rw-блокировок.
Если драйвер скомпилирован с переменной ADO_DEBUG , драйвер не будет работать под управлением штатного менеджера io-audio. Для этого следует использовать io-audio_g. |
Предыдущий раздел: Библиотека libado