Android AudioFlinger加载HAL层流程

一、前提

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的设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值