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())}

浙公网安备 33010602011771号