[Linux Audio Driver] 声卡与XML匹配流程

本文详细解析了QCOM内部定义的音频Usecase数据结构,包括其在HAL层的作用、具体应用场景如低延时播放、压缩卸载等,以及如何通过声卡名和XML配置确定输出方案。

0. usecase

usecase是qcom内部定义的一个数据结构,位于hal层,用作处理处理内部声卡逻辑和输出方案。

代码路径: LA.UM.5.6\hardware\qcom\audio\hal\audio_hw.h

/* These are the supported use cases by the hardware.
 * Each usecase is mapped to a specific PCM device.
 * Refer to pcm_device_table[].
 */
enum {
    USECASE_INVALID = -1,
    /* Playback usecases */
    USECASE_AUDIO_PLAYBACK_DEEP_BUFFER = 0,
    USECASE_AUDIO_PLAYBACK_LOW_LATENCY,
    USECASE_AUDIO_PLAYBACK_MULTI_CH,
    USECASE_AUDIO_PLAYBACK_OFFLOAD,
    USECASE_AUDIO_PLAYBACK_OFFLOAD2,
    USECASE_AUDIO_PLAYBACK_OFFLOAD3,
    USECASE_AUDIO_PLAYBACK_OFFLOAD4,
    USECASE_AUDIO_PLAYBACK_OFFLOAD5,
    USECASE_AUDIO_PLAYBACK_OFFLOAD6,
    USECASE_AUDIO_PLAYBACK_OFFLOAD7,
    USECASE_AUDIO_PLAYBACK_OFFLOAD8,
    USECASE_AUDIO_PLAYBACK_OFFLOAD9,
    USECASE_AUDIO_PLAYBACK_ULL,

    /* FM usecase */
    USECASE_AUDIO_PLAYBACK_FM,

    /* HFP Use case*/
    USECASE_AUDIO_HFP_SCO,
    USECASE_AUDIO_HFP_SCO_WB,

    /* Capture usecases */
    USECASE_AUDIO_RECORD,
    USECASE_AUDIO_RECORD_COMPRESS,
    USECASE_AUDIO_RECORD_LOW_LATENCY,
    USECASE_AUDIO_RECORD_FM_VIRTUAL,

    /* Voice usecase */
    USECASE_VOICE_CALL,

    /* Voice extension usecases */
    USECASE_VOICE2_CALL,
    USECASE_VOLTE_CALL,
    USECASE_QCHAT_CALL,
    USECASE_VOWLAN_CALL,
    USECASE_VOICEMMODE1_CALL,
    USECASE_VOICEMMODE2_CALL,
    USECASE_COMPRESS_VOIP_CALL,

    USECASE_INCALL_REC_UPLINK,
    USECASE_INCALL_REC_DOWNLINK,
    USECASE_INCALL_REC_UPLINK_AND_DOWNLINK,
    USECASE_INCALL_REC_UPLINK_COMPRESS,
    USECASE_INCALL_REC_DOWNLINK_COMPRESS,
    USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS,

    USECASE_INCALL_MUSIC_UPLINK,
    USECASE_INCALL_MUSIC_UPLINK2,

    USECASE_AUDIO_SPKR_CALIB_RX,
    USECASE_AUDIO_SPKR_CALIB_TX,

    USECASE_AUDIO_PLAYBACK_AFE_PROXY,
    USECASE_AUDIO_RECORD_AFE_PROXY,

    AUDIO_USECASE_MAX
};

usecase 通俗表示音频场景,对应着音频前端,比如:

low_latency:按键音、触摸音、游戏背景音等低延时的放音场景

deep_buffer:音乐、视频等对时延要求不高的放音场景

compress_offload:mp3、flac、aac等格式的音源播放场景,这种音源不需要软件解码,直接把数据送到硬件解码器(ADSP),由硬件解码器(ADSP)进行解码

record:普通录音场景

record_low_latency:低延时的录音场景

voice_call:语音通话场景

voip_call:网络通话场景

但是具体的输出方案与声卡中的mixer_path_xxx.xml相关。

1. platform.c

下面说下如何找到这个XML (以MSM8953、Android10为例子)

首先进入shell,然后用命令cat /proc/asound/cards找到声卡名msm8953-snd-card-mtp。

在这里插入图片描述

然后进入hardware下面找到platform.c的android.mk文件,看具体使用哪个,(此处备注,platform.c的位置不一定在hardware下面,一方面可以借鉴高通音频bring up的文档来看,
另一方面也可以直接grep “speaker”,也可以找到platform.c的位置)

代码路径:LA.UM.8.6.2\hardware\qcom\audio\hal

在这里插入图片描述

我们进入这个Android.mk文件看看。

在这里插入图片描述
然后我们需要知道TARGET_BOARD_PLATFORM这个定义的是啥,一般来说在device目录下面查找。

~/android10/LA.UM.8.6.2$ grep -nr "TARGET_BOARD_PLATFORM" ./device/

在这里插入图片描述

由于我们预先知道了lunch项是msm8953_64,所以此处我们知道了
ARGET_BOARD_PLATFORM的值就是msm8953,

那我们回过头来看这个android.mk文件,发现上面那段ifneq的代码根本不走,我们看下面的。

在这里插入图片描述

filter可以过滤掉TARGET_BOARD_PLATFORM之外的东西,然后ifneq
再判断是不是msm8953,这里意思就是Filter把前面一堆东西除了msm8953都过滤了,然后这里再判断msm8953和TARGET_BOARD_PLATFORM是不是等价的,然后就走后面的代码。

这里我们知道了AUDIO_PLATFORM 就是msm8916,于是我们就知道platform.c的准确位置:

LA.UM.8.6.2\hardware\qcom\audio\hal\msm8916\platform.c

我们进入platform.c,搜索刚才的声卡名:msm8953-snd-card-mtp,找到了如下的
代码。

在这里插入图片描述

2. MIXER_XML_PATH_MTP

MIXER_XML_PATH_MTP就是我们想要知道的XML名字,这玩意是个宏。

在这里插入图片描述

LINUX_ENABLED这个宏并没有开,所以MIXER_XML_PATH_MTP就是
/vendor/etc/mixer_paths_mtp.xml

在这里插入图片描述
再次回到这个代码,strncmp函数将声卡名与msm8953-snd-card-mtp进行对照,发现相等,函数返回0;然后把 “/vendor/etc/mixer_paths_mtp.xml”字符串赋值给mxier_xml_path
这个是char型的数组。

在这里插入图片描述

static void query_platform(const char *snd_card_name, char *mixer_xml_path)

在这里插入图片描述

然后我们看一下这个函数调用的地方,可以看到这个函数的目的就是根据声卡名,找到对应匹配的XML。

3 参考链接

  1. https://blog.youkuaiyun.com/azloong/article/details/79383323

4. 作者注

/******
@article{Linux Audio Driver,
Author = { 1byte ≠ 8bit},
Year = { 2020},
}
******/
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值