ALSA 音频数据传输 underrun 和 overrun

网友投稿 2238 2022-09-02

ALSA 音频数据传输 underrun 和 overrun

ALSA 音频数据传输 underrun 和 overrun

在 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 中将数据搬到 FIFODDR 中申请的 buffer 不够大DDR 中的 buffer 没有数据

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:laravel5.5实现PHP定时任务,可参考学习
下一篇:制作 shell 脚本安装包
相关文章

 发表评论

暂时没有评论,来抢沙发吧~