在 ALSA 数据传输中,最容易出现的错误是 underrun 和 overrun。
pcm 播放的时候,接口 snd_pcm_writei 返回 -EPIPE,为 underrun(不足)
录制音频的时候, 接口 snd_pcm_readi 返回 -EPIPE, 为 overrun(超载)
使用 ALSA 架构的驱动程,在实际开发使用过程中,比较常见的错误有 -EPIPE,为什么会出现呢?肯定是系统内部不和谐了!
在 Playback 时出现 EPIPE 错误是因为 ALSA 驱动 buffer 没有数据可以丢给 codec 所致,通俗一点就是上层给下面喂数据的速度慢了,下面饿晕了,所以抱怨你上层慢啊,给你一个 -EPIPE 错误,让你自己去找原因。
在 Capture 时出现 EPIPE 也是有原因的,ALSA 的驱动也有一块专门用来存储录音数据的 buffer,上层从该 buffer 搬运数据再存储起来就能得到我们需要的录音文件。一旦驱动的 buffer 满了,就会出现 EPIPE 的错误,因为上层读录音 buffer 数据的速度慢了,这就不能抱怨下层不给面子了。
通过分析出现原因后,我们得找找对策,说起来容易,做的可能因为系统的原因并不是想的那么容易。在播放的时候,如果会出现这种 -EPIPE 的错误,请调整下发数据的数据,加快一点点!录音的时候出现这种错误,请读得更快一点!可以提高任务的优先级来处理,也可以把驱动 buffer 扩大一下,给系统更多一些缓冲时间!
在录音时由于录音数据过快会产生overrun现象;在放音时由于用户层的音频数据到 DDR 中的速度比控制器到 codec 放出的速度慢,于是出现underrun 现象。
建议检查:
DMA 没有及时的从 DDR 中将数据搬到 FIFO
DDR 中申请的 buffer 不够大
DDR 中的 buffer 没有数据