一、前提
Audio HAL层最终以.so的方式为Android所用,那这个.so的库如何被AudioFlinger所使用?
二、Audio Hardware HAL加载
(1)AudioFlinger
AudioFlinger加载HAL层:
static int load_audio_interface(const char *if_name, const hw_module_t **mod,
audio_hw_device_t **dev)
{
int rc;
/* 这里加载的是音频动态库,如audio.primary.msm8916.so,如何加载会独立体现 */
rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, mod);
if (rc)
goto out;
//加载好的动态库模块必有个open方法,调用open方法打开音频设备模块
rc = audio_hw_device_open(*mod, dev);
LOGE_IF(rc, "couldn't open audio hw device in %s.%s (%s)",
AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));
if (rc)
goto out;
return 0;
out:
*mod = NULL;
*dev = NULL;
return rc;
}
audio_interface:
/* hw_get_module_by_class需要根据这些字符串找到相关的音频模块库 */
static const char *audio_interfaces[] = {
"primary", //指本机中的codec
"a2dp", //a2dp设备,蓝牙高保真音频
"usb", //usb-audio设备
};
AudioFlinger::onFirstRef:
void AudioFlinger::onFirstRef()
{
int rc = 0;
Mutex::Autolock _l(mLock);
/* TODO: move all this work into an Init() function */
mHardwareStatus = AUDIO_HW_IDLE;
//打开audio_interfaces数组定义的所有音频设备
for (size_t i = 0; i < ARRAY_SIZE(audio_interfaces); i++) {
const hw_module_t *mod;
audio_hw_device_t *dev;
rc = load_audio_interface(audio_interfaces[i], &mod, &dev);
if (rc)
continue;
LOGI("Loaded %s audio interface from %s (%s)", audio_interfaces[i],
mod->name, mod->id);
mAudioHwDevs.push(dev); //mAudioHwDevs是一个Vector,存储已打开的audio hw devices
if (!mPrimaryHardwareDev) {
mPrimaryHardwareDev = dev;
LOGI("Using '%s' (%s.%s) as the primary audio interface",
mod->name, mod->id, audio_interfaces[i]);
}
}
mHardwareStatus = AUDIO_HW_INIT;
if (!mPrimaryHardwareDev || mAudioHwDevs.size() == 0) {
LOGE("Primary audio interface not found");
return;
}
//对audio hw devices进行一些初始化,如mode、master volume的设置