录音问题免不了需要抓取原始的pcm数据分析波形,目前安卓大部分是基于tinyalsa去实现音频相关的接口,所以调试过程中很自然就得走这一步.
默认的MTK源码只include了tinyalsa的接口的so,并未把tinyalsa的命令工具默认编译进版本
源码目录external/tinyalsa下,单编译生成二进制可执行文件out/target/product/k37mv1_64_bsp/system/bin
tinyhostless
tinymix
tinypcminfo
tinycap
tinyplay
各种命令的用法eg.
adb root
adb shell
k37mv1_64_bsp:/ # tinycap
Usage: tinycap [-D card] [-d device] [-c channels] [-r rate] [-b bits] [-p period_size] [-n n_periods] [-T capture time]
card ------ 声卡
device ------ 设备 capture/playback tinycap肯定需要找对应的capture设备
channels ------ 通道数
rate ------ 采样率
bits ------位数
period_size — 单次采样片段大小
n_periods — 采样片段数
capture time — 录音时间
tinycap正式录pcm数据前,首先要先打开mixer配置,不熟悉的前提下,我们可以用逆向方式解决这一难题,即是
我们可以在不录制pcm数据的情况下,执行tinymix
可以看到如下配置状态:
k37mv1_64_bsp:/ # tinymix
Mixer name: 'mt-snd-card'
Number of controls: 89
ctl type num name value
0 ENUM 1 Audio_Amp_R_Switch Off
1 ENUM 1 Audio_Amp_L_Switch Off
2 ENUM 1 Voice_Amp_Switch Off
3 ENUM 1 Speaker_Amp_Switch Off
4 ENUM 1 Headset_Speaker_Amp_Switch Off
5 ENUM 1 Headset_PGAL_GAIN -4Db
6 ENUM 1 Headset_PGAR_GAIN -4Db
7 ENUM 1 Handset_PGA_GAIN 8Db
8 ENUM 1 Lineout_PGAR_GAIN 0Db
9 ENUM 1 Lineout_PGAL_GAIN 0Db
10 ENUM 1 AUD_CLK_BUF_Switch Off
11 ENUM 1 Ext_Speaker_Amp_Switch Off
12 ENUM 1 Receiver_Speaker_Switch Off
13 ENUM 1 Audio_ADC_1_Switch Off
14 ENUM 1 Audio_ADC_2_Switch Off
15 ENUM 1 Audio_ADC_3_Switch Off
16 ENUM 1 Audio_ADC_4_Switch Off
17 ENUM 1 Audio_Preamp1_Switch OPEN
18 ENUM 1 Audio_ADC_1_Sel Preamp
19 ENUM 1 Audio_ADC_2_Sel Preamp
20 ENUM 1 Audio_ADC_3_Sel idle
21 ENUM 1 Audio_ADC_4_Sel idle
22 ENUM 1 Audio_PGA1_Setting 18Db
23 ENUM 1 Audio_PGA2_Setting 18Db
24 ENUM 1 Audio_PGA3_Setting 0Db
25 ENUM 1 Audio_PGA4_Setting 0Db
26 ENUM 1 Audio_MicSource1_Setting ADC1
27 ENUM 1 Audio_MicSource2_Setting ADC1
28 ENUM 1 Audio_MicSource3_Setting ADC1
29 ENUM 1 Audio_MicSource4_Setting ADC1
30 ENUM 1 Audio_MIC1_Mode_Select DCCMODE
31 ENUM 1 Audio_MIC2_Mode_Select DCCMODE
32 ENUM 1 Audio_MIC3_Mode_Select ACCMODE
33 ENUM 1 Audio_MIC4_Mode_Select ACCMODE
34 ENUM 1 Audio_Mic_Power_Mode normal
35 ENUM 1 Audio_Vow_ADC_Func_Switch Off
36 ENUM 1 Audio_Preamp2_Switch OPEN
37 ENUM 1 Audio_Vow_Digital_Func_Switch Off
38 ENUM 1 Audio_Vow_MIC_Type_Select HandsetAMIC
39 INT 1 Audio VOWCFG0 Data 0
40 INT 1 Audio VOWCFG1 Data 0
41 INT 1 Audio VOWCFG2 Data 8995
42 INT 1 Audio VOWCFG3 Data 42856
43 INT 1 Audio VOWCFG4 Data 111
44 INT 1 Audio VOWCFG5 Data 1
45 INT 1 Audio_VOW_State 0
46 ENUM 1 SineTable_DAC_HP Off
47 ENUM 1 DAC_LOOP_DAC_HS Off
48 ENUM 1 DAC_LOOP_DAC_HP Off
49 ENUM 1 Voice_Call_DAC_DAC_HS Off
50 ENUM 1 SineTable_UL2 Off
51 ENUM 1 Pmic_Loopback Off
52 INT 1 Audio HP ImpeDance Setting 5000
53 ENUM 1 Audio_Speaker_class_Switch CLASSAB
54 ENUM 1 Audio_Speaker_PGA_gain 12Db
55 ENUM 1 Audio_Speaker_OC_Falg Off
56 ENUM 1 Audio_Speaker_CurrentSensing Off
57 ENUM 1 Audio_Speaker_CurrentPeakDetector Off
58 INT 1 Audio AUXADC Data -1
59 ENUM 1 Speech_MD_USAGE Off
60 ENUM 1 Audio_Hdmi_SideGen_Switch Off
61 ENUM 1 Audio_i2s0_SideGen_Switch Off
62 ENUM 1 Audio_i2s0_hd_Switch Off
63 ENUM 1 Audio_ExtCodec_EchoRef_Switch Off
64 INT 1 Audio Mrgrx Volume 65536
65 ENUM 1 cmb stub Audio Control CMB_STUB_AIF_3
66 ENUM 1 Audio_I2S0dl1_hd_Switch Off
67 INT 1 Audio IRQ1 CNT 0
68 ENUM 1 deep_buffer_dl_hd_Switch Off
69 INT 1 deep_buffer_irq_cnt 0
70 ENUM 1 dl1bt_memif_select dl1
71 ENUM 1 Audio_FMTX_hd_Switch On
72 ENUM 1 Audio_SineGen_Switch OFF
73 ENUM 1 Audio_SineGen_SampleRate 48K
74 ENUM 1 Audio_SineGen_Amplitude 1/128
75 ENUM 1 Audio_Sidetone_Switch Off
76 ENUM 1 Audio_Mode_Switch Normal_Mode
77 INT 1 Audio HPL Offset 1974
78 INT 1 Audio HPR Offset 1986
79 ENUM 1 Audio_Debug_Setting Off
80 ENUM 1 Audio_Ipoh_Setting Off
81 ENUM 1 Audio_I2S1_Setting Off
82 INT 2 Audio_DL2_DataTransfer -1 -1
83 INT 1 Audio_LowLatency_Debug 0
84 INT 1 Audio_Assign_DRAM 0
85 ENUM 1 Pmic_Anc_Switch ANCON
86 INT 1 Audio FM I2S Volume 65536
87 ENUM 1 fast_dl_hd_Switch Off
88 ENUM 1 I2S low Jitter function Off
随即我们可以先打开录音app再次使用tinymix查看配置变化
k37mv1_64_bsp:/ # tinymix
Mixer name: 'mt-snd-card'
Number of controls: 89
ctl type num name value
0 ENUM 1 Audio_Amp_R_Switch Off
1 ENUM 1 Audio_Amp_L_Switch Off
2 ENUM 1 Voice_Amp_Switch Off
3 ENUM 1 Speaker_Amp_Switch Off
4 ENUM 1 Headset_Speaker_Amp_Switch Off
5 ENUM 1 Headset_PGAL_GAIN -4Db
6 ENUM 1 Headset_PGAR_GAIN -4Db
7 ENUM 1 Handset_PGA_GAIN 8Db
8 ENUM 1 Lineout_PGAR_GAIN 0Db
9 ENUM 1 Lineout_PGAL_GAIN 0Db
10 ENUM 1 AUD_CLK_BUF_Switch On
11 ENUM 1 Ext_Speaker_Amp_Switch Off
12 ENUM 1 Receiver_Speaker_Switch Off
13 ENUM 1 Audio_ADC_1_Switch On
14 ENUM 1 Audio_ADC_2_Switch On
15 ENUM 1 Audio_ADC_3_Switch Off
16 ENUM 1 Audio_ADC_4_Switch Off
17 ENUM 1 Audio_Preamp1_Switch IN_ADC1
18 ENUM 1 Audio_ADC_1_Sel Preamp
19 ENUM 1 Audio_ADC_2_Sel Preamp
20 ENUM 1 Audio_ADC_3_Sel idle
21 ENUM 1 Audio_ADC_4_Sel idle
22 ENUM 1 Audio_PGA1_Setting 18Db
23 ENUM 1 Audio_PGA2_Setting 18Db
24 ENUM 1 Audio_PGA3_Setting 0Db
25 ENUM 1 Audio_PGA4_Setting 0Db
26 ENUM 1 Audio_MicSource1_Setting ADC1
27 ENUM 1 Audio_MicSource2_Setting ADC1
28 ENUM 1 Audio_MicSource3_Setting ADC1
29 ENUM 1 Audio_MicSource4_Setting ADC1
30 ENUM 1 Audio_MIC1_Mode_Select DCCMODE
31 ENUM 1 Audio_MIC2_Mode_Select DCCMODE
32 ENUM 1 Audio_MIC3_Mode_Select ACCMODE
33 ENUM 1 Audio_MIC4_Mode_Select ACCMODE
34 ENUM 1 Audio_Mic_Power_Mode normal
35 ENUM 1 Audio_Vow_ADC_Func_Switch Off
36 ENUM 1 Audio_Preamp2_Switch IN_ADC3
37 ENUM 1 Audio_Vow_Digital_Func_Switch Off
38 ENUM 1 Audio_Vow_MIC_Type_Select HandsetAMIC
39 INT 1 Audio VOWCFG0 Data 0
40 INT 1 Audio VOWCFG1 Data 0
41 INT 1 Audio VOWCFG2 Data 8995
42 INT 1 Audio VOWCFG3 Data 42856
43 INT 1 Audio VOWCFG4 Data 111
44 INT 1 Audio VOWCFG5 Data 1
45 INT 1 Audio_VOW_State 0
46 ENUM 1 SineTable_DAC_HP Off
47 ENUM 1 DAC_LOOP_DAC_HS Off
48 ENUM 1 DAC_LOOP_DAC_HP Off
49 ENUM 1 Voice_Call_DAC_DAC_HS Off
50 ENUM 1 SineTable_UL2 Off
51 ENUM 1 Pmic_Loopback Off
52 INT 1 Audio HP ImpeDance Setting 5000
53 ENUM 1 Audio_Speaker_class_Switch CLASSAB
54 ENUM 1 Audio_Speaker_PGA_gain 12Db
55 ENUM 1 Audio_Speaker_OC_Falg Off
56 ENUM 1 Audio_Speaker_CurrentSensing Off
57 ENUM 1 Audio_Speaker_CurrentPeakDetector Off
58 INT 1 Audio AUXADC Data -1
59 ENUM 1 Speech_MD_USAGE Off
60 ENUM 1 Audio_Hdmi_SideGen_Switch Off
61 ENUM 1 Audio_i2s0_SideGen_Switch Off
62 ENUM 1 Audio_i2s0_hd_Switch Off
63 ENUM 1 Audio_ExtCodec_EchoRef_Switch Off
64 INT 1 Audio Mrgrx Volume 65536
65 ENUM 1 cmb stub Audio Control CMB_STUB_AIF_3
66 ENUM 1 Audio_I2S0dl1_hd_Switch Off
67 INT 1 Audio IRQ1 CNT 0
68 ENUM 1 deep_buffer_dl_hd_Switch Off
69 INT 1 deep_buffer_irq_cnt 0
70 ENUM 1 dl1bt_memif_select dl1
71 ENUM 1 Audio_FMTX_hd_Switch On
72 ENUM 1 Audio_SineGen_Switch OFF
73 ENUM 1 Audio_SineGen_SampleRate 48K
74 ENUM 1 Audio_SineGen_Amplitude 1/128
75 ENUM 1 Audio_Sidetone_Switch Off
76 ENUM 1 Audio_Mode_Switch Normal_Mode
77 INT 1 Audio HPL Offset 1974
78 INT 1 Audio HPR Offset 1986
79 ENUM 1 Audio_Debug_Setting Off
80 ENUM 1 Audio_Ipoh_Setting Off
81 ENUM 1 Audio_I2S1_Setting Off
82 INT 2 Audio_DL2_DataTransfer -1 -1
83 INT 1 Audio_LowLatency_Debug 0
84 INT 1 Audio_Assign_DRAM 0
85 ENUM 1 Pmic_Anc_Switch ANCON
86 INT 1 Audio FM I2S Volume 65536
87 ENUM 1 fast_dl_hd_Switch Off
88 ENUM 1 I2S low Jitter function Off
k37mv1_64_bsp:/ #
对比发现差异的配置就只有几项,于是这便为我们tinycap录制pcm数据打好了基础.
adb下设备执行tinymix的通路设置
tinymix Audio_ADC_1_Switch On
tinymix Audio_ADC_2_Switch On
tinymix Audio_Preamp1_Switch IN_ADC1
tinymix Audio_Preamp2_Switch IN_ADC3
最后执行即可抓取原始的录音pcm数据
tinycap /sdcard/ -D 0 -d 1 -c 2 -r 48000 -b 16