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定义在PlaybackThread文件中,继承于TrackBase。在track的构造函数需要两个参数,其一client是调用者(也就是AudioTrack)的pid,其二thread是playbackThread,AF分配匿名共享内存。这个track被封装成TrackHan

本文详细介绍了Android系统中AudioTrack与AudioFlinger如何通过匿名共享内存进行交互,涉及到TrackBase类、循环Buffer、信号量同步及在处理音频数据时的生产者消费者模式。AudioTrack在start、stop等操作时,实际是通过IAudioTrack与AudioFlinger通信,而内存分配和数据传输的关键在于audio_track_cblk_t结构中的信号量mFutex,用于防止生产和消费过程中的数据不一致,确保音频播放的顺畅。当共享内存的有效数据不足时,会导致播放中的underrun,影响音质。
最低0.47元/天 解锁文章
1048

被折叠的 条评论
为什么被折叠?



