output

AudioPolicyService启动时会初始化一个AudioPolicyManagerBase
这个类会解析audio_policy.conf,调用openOutput(), 将创建多个profile对应的output.
----------------------------------------------------------------------------------------------------------
AudioTrack.set()包含3个流程getOutput()   createTrack()  如果cbf!=null 则启动一个回调线程

getOutput()则是依据stream =>strategy=>device,找对应的profile去查是否有对应的
output,如果有则直接返回。如果没有,则需要去创建,此时才会去调用mpClientInterface.openOutput(profile),如果
创建成功则返回,如果创建失败则selectOutput()从当前output中选择一个返回。
mpClientInterface就是AudioPlayerService

1. getOutput()流程
new AudioTrack()  =====AudioSystem========>AudioPolicyService[AudioPolicyManagerBase]==========>AudioFlinger

2. createTrack(output)流程
通过output找到对应的播放线程,然后在该播放线程内创建track并返回
AudioTrack()============AudioSystem=========================AudioFlinger
                 AudioSystem::get_audio_flinger();

目前看来C++要想跟各个服务打交道都是通过AudioSystem来获得对应的服务来完成的。

---------------------------------------------------------------------------------------------------------

startOutput()

AudioTrack

AudioTrack.start()=>AudioFlinger::TrackHandle.start()=>AudioFlinger::PlaybackThread::Track.start(){playbackThread->addTrack_l(this);}
===>AudioFlinger::PlaybackThread::addTrack_l(){AudioSystem::startOutput(mId, track->streamType(), track->sessionId())}

posted @ 2015-04-15 08:33  牧 天  阅读(313)  评论(0)    收藏  举报