come from : https://blog.csdn.net/jinchengzhou/article/details/82796888
最近在调试安卓系统的alsa驱动,一开始搞不清楚tinymix要怎么用,今天终于搞清楚了,其实也很简单:
先打tinymix,首先系统要有安装好,如果没有的话,需要编译android/external/tinyalsa目录,就会生成1个so和4个可执行文件。
现在重点记录怎样用tinymix,
-
# tinymix
-
Mixer name: 'audiocodec'
-
Number of controls: 12
-
ctl type num name value
-
0 INT 1 MIC1_G boost stage output mixer control 3
-
1 INT 1 MIC2_G boost stage output mixer control 3
-
2 INT 1 LINEIN_G boost stage output mixer control 3
-
3 INT 1 MIC1 boost AMP gain control 4
-
4 INT 1 MIC2 boost AMP gain control 4
-
5 INT 1 Lineout volume control 31
-
6 INT 1 ADC input gain ctrl 3
-
7 BOOL 1 Audio linein in On
-
8 BOOL 1 Audio lineout Off
-
9 BOOL 1 Audio adda drc Off
-
10 BOOL 1 Audio adda loop Off
-
11 ENUM 1 audio capture mode linein
在终端输入tinymix,就会显示这个表
那么它里面的内容是什么意思呢?
首先我们要知道,一个mixer通常有多个controler,像这个,里面有12个,然后就分别列出每一个controller的信息
首先看第一个:它的编号为0,类型是int型,它目前的值是3,它是用来控制mic1的放大倍数的
同理,第二个也是控制mic2的放大倍数
然后看第7个是一个bool型,也就是只有开关,
那么我如果像改变某一项的时候,要怎么设置呢?
方法是:
-
# tinymix 7
-
Audio linein in: On
这样在后面跟上控制器的编号,就会把控制器的当前状态显示出来,如果想改变它,就输入:
-
# tinymix 7 0
-
root@dolphin-fvd-p1:/ # tinymix 7
-
Audio linein in: Off
这样就通过命令设置过去了
然后看最后一个是enum类型的,那么问题来了,我不知道enum的名字,改如何设置呢,其实它有提示:
-
# tinymix 11
-
audio capture mode: main mic mic1_2 >linein
它会列出所有模式,然后当前的模式前面会有一个小箭头标记
然后如果要改变就这样操作:
-
root@dolphin-fvd-p1:/ # tinymix 11 "main mic"
-
root@dolphin-fvd-p1:/ # tinymix 11
-
audio capture mode: >main mic mic1_2 linein
补充一下:
通常只是codec有很多的controler,hdmi和spdif的控制器分布只有一个,要设置别的卡要加上-D参数
-
root@dolphin-fvd-p1:/ # tinymix -D 1 这个是HDMI通道
-
Mixer name: 'sndhdmi'
-
Number of controls: 1
-
ctl type num name value
-
0 ENUM 1 hdmi audio format Function pcm
-
root@dolphin-fvd-p1:/ # tinymix -D 2 这个是spdif通道
-
Mixer name: 'sndspdif'
-
Number of controls: 1
-
ctl type num name value
-
0 ENUM 1 spdif audio format Function pcm
-
root@dolphin-fvd-p1:/ # tinymix -D 2 0 查看一下有哪些格式可以设置
-
spdif audio format Function: null >pcm DTS
-
root@dolphin-fvd-p1:/ # tinymix -D 1 0 查看可以设置的格式
-
hdmi audio format Function: null >pcm AC3 MPEG1 MP3 MPEG2 AAC DTS ATRAC ONE_BIT_AUDIO DOLBY_DIGITAL_PLUS DTS_HD MAT WMAPRO
实例:
# tinymix -D 1
Mixer name: 'imxnull-audio'
Number of controls: 28
ctl type num name value
0 INT 2 PCM Playback Volume 155 155
1 INT 2 Capture Volume 14 14
2 INT 1 Capture Attenuate Switch (-6dB) 0
3 BOOL 1 Capture ZC Switch On
4 INT 2 Headphone Playback Volume 103 103
5 BOOL 1 Headphone Playback ZC Switch On
6 INT 1 Mic Volume 1
7 BOOL 1 Bass Enable Off
8 INT 1 Bass Filter Feq 1
9 INT 1 Bass Volume 58
10 INT 1 Bass Level 96
11 INT 1 Surround Width 4
12 INT 1 Main Channel Volume 100
13 INT 1 Mixer Channel Volume 0
14 BOOL 1 AVC Enable Off
15 BOOL 1 AVC Hard Limit Off
16 INT 1 AVC Max Gain 1
17 INT 1 AVC Threshold (-dB) 12
18 BOOL 1 DAP_MIXER Mixer Channel Off
19 ENUM 1 I2S_OUT ADC
20 ENUM 1 DAC_IN I2S_IN
21 ENUM 1 MIX_MUX ADC
22 ENUM 1 DAP_IN ADC
23 ENUM 1 Headphone Mux DAC
24 ENUM 1 Capture Mux MIC_IN
25 ENUM 1 Jack Function on
26 ENUM 1 Speaker Function off
27 ENUM 1 Line In Function off
# tinymix -D 1 6 0
由于ALSA架构太过于庞大,对于嵌入式设备而言很多功能用不到,且会增加功耗,
所以Android采用了精简后的tinyalsa,tinyalsa相关的底层调试工具
常用的有tinymix,tinyplay,tinycap,下面分别介绍他们的使用方法。
1.tinymix
tinymix可以查看系统的音频控件,可直接执行tinymix进行查看。tinymix更多的作用的是用来手动设置控件的值,控件可通过tinymix查看,或者通过mixer_paths.xml进行查看。下面以手动设置speaker相关控件为例进行说明tinymix的使用方法:
mixer_paths.xml文件中speaker相关控件如下:
<path name="speaker">
<ctl name="RX3 MIX1 INP1" value="RX1" />
<ctl name="LINE_OUT" value="Switch" />
<ctl name="SPK" value="Switch" />
</path>
下面以手动设置speaker相关控件为例进行说明tinymix的使用方法,如下,第一个参数为控件名,第二个参数为控件值
tinymix "RX3 MIX1 INP1" "RX1"
tinymix "LINE_OUT" "Switch"
tinymix "SPK" "Switch"
tinymix加控件名可以查看控件的值,如想查看"LINE_OUT"的值,可执行tinymix "LINE_OUT"
2.tinyplay
可以使用tinyplay直接进行播放wav格式文件,在播放之前需要先使用tinymix进行相关控件的设置,下面以speaker为例进行说明,注意最后一行需要加上,代表打开I2S的播放控件。
tinymix "RX3 MIX1 INP1" "RX1"
tinymix "LINE_OUT" "Switch"
tinymix "SPK" "Switch"
tinymix "PRI_MI2S_RX Audio Mixer MultiMedia5" "1"
设置好上面控件后,执行tinypaly xxx.wav即可进行音频的播放
3.tinycap
tinycap是用来录音的,使用之前也需要先设置录音相关的控件,以主mix为例进行过说明,注意最后一行是打开I2S的录音控件
tinymix "ADC1 Volume" "6"
tinymix "DEC1 MUX" "ADC1"
tinymix "IIR1 INP1 MUX" "DEC1"
tinymix "MultiMedia1 Mixer TERT_MI2S_TX" "1"
设置好上面控件后,执行tinycap xxx.wav即可以将音频录制到xxx.wav中,Ctrl+C停止录音。
注意,最好使用linux进行测试,使用windows的话,可能没法正常录音。
相关概念:
Sample:样本长度,音频数据最基本的单位,常见的有8位和16位。
Channel:声道数,分为单声道mono和立体声stereo。
Frame:帧,构成一个完整的声音单元,Frame = Sample * channel。
Rate:又称Sample rate,采样率,即每秒的采样次数,针对帧而言。
Interleaved:交错模式,一种音频数据的记录方式,在交错模式下,数据以连续桢的形式存放,即首先记录完桢1的左声道样本和右声道样本(假设为立体声),再开始桢2的记录。而在非交错模式下,首先记录的是一个周期内所有桢的左声道样本,再记录右声道样本,数据是以连续通道的方式存储。多数情况下使用交错模式。
Period size:周期,每次硬件中断处理音频数据的帧数,对于音频设备的数据读写,以此为单位。
Buffer size:数据缓冲区大小,这里特指runtime的buffer size,而不是snd_pcm_hardware定义的buffer_bytes_max。一般来说Buffer size =period_size * period_count,period_count相当于处理完一个buffer数据所需的硬件中断次数。