【Qualcomm音频】如何动态兼容多套音频参数文件?

1. 了解下音效参数组成

a.  音频路由配置文件

mixer_paths_xxx_platform.xml

b. 音效数据库文件

Bluetooth_cal.acdb
General_cal.acdb 
Global_cal.acdb 
Handset_cal.acdb 
Hdmi_cal.acdb
Headset_cal.acdb 
Speaker_cal.acdb 
workspaceFile.qwsp

2. 如何兼容音频路由配置文件?

代码路径:hardware/qcom/audio/hal/msm8916/platform.c

#define MIXER_XML_PATH "/system/etc/mixer_paths.xml"
#define MIXER_XML_PATH_MTP "/system/etc/mixer_paths_mtp.xml"
#define MIXER_XML_PATH_SBC "/system/etc/mixer_paths_sbc.xml"
#define MIXER_XML_PATH_MSM8909_PM8916 "/system/etc/mixer_paths_msm8909_pm8916.xml"
#define MIXER_XML_PATH_QRD_SKUH "/system/etc/mixer_paths_qrd_skuh.xml"
#define MIXER_XML_PATH_QRD_SKUI "/system/etc/mixer_paths_qrd_skui.xml"
#define MIXER_XML_PATH_QRD_SKUHF "/system/etc/mixer_paths_qrd_skuhf.xml"
#define MIXER_XML_PATH_SKUK "/system/etc/mixer_paths_skuk.xml"
#define MIXER_XML_PATH_SKUA "/system/etc/mixer_paths_skua.xml"
#define MIXER_XML_PATH_SKUC "/system/etc/mixer_paths_skuc.xml"
#define MIXER_XML_PATH_SKUE "/system/etc/mixer_paths_skue.xml"
#define MIXER_XML_PATH_SKUL "/system/etc/mixer_paths_skul.xml"
#define MIXER_XML_PATH_SKUM "/system/etc/mixer_paths_qrd_skum.xml"
#define MIXER_XML_PATH_SKU1 "/system/etc/mixer_paths_qrd_sku1.xml"
#define MIXER_XML_PATH_SKU2 "/system/etc/mixer_paths_qrd_sku2.xml"
#define MIXER_XML_PATH_SKUN_CAJON "/system/etc/mixer_paths_qrd_skun_cajon.xml"
#define MIXER_XML_PATH_SKU3 "/system/etc/mixer_paths_qrd_sku3.xml"
#define MIXER_XML_PATH_AUXPCM "/system/etc/mixer_paths_auxpcm.xml"
#define MIXER_XML_PATH_AUXPCM "/system/etc/mixer_paths_auxpcm.xml"
#define MIXER_XML_PATH_I2S "/system/etc/mixer_paths_i2s.xml"
#define MIXER_XML_PATH_WCD9306 "/system/etc/mixer_paths_wcd9306.xml"
#define MIXER_XML_PATH_WCD9330 "/system/etc/mixer_paths_wcd9330.xml"
#define MIXER_XML_PATH_WCD9335 "/system/etc/mixer_paths_wcd9335.xml"
#define MIXER_XML_PATH_WCD9326 "/system/etc/mixer_paths_wcd9326.xml"
#define MIXER_XML_PATH_SKUN "/system/etc/mixer_paths_qrd_skun.xml"
#define PLATFORM_INFO_XML_PATH      "/system/etc/audio_platform_info.xml"
#define PLATFORM_INFO_XML_PATH_EXTCODEC  "/system/etc/audio_platform_info_extcodec.xml"

static void query_platform(const char *snd_card_name,
                                      char *mixer_xml_path)
{
    if (!strncmp(snd_card_name, "msm8x16-snd-card-mtp",
                 sizeof("msm8x16-snd-card-mtp"))) {
        strlcpy(mixer_xml_path, MIXER_XML_PATH_MTP,
                sizeof(MIXER_XML_PATH_MTP));

        msm_device_to_be_id = msm_device_to_be_id_internal_codec;
        msm_be_id_array_len  =
            sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);

    } else if (!strncmp(snd_card_name, "msm8x16-snd-card-sbc",
                 sizeof("msm8x16-snd-card-sbc"))) {
        strlcpy(mixer_xml_path, MIXER_XML_PATH_SBC,
                sizeof(mixer_xml_path));

        msm_device_to_be_id = msm_device_to_be_id_internal_codec;
        msm_be_id_array_len  =
            sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
//......
};

3. 如何兼容音效数据库文件

acdb文件加载最初也是从hardware/qcom/audio/hal/msm8916/platform.c开始的,只不过后面会调用到vendor/qcom/proprietary/mm-audio/audio-acdb-util/acdb-loader/src/family-b/acdb-loader.c

具体的代码流程为:

platform_init->acdb_loader_init_v2(调用acdb加载的库文件)--->acdb_load_files(加载acdb)

-->get_files_from_properties
//通过属性区分要选择的acdb文件

-->get_files_from_device_tree
//通过device tree配置信息区分要选择的acdb文件

仔细阅读该函数,可以知道其检索流程为:

    Line 627:     LOGE("kjc>>>acdb-loader: get_files_from_device_tree enter\n");
    Line 649:     LOGE("kjc>>>acdb-loader: get_files_from_device_tree /etc/acdbdata\n");
    Line 665:     LOGE("kjc>>>acdb-loader: get_files_from_device_tree /etc/acdbdata/QRD/msm8953-sku3-snd-card\n");
    Line 679:     LOGE("kjc>>>acdb-loader: get_files_from_device_tree /etc/acdbdata/QRD\n");
    Line 695:     LOGE("kjc>>>acdb-loader: get_files_from_device_tree /etc/acdbdata/MTP/msm8953-sku3-snd-card\n");
    Line 711:     LOGE("kjc>>>acdb-loader: get_files_from_device_tree /etc/acdbdata/MTP\n");
    Line 725:     LOGE("kjc>>>acdb-loader: get_files_from_device_tree /etc\n");

以8953平台代码为例,其:
(1)声卡名称为:snd_card_name即msm8953-sku3-snd-card
(2)board_type即QRD
在检索在以下路径有acdb文件
/*
* /etc/acdbdata/QRD/*.acdb
* /etc/acdbdata/MTP/*.acdb
* /etc/acdbdata/MTP/msm8953-tasha-snd-card/*.acdb
*/
根据以上检索流程,因此使用了以下路径信息中的acdb文件。
/etc/acdbdata/QRD/*.acdb

4. 综述以及延伸

从上述两种参数的兼容来看,声卡名称的差异直接导致了参数加载的差异,这也就是动态兼容音效参数的关键逻辑。

那么如何设置不同的声卡名称呢?

a. 硬件版本号存在差异,选择不同的声卡名配置

b. lunch项区分

发布了52 篇原创文章 · 获赞 41 · 访问量 6105

猜你喜欢

转载自blog.csdn.net/crow_ch/article/details/103886156