您的位置:首页 > 移动开发 > Android开发

Android多媒体:AudioTrack

2015-07-18 09:10 579 查看


AudioTrack是和PlaybackThread中创建的Track一一对应的,Track是Bn,AudioTrack是Bp。音乐APP通过操作AudioTrack来进行音乐数据的传输。具体过程如下:



应用initAudioTrack ,new一个AudioTrack, 注意里面的flag(比如AUDIO_OUTPUT_FLAG_FAST,那说明这个output是需要FastMixer的)。并且调用了AudioTrack的set函数,注册了audioCallback做callback函数。这个callback是AT和应用交互数据的接口。

在set函数里,调用了AudioSystem::getOutput,然后是hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp调用了getOutput,这里会找一个完全满足输入参数如bit-depth的output,否则返回0。然后调用client的openOutput。client这里是AudioFLinger,所以findSuitableHwDev_l,open_output_stream,然后new Mixer。所以,一个Output对应一个playback线程。手机里面的output是由audio_policy.conf定义的。由各个厂家自己实现。

在set函数里,创建了AudioTrackThread线程,这个线程不停的执行threadLoop,除非有人pause或stop它。threadLoop中有一个重要的函数processAudioBuffer。其中通过proxy的obtainBuffer,再通过mCblk的rear和front算出来自己的mRaw指针的地址,然后传给AudioTrack的processAudioBuffer的参数audioBuffer。audioBuffer是一个输入输出参数,它既负责输入又负责输出,最终执行完processAudioBuffer后输出填好的buffer的数据指针和大小。

如果new出AudioTrack的模块没有给AudioTrack提供callback,就无法使用上面的方式来填充数据,而是要自己调用AudioTrack::write函数来写。可以清晰的看出:采用callback的方式属于下层驱动,上层被动;采用write函数调用的方式属于上层主动,下层被动。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: