Audio中underrun与overrun问题解决

 CPU控制DMA传输数据步骤:
(1)外设可通过DMA控制器向CPU发出DMA请求:
(2)CPU响应DMA请求,系统转变为DMA工作方式,并把总线控制权交给DMA控制器;
(3)由DMA控制器发送存储器地址,并决定传送数据块的长度;
(4)执行DMA传送;
(5)DMA操作结束,并把总线控制权交还CPU。

Audio中underrun与overrun问题解决_第1张图片

linux错误码定义:
#define    EPIPE        32    /* Broken pipe */

1.播放pcm时,snd_pcm_lib_write() 返回 -EPIPE,为underrun问题(上层write慢了,底层没数据了)。
  播放时音频的时候会有-EPIPE的错误,因为驱动buffer没有数据可以丢给codec所致.
  就是上层给下面喂数据的速度慢了,底层不到充足的数据,所以给上层返回一个-EPIPE错误出来。


2.录制音频时,snd_pcm_lib_read() 返回 -EPIPE, 为overrun问题(上层读取慢了,底层buffer满了)。
  在录音的时候出现-EPIPE, ALSA的驱动一块专门用来存储录音数据的buffer,上层从驱动buffer搬运数据到应
用层,再存储起来就能得到我们需要的录音文件。
  一旦驱动的buffer满了,就会出现-EPIPE的错误,因为上层读录音buffer数据的速度太慢了,所以底层报一个-
EPIPE错误。
    
3.underrun/overrun解决对策   
 <1>.在播放的时候,如果会出现这种-EPIPE的错误,上层调整下发数据的数据,加快一点点!
 <2>.录音的时候出现这种错误,上层应该读得更快一点!可以提高任务的优先级来处理,也可以把驱动buffer扩大
一下,给系统更多一点的缓冲时间!

4.alsa driver使用了环形缓冲区对dma buffer进行管理
<1>.播放时数据流向
  CPU配置好DMA后,DMA把App的音频数据从CPU不断写入dma buffer中,DMA不停从该buffer取数据,经DAI送往Codec中。
  当写入的数据慢,播放的数据快时声音会出现断断续续,一卡一卡的现象。

<2>.录音时数据流向
  Codec不断把A/D转换好的音频数据经过dai送入dma buffer中,App不断地从该buffer中读走音频数据。
  当写入的数据快,播放的数据慢时,当数据量较多buffer有可能被冲掉,声音会出现类似“爆破”(Pop-Click)杂音的现象。

Audio中underrun与overrun问题解决_第2张图片

参考一

参考二

你可能感兴趣的:(Android,Audio学习)