“ALSA uses the ring buffer to store outgoing (playback) and incoming (capture, record) samples. There are two pointers being maintained to allow a precise communication between application and device pointing to current processed sample by hardware and last processed sample by application. The modern audio chips allow to program the transfer time periods. It means that the stream of samples is divided to small chunks. Device acknowledges to application when the transfer of a chunk is complete.”
ALSA使用了环形buffer来存储回放和录音的数据,这里使用了2个指针来维护设备和应用间的通信,一个指针指向硬件当前处理的数据,另一个指针指向应用程序最后处理的数据,现代的的音频芯片允许编程改变传输的时间周期,这意味着音频流的数据被分割成很多小块,当一个小块传输完成时,设备对应用程序进行响应。
ALSA编程有buffer、period、frame、sample,byte等概念,之间的关系如下:
buffer = N periods;
period = N frames;
frame = N bytes; //如:对于单声道16位AD,N=2
ALSA是按周期写入数据,一个周期包含多少个帧是可以设置的,怎么来权衡一个周期包含多少个帧呢?
这个跟给小孩喂饭的情况类似,假设小孩吃饭的速度不变(好比音频的采样速率固定,如44100Hz),如果小口小口的喂,那就要求你喂的速度很快,小孩才不会哭闹,但是这样你就会累死;如果你想有时间偷懒,那就一次喂一大口,等小孩还在嚼的时候,你再装一大勺,翘着二郎腿清闲的等着,这样小孩也不会哭闹。也就是说,周期帧数少,则耗CPU时间,周期帧数大,则耗内存。