ALSA 驱动架构说明
ALSA 是一个开源的音频驱动程序集,其结构如下:
Application
---------------
Alsa-lib User Space
-------------------------------------
Alsa Kernel Space
----------------------
sound driver
----------------------------------
Hardware
除了一组内核驱动程序模块之外,ALSA 还专门为简化应用程序的编写提供了相应的函
数库。利用该函数库,开发人员可以方便快捷的开发出自己的应用程序,细节则留给函数库
内部处理。下面本文将着重介绍驱动模块的运作机制及其要点。
Alsa kernel 为上层主要提供以下接口:
1 control interface 提供灵活的方式管理注册的声卡和对存在的声卡进行查询。
2 PCM interface 提供管理数字音频的捕捉和回放。
3 原始 MIDI 接口 一种标准电子音乐指令集。 这些 API 提供访问声卡上的 MIDI 总
线。这些原始借口直接工作在 The MIDI 事件上,程序员只需要管理协议和时间。
4 Timer 接口 为支持声音的同步事件提供访问声卡上的定时器。
5 音序器接口 一个比原始 MIDI 接口高级的 MIDI 编程和声音同步高层接口。它可以处
理很多的 MIDI 协议和定时器。
6 mixer 接口 控制发送信号和控制声音大小的声卡上的设备。
我们主要关心 1,2 接口。
卡和元件的管理:
编写 alsa 驱动时,首先需要为系统中的每一个声卡设备创建一个实例:
struct snd_card *card =snd_card_new(……);
该实例负责管理声卡上的组件:PCM,mixers,MIDI 等。同时该实例保存了声卡的名称,
管理/proc 目录下对应的声卡文件,并控制电源管理状态和热插拔连接等。
创建了声卡实例后,我们便可以将组件关联到声卡上了。在ALSA驱动中,元件是通过
snd_device对象来表示,通过snd_device_new()来创建。但一般情况下不同的元件通过各自
指定的接口来进行创建,比如:
pcm元件:snd_pcm_new()
控制接口元件:snd_ctl_new1()
关联了组件后,通过snd_card_register便将此声卡设备注册入系统,设备文件可以被
外界访问。
在卸载设备驱动时,需要调用snd_card_free把所有的组件都自动释放掉。
上述步骤都是例行程序,按部就班。
评论6