1:FFBM测试
1.1:测试应用界面
由UI内容可知,audio相关的测试项有4个,分别是 speaker测试,已经2个mic到speaker的回环,以及一个耳机mic的回环;
它在ui中的配置是在:vendor/qcom/proprietary/commonsys/fastmmi/res/config/mmi.xml中
<!-- default config for UI mode -->
<modules>
<module name="SPEAKER"
lib_name="mmi_audio.so"
enable="1"
automation="0"
display_name="loudspeaker"
layout="layout_handset.xml"
parameter="type:play;tc:1;volume:50;duration:4;file:/system/etc/mmi/qualsound.wav;"/>
<module name="SPEAKER LOOP"
lib_name="mmi_audio.so"
enable="1"
automation="0"
display_name="audio_loudspeaker_play"
layout="layout_loudspeaker.xml"
parameter="type:loopback;tc:227;volume:30;duration:3;file:/mnt/vendor/persist/FTM_AP/speaker_record.wav;tc_play:1;"/>
<!-- Loopback for headset -->
<module name="HEADSET LOOP"
lib_name="mmi_audio.so"
enable="1"
automation="0"
display_name="audio_headset_loopback"
layout="layout_headset.xml"
parameter="type:loopback;tc:225;volume:45;duration:3;file:/mnt/vendor/persist/FTM_AP/headset_record.wav;tc_play:1;"/>
<!-- BACK MIC -->
<module name="NOISE MIC"
lib_name="mmi_audio.so"
enable="1"
automation="0"
display_name="audio_noise_mic"
layout="layout_primary_mic.xml"
parameter="type:mic;tc:226;volume:45;duration:3;file:/mnt/vendor/persist/FTM_AP/ftm_pcm_record.wav;tc_play:1;"/>
具体FCT相关的内容不做分析,只关注通过UI点击后,给测试命令传递的参数; 即parameter 后的参数,最终使用也是mm-audio-ftm 可执行程序;
1.2:FCT命令mm-audio-ftm
以下是常用的几个测试命令;
#测试扬声器
mm-audio-ftm -c /vendor/etc/ftm_test_config -tc 1 -d 10 -v 60 -file /system/etc/mmi/qualsound.wav
#测试耳机
headset:
left:
mm-audio-ftm -c /vendor/etc/ftm_test_config -tc 3 -d 10 -v 60 -file /system/etc/mmi/qualsound.wav
right:
mm-audio-ftm -c /vendor/etc/ftm_test_config -tc 4 -d 10 -v 60 -file /system/etc/mmi/qualsound.wav
#测试回环
mm-audio-ftm -c /vendor/etc/ftm_test_config -tc 225 -d 10 -v 50
mm-audio-ftm -c /vendor/etc/ftm_test_config -tc 226 -v 20 -d 5
mm-audio-ftm -c /vendor/etc/ftm_test_config -tc 227 -v 20
-c 后跟的参数,是配置文件,指定打开关闭一个通路所执行的配置命令集;
-tc 后跟的参数,是配置文件中标识对应测试项的 id;
-v 后跟的参数,配置测试过程中的音量设置;
-d 后跟的参数,是配置测试延时的时间,以s为单位;
-file 后跟的参数,配置测试过程中使用的音频文件的路径;
1.3:用例配置实例
1.3.1:Speaker
以/vendor/etc/ftm_test_config 中 tc 1 Left Speaker测试用例为例:
tc 1
#Left Speaker
!Playback
Rxdevice:0
enable
RX_CDC_DMA_RX_1 Channels:One
RX_MACRO RX2 MUX:AIF2_PB
RX INT2_1 MIX1 INP0:RX2
AUX_RDAC Switch:1
RX_CDC_DMA_RX_1 Audio Mixer MultiMedia1:1
disable
RX_MACRO RX2 MUX:ZERO
RX INT2_1 MIX1 INP0:ZERO
AUX_RDAC Switch:0
RX_CDC_DMA_RX_1 Audio Mixer MultiMedia1:0
1.3.2:Loop back
以/vendor/etc/ftm_test_config 中 tc 225 Headset loop back测试用例为例:
tc 225
#AMIC2 to HPH_LR AFE loopback
!AfeLoop
Txdevice:31
Rxdevice:30
enable
RX_MACRO RX0 MUX:AIF1_PB
RX_MACRO RX1 MUX:AIF1_PB
RX_CDC_DMA_RX_0 Channels:Two
RX INT0_1 MIX1 INP0:RX0
RX INT1_1 MIX1 INP0:RX1
RX INT0 DEM MUX:CLSH_DSM_OUT
RX INT1 DEM MUX:CLSH_DSM_OUT
RX_COMP1 Switch:1
RX_COMP2 Switch:1
HPHL_RDAC Switch:1
HPHR_RDAC Switch:1
HPHL_COMP Switch:1
HPHR_COMP Switch:1
RX_RX0 Digital Volume:62
RX_RX1 Digital Volume:62
TX DEC0 MUX:SWR_MIC
TX SMIC MUX0:SWR_MIC4
TX_CDC_DMA_TX_3 Channels:One
TX_AIF1_CAP Mixer DEC0:1
ADC2_MIXER Switch:1
ADC2 MUX:INP2
ADC2 Volume:62
RX_CDC_DMA_RX_0_DL_HL Switch:1
RX_CDC_DMA_RX_0 Port Mixer TX_CDC_DMA_TX_3:1
disable
RX_MACRO RX0 MUX:ZERO
RX_MACRO RX1 MUX:ZERO
RX INT0_1 MIX1 INP0:ZERO
RX INT1_1 MIX1 INP0:ZERO
RX INT0 DEM MUX:NORMAL_DSM_OUT
RX INT1 DEM MUX:NORMAL_DSM_OUT
RX_COMP1 Switch:0
RX_COMP2 Switch:0
HPHL_RDAC Switch:0
HPHR_RDAC Switch:0
HPHL_COMP Switch:0
HPHR_COMP Switch:0
RX_RX0 Digital Volume:0
RX_RX1 Digital Volume:0
TX DEC0 MUX:MSM_DMIC
TX SMIC MUX0:ZERO
TX_AIF1_CAP Mixer DEC0:0
ADC2_MIXER Switch:0
ADC2 MUX:ZERO
ADC2 Volume:62
RX_CDC_DMA_RX_0_DL_HL Switch:0
RX_CDC_DMA_RX_0 Port Mixer TX_CDC_DMA_TX_3:0
测试过程是以可执行命令mm-audio-ftm 进入执行的,下面对执行过程的细节进一步分析;
2:mm-audio-ftm分析
文件:
- code/vendor/qcom/proprietary/mm-audio/ftm_audio_main.c
- code/vendor/qcom/proprietary/mm-audio/ftm_audio_dispatch.c
2.1:main函数
(以上面测试命令为例, 其他测试情况忽略,仅分析主要流程)
int main(int argc, char *argv[])
{
//.....
char filename[100], *pfilename = NULL;
int codec = 0, total_test = INT_MAX, result, test_case;
int volume = 0, duration = 3, fl = 300, fh = 4000, count = 0;
int tx_volume = 0, rx_volume = 0;
//.....
#ifdef MSM8960_ALSA
FILE *fp;
FILE *fp_config;
char soundCardInfo[200];
char soundCardName[200];
char config_path[200] = {
0};
g_config_test = 0;
if((fp = fopen("/proc/asound/cards","r")) == NULL) {
printf("Cannot open /proc/asound/cards file to get sound card info\n");
return -1;
} else {
//跳过/proc/asound/cards 声卡name的第一行 获取到 snd card name
if((fgets(soundCardInfo, sizeof(soundCardInfo), fp) == NULL)) {
printf("/proc/asound/cards is empty. Abort\n");
return -1;
}
while((fgets(soundCardInfo, sizeof(soundCardInfo), fp) != NULL)) {
printf("SoundCardInfo %s", soundCardInfo);
sscanf(soundCardInfo, "%s", soundCardName);
printf("\nsoundCardName %s\n", soundCardName);
snprintf(config_path, sizeof(config_path), "%s_%s",
"/vendor/etc/ftm_test_config", soundCardName); //指定的这个config文件就用这个测试
//......
} else if ((fp_config = fopen("/vendor/etc/ftm_test_config","r")) != NULL) {
printf("Use the codec ftm_test_config file\n");
codec = CODEC_CONFIG_SUPPORT;
fclose(fp_config);
fp_config = NULL;
/* use default config file( ftm_test_config) as last resort. */
snprintf(config_path, sizeof(config_path), "/vendor/etc/ftm_test_config");
break;
} else {
//......
}
fclose(fp);
fp = NULL;
}
if (argc == 1) {
//...... 忽略
}else if(argc == 3) {
//...... 忽略
} else if (argc >= 5) {
//有5个参数的通过文件指定的,采用的是这种
count = argc;
fp = NULL;
int i = 1;
test_case = -1;
/* Support only for codecs with config.txt support */
if (codec != CODEC_CONFIG_SUPPORT) {
printf("Command to enter: mm-audio-ftm -tc <tc number>\n");
return -1;
}
while((i + 1) < count) {
if (!strncmp(argv[i], "-tc", 3)) {
i++;
test_case = atoi(argv[i++]);
printf("\n Test case number %d", test_case);
} else if (!strncmp(argv[i], "-c", 2)) {
// "-c 指定了 config文件 路径"
i++;
printf("\n Conf file name %s", argv[i]);
if (!(fp = fopen(argv[i++],"rb"))) {
printf("\n Failed to open file");
return -1;
}
g_config_test = 1;
} else if (!strncmp(argv[i], "-v", 2)) {
// "-v" 配置 音量volume
i++;
volume =