1. 数据流向

其中当playback 播放时:
app -> 音频数据写入DMA buffer -> platform 通过I2S 将音频数据发给codec-> codec进行DAC转换-> 驱动扬声器发声。
今天我们重点来分析这里的DMA buffer。
2. DMA buffer
a. ring buffer
环形缓冲器(ringr buffer),也称作圆形队列(circular queue),循环缓冲区(cyclic buffer),圆形缓冲区(circula buffer),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。

一开始input/output 指向同一个位置,每写入一个数据,input 顺时针移动一次;
每取出一个数据, output顺时针移动一次。
b. DMA buffer也是采用了ring buffer, 只是它采用了n个ring buffer, 这个n比较大。
因此在数据读写的过程中,很少会出现读写指针互换的情况。

snd_pcm_runtime.hw_ptr_base: 环形缓冲区每一圈的基地址,当读写指针越过一圈后,它按buffer size进行移动;
snd_pcm_runtime.status->hw_ptr: 硬件逻辑位置,播放时相当于读指针,录音时相当于写指针;
snd_pcm_runtime.control->appl_ptr: 应用逻辑位置,播放时相当于写指针,录音时相当于读指针;
snd_pcm_runtime.boundary: 扩展后的逻辑缓冲区大小,通常是(2^n)*size;
版权声明:本文为baidu_36250852原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。