AudioTrack和AudioFlinger之间通过共享内存进行数据交互。共享内存可以从上层传下来,也能在TrackBase用共享内存创建。传下来的是static的。
创建代码如下:
if (sharedBuffer == 0) {
mAudioTrackServerProxy = newAudioTrackServerProxy(mCblk, mBuffer, frameCount, mFrameSize);
} else {
mAudioTrackServerProxy = newStaticAudioTrackServerProxy(mCblk, mBuffer, frameCount,
mFrameSize); }
mCblkMemory = client->heap()->allocate(size);
Track类可以认为是对共享内存Buffer的管理,主要的设计体现在TrackBase类里。这个Buffer是一个循环Buffer,如图所示
在AudioTrack的set函数里,AudioTrack调用createTrack_l,其中AF调用了createTrack,创建了一个Client,对于ToneGenerator来说,每个Client都被分配了1M的内存,支持32个tracks,每个track 8个4k的buffer。然后,根据output找到对应的playback线程,然后该线程调用了createTrack_l,创建track,并且存入playback线程的mTracks数组。track定义在Playba