1、PCM设备的命名
ALSA的API 库使用的是逻辑设备名,而不是具体的设备文件。因此设备名字可以是真实的硬件名字也可以是插件名字
1. 硬件名字:使用 hw:i,j 这样的格式。其中i是声卡的卡号,j是这块声卡上的设备号。
2. 插件名字:唯一性。例如 plughw:0,0 ,不提供对硬件设备的访问,仅提供如采样率这样的软件特性
2、声音缓存和数据传输
2.1 传输原理
每个声卡都有一个硬件缓存区来保存记录下来的样本。当缓存区足够满时,声卡将产生一个中断。内核声卡驱动然后使用直接内存 DMA 访问通道将样本传送到内存中的应用程序缓存区。
也就是说应用程序使用DMA将应用程序缓存区的数据传送到声卡的硬件缓存区中
2.2 缓存区
1.硬件缓存区:是一种环形缓存区。当数据到达缓存区末尾时将重新回到缓存区的起始位置。ALSA框架中有一个指针来指向硬件缓存区中数据的当前位置
2.应用程序缓存区:其大小可以通过ALSA库函数调用来控制。缓存区可以很大,但是很有可能会出现延时。ALSA将缓存区拆分成一系列周期 period(OSS中称作fragments),以period为单元来传送数据
3.周期:硬件中断的间隔时间,表示输入延时
在声卡驱动程序中,为了防止抖动的出现,保证播放的性能,设置了内部缓冲区-DMA buffer。播放时,应用程序通过驱动程序首先将音频数据从应用程序缓冲区-APP buffer,写入到DMA buffer。接着,由DMA控制器把DMA buffer中的音频数据发送到DAC
某些时刻CPU没有时间向DMA buffer放入新的音频数据,DAC由于没有输入新的音频数据,导致声音播放的间断,这就出现了声音的抖动现象。
此时,需要将DMA buffer设置的足够大,使得DAC始终有数据播放。但是,DMA buffer的增大使得每次从APP buffer拷贝的时间也变长,导致了更大的播放延迟。
2.3 异常处理 Over and Under Run
在音频处理的过程中,数据连续地在硬件缓存区和应用程序缓存区之间传输。如果应用程序读取数据不够快,循环缓存区将会被新的数据覆盖,这种数据丢失的现象称为over run;如果应用程序写入数据到缓存区中的速度不够快,缓存区将会"饿死",这样的错误称为under run。这两种情形统称为XRUN,可以调用snd_pcm_prepare()接口重新准备设备,开始下一次读写。