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.