函数调用过程
从AudioTrack开始跟踪。
AudioTrack::set --> output = AudioSystem::getOutput ---------AudioTrack.cpp
--> aps->getOutput ---------AudioSystem.cpp
--> ( mpAudioPolicy->get_output --------AudioPolicyService.cpp
<==> ap_get_output ) --> ( lap->apm->getOutput ---------audio_policy_hal.cpp
<== >AudioPolicyManagerBase::getOutput )
--> ( mpClientInterface->openOutput ------AudioPolicyManagerBase.cpp
<==> aps_open_output ) --> af->openOutput ----------AudioPolicyService.cpp
-->AudioFlinger::openOutput
-->hwDevHal->open_output_stream -----------AudioFlinger.cpp
<==> adev_open_output_stream) --> 在此最终获得到了 *stream_out = &out->stream 。
-----------
tinyalsa_hal.c 这里会返回到AudioFlinger,这里最终看到AudioFlinger::openOutput函数的结尾你会发现output其实是通过audio_io_handle_t id = nextUniqueId();获得的一个整数,在
if (status == NO_ERROR && outStream != NULL)条件成立后会走以下关键几步:
AudioStreamOut *output = new AudioStreamOut(outHwDev, outStream, flags);
thread = new MixerThread(this, output, id, *pDevices);
mPlaybackThreads.add(id, thread);
return id;
其实就是将从hal层获取到的stream_out作为参数new一个AudioStreamOut 对象指针,再将output指针作为参数new一个mixer thread,最终将id 和 thread以键值对的关系保存。这个最终会在
AudioFlinger::createTrack()函数中用到调用语句:PlaybackThread *thread = checkPlaybackThread_l(output);
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。