声卡原理介绍
ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构, 在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用 alsa-lib提供的API,即可以完成对底层音频硬件的控制,内核空间中,alsa-soc其实是对alsa-driver的进一步封装,他针对嵌入式设备提供了一系列增强的功能.
从alsa在linux中的设备文件结构如下图所示,我们可以看到不同的设备文件,其中,C0D0代表的是声卡0中的设备0,pcmC0D0c最后一个c代表capture,pcmC0D0p最后一个p代表 playback,这些都是alsa-driver中的命名规则.从上面的列表可以看出,我的声卡下挂了6个设备,根据声卡的实际能力,驱动实际上可以挂上更多种类的设备.
对于Linux来说,它的声卡驱动有两套,一套称为OSS,另一套称为ALSA,对于OSS是商业公司开发的,使用其框架是要收钱的,而对于ALSA来说它的功能强大容易扩展,并且它可以模拟OSS,对于声音的存储就是将模拟信号转化为数字信号存储,就是一个采用量化的过程,采用频率越高,失真就是越小,容量就越大,对于声音的播放还有单通道和多通道模式
如上图所示,当需要录音时将外部的模拟信号经过ADC转化为数字信号,然后将转化后的数字信号数据经过DMA搬运到内存中,当需要播放音乐时就将音频的数字信号数据从内存经过DMA搬运到IIS总线上,然后经过DAC将数字信号转化为模拟信号输出到喇叭播放声音,对于音频编解码芯片它可以初始化,选择格式,设置音量,对于一个声卡的驱动程序,你需要做单板的初始化和声卡的初始化,单板的初始化在选择不同的IIS总线引脚,对于声卡的初始化在于音频编解码芯片的初始化
框架
对于Linux驱动,它一般分为软件框架和硬件操作两部分,我们应用程序永远是通过open,read,write等等的文件接口来访问我们的硬件,而驱动程序就是作为之间连接的桥梁,下面我们看到源码sound.c
static int __init alsa_sound_init(void)
{
snd_major = major;
snd_ecards_limit = cards_limit;