函數調用過程 從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);
|
|