Android多媒体:AudioTrack和AudioFlinger的交互

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值