分类: 嵌入式
2011-06-30 17:43:35
我们可以这样理解这张图的含义:
下面的序列图展示了AudioTrack和AudioFlinger建立联系的过程:
图二 AudioTrack和AudioFlinger建立联系
解释一下过程:
自此,AudioTrack建立了和AudioFlinger的全部联系工作,接下来,AudioTrack可以:
audio_track_cblk_t这个结构是FIFO实现的关键,该结构是在createTrack的时候,由AudioFlinger申请相应的内存,然后通过IMemory接口返回AudioTrack的,这样AudioTrack和AudioFlinger管理着同一个audio_track_cblk_t,通过它实现了环形FIFO,AudioTrack向FIFO中写入音频数据,AudioFlinger从FIFO中读取音频数据,经Mixer后送给AudioHardware进行播放。
audio_track_cblk_t的主要数据成员:
user -- AudioTrack当前的写位置的偏移
userBase -- AudioTrack写偏移的基准位置,结合user的值方可确定真实的FIFO地址指针
server -- AudioFlinger当前的读位置的偏移
serverBase -- AudioFlinger读偏移的基准位置,结合server的值方可确定真实的FIFO地址指针
frameCount -- FIFO的大小,以音频数据的帧为单位,16bit的音频每帧的大小是2字节
buffers -- 指向FIFO的起始地址
out -- 音频流的方向,对于AudioTrack,out=1,对于AudioRecord,out=0
audio_track_cblk_t的主要成员函数:
framesAvailable_l()和framesAvailable()用于获取FIFO中可写的空闲空间的大小,只是加锁和不加锁的区别。