调用loadHwMoudle_l不止这一个地方,也不止这三种设备,可能还存在其他的,一般通用支持的就三种,自身设备,蓝牙,usb音频。
1612 // loadHwModule_l() must be called with AudioFlinger::mLock held1613 audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)1614 {1615 for (size_t i = 0; i < mAudioHwDevs.size(); i++) {1616 if (strncmp(mAudioHwDevs.valueAt(i)->moduleName(), name, strlen(name)) == 0) {1617 ALOGW("loadHwModule() module %s already loaded", name);1618 return mAudioHwDevs.keyAt(i);1619 }1620 }16211622 audio_hw_device_t *dev;16231624 int rc = load_audio_interface(name, &dev); ... } 141 static int load_audio_interface(const char *if_name, audio_hw_device_t **dev) 142 { 143 const hw_module_t *mod; 144 int rc; 145 146 rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod); 147 ALOGE_IF(rc, "%s couldn't load audio hw module %s.%s (%s)", __func__, 148 AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc)); 149 if (rc) { 150 goto out; 151 } 152 rc = audio_hw_device_open(mod, dev); 153 ALOGE_IF(rc, "%s couldn't open audio hw device in %s.%s (%s)", __func__, 154 AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc)); 155 if (rc) { 156 goto out; 157 } 158 if ((*dev)->common.version < AUDIO_DEVICE_API_VERSION_MIN) { 159 ALOGE("%s wrong audio hw device version %04x", __func__, (*dev)->common.version); 160 rc = BAD_VALUE; 161 goto out; 162 } 163 return 0; 164 165 out: 166 *dev = NULL; 167 return rc; 168 }通过hw_get_module_by_class接口,Audio Flinger就能保存多个音频设备了,供audio policy service使用了。后面,再具体看看蓝牙A2DP(audio_hw_device)的实现细节。
新闻热点
疑难解答