對於AF的分析,先看其所在層的位置以及相關的交互類,
之前的版本,AF在Main_MediaServer.cpp裏面啓動,在android N,AF在main_audioserver.cpp裏面啓動,
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ALOGI("ServiceManager: %p", sm.get()); AudioFlinger::instantiate(); AudioPolicyService::instantiate(); RadioService::instantiate(); SoundTriggerHwService::instantiate(); . ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); |
在android N, audioserver進程的啓動也發生了一些變化,
init.zygote64.rc
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server class main socket zygote stream 660 root system onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart audioserver onrestart restart cameraserver onrestart restart media onrestart restart netd. writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks. |
init.target.rc
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// service audiod /system/bin/audiod class late_start user system group system . |
在AudioFlinger.cpp的類創建過程中,AudioFlinger::instantiate()函數實例化AudioFlinger,instantiate在其父類BinderService裏實現(frameworks/base/include/binder/BinderService.h頭文件中),這裏可以看到它被添加到系統服務裏面了,之後,就存在一個AF的類實例,可以通過系統服務的方式被訪問,再之後onFirstRef會被執行。
構造函數和onFirstRef裏面沒有創建和關聯太多相關類,只創建了PatchPanel,
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void AudioFlinger::onFirstRef() { … mPatchPanel = new PatchPanel(this);
mMode = AUDIO_MODE_NORMAL; } . |
在AF內部,由於和他交互的模塊較多,所以實現了不同的服務端、客戶端,爲了達到實現不同功能的目的,其本身還維護多個線程。
關於內部線程方面,各線程的關係如下,
這些線程實現在\frameworks\av\services\audioflinger\ Threads.cpp ,主要的實現在PlaybackThread,在我們前面分析AT的時候,會在AF的openOutput_l裏面new一個PlaybackThread(或其子類),這樣就創建了線程實例,然後在其onFirstRef裏啓動線程,
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void AudioFlinger::PlaybackThread::onFirstRef() { run(mThreadName, ANDROID_PRIORITY_URGENT_AUDIO);. } |
線程的Looper爲boolAudioFlinger::PlaybackThread::threadLoop(),這個函數很大,不展開分析,簡單說就是它負責處理播放過程,相應相關事件,收到外部通知或播放結束就結束線程。
AudioFlinger::RecordThread::RecordThread爲輸入線程,也不展開分析了。
|
線程的上下交互關係如下,
對於輸出部分,可以看到針對不同的OUTPUT FLAG,在AF和HAL層有不同的Thread來進行播放。
對於音量控制,其框圖如下
輸入部分,則爲