Linux ALSA 驱动模型
一、音频相关知识
声音是连续的模拟信号,音频设备是将模拟信号和数字信号进行转换的设备。转转的原理就是通过离散的时间对信号进行量化,以对模拟信号进行准确的模拟。
音频通常包括输入和输出,它们可以同时进行。有关音频的指标参数如下。
采样频率:单位时间内的采样次数。采样频率越高,采样点之间的时间间隔就越短,数字量化后的声音就越逼近模拟信号。声音的采样频率用kHz(千赫兹)来度量。
量化位数:即采样位数,就是模拟量转换成数字量后的数据位数。它有8位和16位两种。位数越多,声音越细腻。
声道数量:指单声道或者是立体声(即左右声道)
二、Linux下的音频驱动架构
Linux内核目前采用 ALSA(Advanced Linux Sound Architecture) 架构,目前已经成为linux的主流音频体系结构。
该架构不经包括驱动部分,而且还包括了应用部分。应用库对驱动提供的服务进行封装,避免应用对ioctl频繁的调用,容易理解和使用。
ASLALinux高级声音架构,它在Linux系统上提供了音频和MIDI(音乐设备数字化接口)的支持,它包含API库和工具,内核驱动集合,ALSA包含一系列的内核驱动集合对声音的支持,还提供了libasound的API库支持。用做这些写应用程序不需要打开设备操作,完全不用关注底层。
ALSA自带的应用程序是alsa-utils工具包,包括aplay、alsamixre等。Aplay用于在ALSA上播放音频,alsamixer用于改变音频音量。
Alsa-lib是用户空间的函数库,提供lib asound.so给应用程序使用。应用程序包含头文件asoundlib.h。这个库提供封装函数(ALSA-API)使应用程序编写更容易。
Alsa-lib中的control、 timer、 dmix 等都是以插件(plugin)存在,alsa-lib通过硬件访问层的系统调用与内核交互。
Alsa-driver是音频设备的alsa内核部分的驱动,集成到内核中,多数以模块存在。它分三层:
1、 硬件控制层,访问和操作硬件
2、 中间层是LASA驱动的核心部分,由各种功能的驱动设备组成,为用户提供硬件组件,如PCM、AC97、音序器和控制器等。用户也可以自行定义设备组件。
3、 驱动最上层是声卡对象描述层,是声卡硬件的抽象描述,内核通过这些描述可得知声卡的功能,设备组件以及操作方法等。
以下是ALSA驱动架构图:
![](https://img-blog.csdnimg.cn//2020102221154797.jpg)
![](https://img-blog.csdnimg.cn/20201022213506845.jpg)