zoukankan      html  css  js  c++  java
  • AudioFlinger

    1.loadHwModule函数分析
    frameworks/av/services/audioflinger/AudioFlinger.cpp
    loadHwModule函数是在AudioPolicyService中被调用的

    audio_module_handle_t AudioFlinger::loadHwModule(const char* name)
    {
        //name: primary, a2dp, usb等等
        return loadHwModule_l(name);
    }
    audio_module_handle_t AudioFlinger::loadHwModule_l(const char* name)
    {
        ...
        sp<DeviceHalInterface> dev;
        
        //通过dev返回一个dev对象。在这个地方需要弄清楚mDevicesFactoryHal是什么,才能清楚openDevice具体干了什么事情。
        int rc = mDevicesFactoryHal->openDevice(name, &dev);
        ...
        audio_module_handle_t handle = (audio_module_handle_t)nextUniqueId(AUDIO_UNIQUE_ID_USE_MODULE);
        
        //将handle和AudioHwDevice对象放入mAudioHwdevs中。
        mAudioHwDevs.add(handle, new AudioHwDevice(handle,name,dev,flags));
        ...
    }

    mDevicesFactoryHal是类AudioFlinger的一个成员变量,在AudioFlinger的构造函数中被初始化。

    AudioFlinger::AudioFlinger()
    {
        ...
        mDevicesFactoryHal = DevicesFactoryHalInterface::create();
        ...
    }

    接下来要关注create函数在哪实现?
    /frameworks/av/media/libaudiohal/DevicesFactoryHalHybrid.cpp

    //static
    sp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create()
    {
        return new DevicesFactoryHalHybrid(); //创建一个DevicesFactoryHalHybrid对象,在这里将调用该类的构造函数
    }
    DevicesFactoryHalHybrid::DevicesFactoryHalHybrid()
        :mLocalFactory(new DevicesFactoryHalLocal()),
        mHidlFactory(
    #ifdef USE_LEGACY_LOCAL_AUDIO_HAL
            nullptr
    #else
            new DevicesFactoryHalHidl()
    #endif
        ){
        
    }

    在该构造函数中,主要对两个成员变量mLocalFactory和mHidlFactory进行了赋值。只不过这两个成员变量都是类的对象。
    mLocalFactory(new DevicesFactoryHalLocal()),首先调用DevicesFactoryHalLocal的无参构造函数,创建一个对象,然后赋值给mLocalFactory;
    mHidlFactory,它的取值取决于宏USE_LEGACY_LOCAL_AUDIO_HAL是否定义。如果该宏没有定义,则调用DevicesFactoryHalHidl的无参构造函数,否则mHidlFactory为空指针。

    分析到这个地方,可以知道mDevicesFactoryHal是类DevicesFactoryHalHybrid类的一个对象,既然是类DevicesFactoryHalHybrid的对象,那么:mDevicesFactoryHal->openDevice(name,&dev),其实就是调用了DevicesFactoryHalHybrid::openDevice。

    status_t DevicesFactoryHalHybrid::openDevice(const char*name, sp<DeviceHalInterface>* device)
    {
        if(mHidlFactory != 0 && strcmp(AUDIO_HARDWARE_MODULE_ID_A2DP, name) != 0)
        {
            return mHidlFactory->openDevice(name, device);
        }
        
        return mLocalFactory->openDevice(name,device);
    }

    到这里,究竟是调用了谁的openDevice函数,就变得非常明朗了。
    这个程序地方分为两种情况:
    1.当mHidlFactory不为NULL,即没有使用旧的audio_hal,并且打开的设备不是AUDIO_HARDWARE_MODULE_ID_A2DP,即播放的声音不走蓝牙通道(蓝牙a2dp不走HIDL)。在这种情况下使用DevicesFactoryHalHidl::openDevice
    2.否则,调用DevicesFacotoryHalLocal::openDevice.

  • 相关阅读:
    <阿里工程师的自我素养>读后感-技术人应该具备的一些基本素质
    Hbase的基本原理(与HIVE的区别、数据结构模型、拓扑结构、水平分区原理、场景)
    大数据技术体系 && NoSQL数据库的基本原理
    软件测试面试经验
    APP非功能测试
    手机APP测试(测试点、测试流程、功能测试)
    性能测试学习之路 (四)jmeter 脚本开发实战(JDBC &JMS &接口脚本 & 轻量级接口自动化测试框架)
    HTML 实战生成一张页面
    前端性能测试(H5性能测试)
    JAVA基础——设计模式之观察者模式
  • 原文地址:https://www.cnblogs.com/-glb/p/14497327.html
Copyright © 2011-2022 走看看