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 参考链接
- https://blog.youkuaiyun.com/azloong/article/details/79383323
4. 作者注
/******
@article{Linux Audio Driver,
Author = { 1byte ≠ 8bit},
Year = { 2020},
}
******/
QCOM音频Usecase详解
本文详细解析了QCOM内部定义的音频Usecase数据结构,包括其在HAL层的作用、具体应用场景如低延时播放、压缩卸载等,以及如何通过声卡名和XML配置确定输出方案。
2739





