日期:2014-05-16  浏览次数:20779 次

[ALSA]如何使得采集buff中有数据时通知上层来取
在ALSA的音频开发当中,DMA会从McAsp的Audio FIFO中取数据到内存中的DMA buffer。如果上层此时要capture,就调用snd_pcm_readi函数,该函数最终往下调用到驱动层,driver从DMA buffer中取音频数据返回给上层。

但是这里有一个缺陷就是,每次的取数据都是上层调用read函数去取,而两次read之间buffer中已有的有效数据量的多少是不确定的,况且两次read之间的间隔时间由于程序的运行,往往也是不确定的。而这往往会导致overrun的错误。

想问下ALSA是否有一种机制,即当buffer中的有效数据达到要求时,就发送一个信号通知上层,这样就能及时地把有效的音频数据读出来,避免每次读取都有遗留,导致最后缓冲区溢出,产生overrun错误。

------解决方案--------------------
alsa会维护一套数据传输状态,但是好像上面读数据是阻塞的,上面去读的时候buffer够你要读的数据就立马读完返回,如果不够就得等。上面读不及时,下面alsa就会有overrun,数据buffer溢出。