Android AudioFlinger & AudioPolicy启动详解

Android AudioFlinger & AudioPolicy启动详解

     AudioPolicyService和AudioFlinger都是运行在AudioServer进程中的模块,它们的入口是在/frameworks/av/media/audioserver/main_audioserver.cpp文件中的main()函数中,由init进程通过解析audioserver.rc文件启动。main()函数干的事也比较简单,就是创建AudioPolicyService和AudioFlinger对象,并将它们两个作为Binder服务,添加进ServiceManager中。

一、audioserver进程启动

     Google将init.rc文件做了拆分, 由模块独立管理其rc文件,不再由init进程集中管理, 这里`audioserver.rc` 便是audio系统的启动文件, 看下其内容:
# 作为service启动,说明启动路径
service audioserver /system/bin/audioserver 
	# 核心
    class core
    #用户为audioserver
    user audioserver
    # media gid needed for /dev/fm (radio) and for /data/misc/media (tee)
    group audio camera drmrpc inet media mediadrm net_bt net_bt_admin net_bw_acct wakelock
    capabilities BLOCK_SUSPEND
    ioprio rt 4
    take_profiles ProcessCapabilityHigh HighPerformance
    onrestart restart audio-hal
    onrestart restart audio-hal-aidl
    onrestart restart audio-effect-hal-aidl
    onrestart restart audio-hal-4-0-msd
    onrestart restart audio_proxy_service

on property:vts.native_server.on=1
    stop audioserver
on property:vts.native_server.on=0
    start audioserver
...
    其中,wakelock允许申请内核 wakelock(防止休眠),wakelock + BLOCK_SUSPEND 共同确保播放时不休眠。
    再看audioserver的启动入口main函数:
int main(int argc __unused, char **argv)
{
   
   
    // 限制audioserver内存使用上限
    limitProcessMemory(
        "audio.maxmem", /* "ro.audio.maxmem", property that defines limit */
        (size_t)512 * (1 << 20), /* SIZE_MAX, upper limit in bytes */
        20 /* upper limit as percentage of physical RAM */);

    signal(SIGPIPE, SIG_IGN);

    bool doLog = (bool) property_get_bool("ro.test_harness", 0);

    pid_t childPid;
    //是否启动子进程启动log记录,这里不是流程分析关注点
    if (doLog && (childPid = fork()) != 0) {
   
   
        ......
    } else {
   
   
        android::hardware::configureRpcThreadpool(4, false /*callerWillJoin*/);
        ProcessState::self()->startThreadPool();
        // 启动AudioFlinger
        const auto af = sp<AudioFlinger>::make();
        const auto afAdapter = sp<AudioFlingerServiceAdapter>::make(af);
        // 启动AudioPolicyService
        const auto aps = sp<AudioPolicyService>::make();
        // Add AudioFlinger and AudioPolicyService to ServiceManager
        sp<IServiceManager> sm = defaultServiceManager();
        sm->addService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME), afAdapter,
                false, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);
        sm->addService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME), aps,
                false, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);
       .......
       // 满足条件,启动AAudioService
        std::vector<AudioMMapPolicyInfo> policyinfos;
        status_t status = af->getMMapPolicyInfos(AudioMMapPolicyType::DEFAULT, &policyinfos);
        AAudioService::instantiate();
    }
}

二、AudioFlinger初始化

    在audioserver中,即调用AudioFlinger的构造函数:
AudioFlinger::AudioFlinger()...
{
   
   
    ...
    mDeviceFactoryHal = DeviceFactoryHalInterface::create();
    mEffectsFactoryHal = audioflinger::EffectConfiguration::getEffectsFactoryHal();
    ...
}
    AudioFlinger的构造函数只是对参数进行初始化。
AudioFlinger::onFirst()
{
   
   
    mDeviceFactoryHalCallback = new DeviceFactoryHalCallbackImp;
    mDeviceFactoryHal->setCallbackOnce(mDeviceFactoryHalCallback);
}

三、AudioPolicyService初始化

AudioPolicyService::AudioPolicyService()
    : BnAudioPolicyService(),
      mAudioPolicyManager(NULL),
      mAudioPolicyClient(NULL),
      mPhoneState(AUDIO_MODE_INVALID),
      mCaptureStateNotifier(false), 
      mCreateAudioPolicyManager(createAudioPolicyManager),
      mDestroyAudioPolicyManager(destroyAudioPolicyManager),
      mUsecaseValidator(media::createUsecaseValidator())
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值