二、PCM设备

本文详细介绍了PCM设备的命名规则,包括硬件设备名和插件名。接着阐述了声音缓存和数据传输的原理,如硬件缓存的环形结构、应用程序缓存区的控制以及DMA在数据传输中的作用。此外,还讨论了音频处理中的异常情况——Overrun和Underrun,以及如何通过snd_pcm_prepare()接口进行恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()接口重新准备设备,开始下一次读写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值