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.

  • 相关阅读:
    【转】如何将qlv格式的腾讯视频转换为mp4格式
    【转】qlv文件如何转换成mp4 怎样把下载好的qlv格式视频转换成MP4格式
    PCIe事务层包TLP Header详解
    PCIeのType0与Type1型配置请求与BAR(基地址寄存器)
    PCIeの数据链路层与物理层详解
    PCIe事务层の详解(一)
    PCIe基础篇(二)、协议详解
    PCIe基础篇(一)、基础知识扫盲
    UDP千兆光通信(一)、整体认知与概述
    Xilinx源语-------FDRE
  • 原文地址:https://www.cnblogs.com/-glb/p/14497327.html
Copyright © 2011-2022 走看看