[Android Audio]AudioFlinger(一)AudioFlinger的啓動

就是學習筆記,當然參考過網上資料,不一定準確,只是記錄。

AudioFlinger屬於Android的Native層。所以,它會按照自己的特定方式去決定如何啓動。像AudioFlinger就是由Linux來間接創建的。

在frameworks/base/media/mediaserver/main_mediaserver.cpp

int main(int argc, char** argv)
{
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    LOGI("ServiceManager: %p", sm.get());
    AudioFlinger::instantiate();        //啓動AudioFlinger
    MediaPlayerService::instantiate();  //啓動MediaPlayerService
    CameraService::instantiate();       //啓動CameraService
    AudioPolicyService::instantiate();  //啓動AudioPolicyService
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}

這個main函數會啓動和音頻media相關的Native層服務。我們來看看這個文件的Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
	main_mediaserver.cpp                      #要編譯的源文件

LOCAL_SHARED_LIBRARIES := \                       #依賴的共享庫
	libaudioflinger \
	libcameraservice \
	libmediaplayerservice \
	libutils \
	libbinder

base := $(LOCAL_PATH)/../..                       #定義一下base變量,他是一個路徑,供下面使用

LOCAL_C_INCLUDES := \                             #本次編譯需要的頭文件路徑
    $(base)/services/audioflinger \
    $(base)/services/camera/libcameraservice \
    $(base)/media/libmediaplayerservice

LOCAL_MODULE:= mediaserver                        #生成模塊的名字

include $(BUILD_EXECUTABLE)


因爲AudioFlinger的源碼在libaudioflinger庫中,所以必須在編譯的時候依賴這個庫。當然,其他的服務也要以來其他的庫。

當系統啓動的時候,init進程會加載init.rc,在init.rc中,啓動了我們的服務mediaserver


service media /system/bin/mediaserver
    class main
    user media
    group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc
    ioprio rt 4

這樣就啓動了mediaserver,從而啓動了AndroidFlinger。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章