现在的位置: 首页 > 综合 > 正文

[Android Audio]AudioFlinger(一)AudioFlinger的启动

2018年02月11日 ⁄ 综合 ⁄ 共 1429字 ⁄ 字号 评论关闭

就是学习笔记,当然参考过网上资料,不一定准确,只是记录。

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。

抱歉!评论已关闭.