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.

 

posted @ 2021-03-07 23:18  一代枭雄  阅读(438)  评论(0编辑  收藏  举报