Android 7.0 Audio: AudioFlinger介紹和初始

對於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來進行播放。

 

對於音量控制,其框圖如下

 

 

 

輸入部分,則爲

 

 

發佈了96 篇原創文章 · 獲贊 40 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章