RK3288_Android7.1基於tinyalsa的音頻調試說明

1、PCM

脈衝編碼調製(PCM)是一種用於數字表示採樣模擬信號的方法。它是數字音頻在計算機、光盤、數字電話和其他數字音頻應用中的標準形式。在PCM流中,模擬信號的振幅以均勻的間隔進行有規律的採樣,並在數字步長的範圍內將每個採樣量子化到最接近的值。線性脈碼調製(LPCM)是一種特定類型的PCM,其量化電平是線性均勻的。這與PCM編碼量化水平不同振幅的函數(如 A-law算法或μ-law算法)。儘管PCM是一個更通用的術語,但它通常用於描述被編碼爲LPCM的數據。

pcm設備,通過閱讀tinyalsa的代碼和查看Android下的音頻設備節點,可知在Android中一個pcm設備最多可有一個mixer設備"/dev/snd/controlC%u"(一般是controlC0)和32個/dev/snd/pcmC%uD%uc(一般是pcmC0D0c)、 /dev/snd/pcmC%uD%u%p(一般是pcmC0D0p), pcm設備中的C代表card,D代表device,c代表capture,p代表playback。
當我們新增一個pcm聲卡C的值會+1,D還是從0開始,可能只有c(pcmC1D0c 例如麥克風),可能只有p(pcmC1D0p 例如音響),可能同時存在c和p(pcmC1D0c pcmC1D0p )。

rk3288:/ # ls -l dev/snd/                                                      
total 0
crw-rw---- 1 system audio 116,   2 1970-01-01 00:00 controlC0
crw-rw---- 1 system audio 116,  10 1970-01-01 00:00 controlC1
crw-rw---- 1 system audio 116,   4 1970-01-01 00:00 pcmC0D0c
crw-rw---- 1 system audio 116,   3 1970-01-01 00:00 pcmC0D0p
crw-rw---- 1 system audio 116,   6 1970-01-01 00:00 pcmC0D1c
crw-rw---- 1 system audio 116,   5 1970-01-01 00:00 pcmC0D1p
crw-rw---- 1 system audio 116,   8 1970-01-01 00:00 pcmC0D2c
crw-rw---- 1 system audio 116,   7 1970-01-01 00:00 pcmC0D2p
crw-rw---- 1 system audio 116,   9 1970-01-01 00:00 pcmC0D3p
crw-rw---- 1 system audio 116,  11 1970-01-01 00:00 pcmC1D0p
crw-rw---- 1 system audio 116,  33 1970-01-01 00:00 timer

2、ALSA
目前Linux中主流的音頻體系結構是ALSA(Advanced Linux Sound Architecture),ALSA在內核驅動層提供了alsa-driver,在應用層提供了alsa-lib,應用程序只需要調用alsa-lib提供的API就可以完成對底層硬件的操作。但是Android中沒有使用標準的ALSA,而是一個ALSA的簡化版叫做tinyalsa。Android中使用tinyalsa控制管理所有模式的音頻通路,我們也可以使用tinyalsa提供的工具進行查看、調試。

3、tinyalsa的對外提供的頭文件是"asoundlib.h",提供最基礎的pcm和mixer操作。實現文件爲pcm.c(實現pcm api)和mixer.c(實現mixer api)。根據asoundlib.h編寫了四個小工具tinypcminfo tinyplay tinycap tinymix,這四個小工具作爲系統命令存放在系統中,可以很方便的使用。

代碼目錄:external/tinyalsa/

tinypcminfo的實現文件tinypcminfo.c (查看pcm設備的功能和信息)
tinyplay的實現文件tinyplay.c(使用pcm設備播放wav格式的音頻文件)
tinycap的實現文件tinycap.c(使用pcm設備採集pcm格式的碼流,並保存爲wav格式的文件)
tinymix的實現文件tinymix.c(對pcm設備的控制,包括音量調節、設備切換等)

這幾個命令使用時可以先使用tinypcminfo查看pcm設備的功能和信息,否則當我們使用其他三個命令時使用了不合理的配置參數會出現parameter invalid的錯誤。

3.1編譯tinyalsa命令:
Android很多默認是沒有編譯出tinyplay,tinycap,tinymix,tinypcminfo的,需要手動局部編譯,編譯出來文件,push到系統system/bin/目錄

mmm external/tinyalsa/ 

3.2編譯tinyalsa後生成四個小工具:

tinymix  
tinyplay  
tinycap  
tinypcminfo

tinypcminfo 用於查看pcm通道相關的信息 (tinypcminfo -D /proc/asound/cards)
tinymix 可以得到音頻通路相關的各項配置參數。也可以通過添加參數修改其中的配置
tinyplay是一個簡易的音樂播放器,一般用於播放測試。
tinycap是一個簡易的錄音軟件,一般用於錄音測試。

4、說一下四個小工具(tinypcminfo tinyplay tinycap tinymix)的使用【以下都是在rk3288 Android7.1 kernel4.4平臺下的操作】

4.1 tinypcminfo

tinypcminfo用於查看pcm通道的相關信息。

rk3288:/ # tinypcminfo -D /proc/asound/cards  
Info for card 0, device 0:

PCM out:
      Access:   0x000009
   Format[0]:   0x000045
   Format[1]:   00000000
 Format Name:   S8, S16_LE, S24_LE
   Subformat:   0x000001
        Rate:   min=8000Hz      max=96000Hz
    Channels:   min=2           max=2
 Sample bits:   min=8           max=32
 Period size:   min=32          max=131072
Period count:   min=2           max=8192

PCM in:
      Access:   0x000009
   Format[0]:   0x000045
   Format[1]:   00000000
 Format Name:   S8, S16_LE, S24_LE
   Subformat:   0x000001
        Rate:   min=8000Hz      max=96000Hz
    Channels:   min=2           max=2
 Sample bits:   min=8           max=32
 Period size:   min=32          max=131072
Period count:   min=2           max=8192

從上面獲得的信息中可以知道PCM的採樣率,通道個數,採樣點數等信息。

其中 –D 後邊跟的參數爲聲卡文件,一般位於/proc/asound/cards。

查看當前聲卡設備可以使用cat /proc/asound/cards

rk3288:/ # cat /proc/asound/cards                                              
 0 [realtekrt5651co]: realtekrt5651co - realtekrt5651codec_hdmiin
                      realtekrt5651codec_hdmiin
 1 [SPDIF          ]: SPDIF - SPDIF
                      SPDIF

4.2 tinymix
直接輸入tinymix可以得到音頻通路相關的各項配置參數。也可以使用tinymix通過添加參數修改其中的配置,如希望提高ADC Capture Volume值到110,輸入tinymix 9 110即可。

rk3288:/ # tinymix                                                             
Mixer name: 'realtekrt5651codec_hdmiin'
Number of controls: 93
ctl     type    num     name                                     value
0       INT     2       HP Playback Volume                       31 31
1       INT     2       OUT Playback Volume                      24 24
2       BOOL    2       DAC2 Playback Switch                     On On
3       INT     2       DAC1 Playback Volume                     175 175
4       INT     2       Mono DAC Playback Volume                 175 175
5       INT     1       IN1 Boost                                0
6       INT     1       IN2 Boost                                0
7       INT     2       IN Capture Volume                        23 23
8       BOOL    2       ADC Capture Switch                       On On
9       INT     2       ADC Capture Volume                       47 47
10      INT     2       Mono ADC Capture Volume                  47 47
11      INT     2       ADC Boost Gain                           0 0
12      ENUM    1       RT5651 ASRC Switch                       Enable
13      BOOL    1       IF1 ASRC Switch                          Off
14      BOOL    1       IF2 ASRC Switch                          On
15      BOOL    1       DMIC ASRC Switch                         Off
16      ENUM    1       ADC IF2 Data Switch                      Normal
17      ENUM    1       DAC IF2 Data Switch                      Normal
18      BYTE    128     ELD                                     00000000000000000000000000000000
19      INT     1       AUDIO MODE                               0
20      BOOL    1       Headphones Switch                        On
21      BOOL    1       Lineout Switch                           On
22      BOOL    1       Headset Mic Switch                       On
23      BOOL    1       Int Mic Switch                           On
24      BOOL    1       RECMIXL INL1 Switch                      Off
25      BOOL    1       RECMIXL BST3 Switch                      Off
26      BOOL    1       RECMIXL BST2 Switch                      Off
27      BOOL    1       RECMIXL BST1 Switch                      Off
28      BOOL    1       RECMIXR INR1 Switch                      Off
29      BOOL    1       RECMIXR BST3 Switch                      Off
30      BOOL    1       RECMIXR BST2 Switch                      Off
31      BOOL    1       RECMIXR BST1 Switch                      Off
32      ENUM    1       Stereo1 ADC L2 Mux                       DD MIX
33      ENUM    1       Stereo1 ADC R2 Mux                       DD MIX
34      ENUM    1       Stereo1 ADC L1 Mux                       ADC
35      ENUM    1       Stereo1 ADC R1 Mux                       ADC
36      ENUM    1       Stereo2 ADC L2 Mux                       DD MIXL
37      ENUM    1       Stereo2 ADC L1 Mux                       ADCL
38      ENUM    1       Stereo2 ADC R1 Mux                       DD MIXR
39      ENUM    1       Stereo2 ADC R2 Mux                       DMIC R
40      BOOL    1       Stereo1 ADC MIXL ADC1 Switch             Off
41      BOOL    1       Stereo1 ADC MIXL ADC2 Switch             Off
42      BOOL    1       Stereo1 ADC MIXR ADC1 Switch             Off
43      BOOL    1       Stereo1 ADC MIXR ADC2 Switch             Off
44      BOOL    1       Stereo2 ADC MIXL ADC1 Switch             Off
45      BOOL    1       Stereo2 ADC MIXL ADC2 Switch             Off
46      BOOL    1       Stereo2 ADC MIXR ADC1 Switch             Off
47      BOOL    1       Stereo2 ADC MIXR ADC2 Switch             Off
48      ENUM    1       IF2 ADC                                  IF1 ADC1
49      ENUM    1       PDM L Mux                                DD MIX
50      ENUM    1       PDM R Mux                                DD MIX
51      BOOL    1       DAC MIXL Stereo ADC Switch               Off
52      BOOL    1       DAC MIXL INF1 Switch                     On
53      BOOL    1       DAC MIXR Stereo ADC Switch               Off
54      BOOL    1       DAC MIXR INF1 Switch                     On
55      ENUM    1       DAC L2 Mux                               IF2
56      ENUM    1       DAC R2 Mux                               IF2
57      BOOL    1       Stereo DAC MIXL DAC L1 Switch            On
58      BOOL    1       Stereo DAC MIXL DAC L2 Switch            Off
59      BOOL    1       Stereo DAC MIXL DAC R1 Switch            Off
60      BOOL    1       Stereo DAC MIXR DAC R1 Switch            On
61      BOOL    1       Stereo DAC MIXR DAC R2 Switch            Off
62      BOOL    1       Stereo DAC MIXR DAC L1 Switch            Off
63      BOOL    1       DD MIXL DAC L1 Switch                    Off
64      BOOL    1       DD MIXL DAC L2 Switch                    Off
65      BOOL    1       DD MIXL DAC R2 Switch                    Off
66      BOOL    1       DD MIXR DAC R1 Switch                    Off
67      BOOL    1       DD MIXR DAC R2 Switch                    Off
68      BOOL    1       DD MIXR DAC L2 Switch                    Off
69      BOOL    1       OUT MIXL BST1 Switch                     Off
70      BOOL    1       OUT MIXL BST2 Switch                     Off
71      BOOL    1       OUT MIXL INL1 Switch                     Off
72      BOOL    1       OUT MIXL REC MIXL Switch                 Off
73      BOOL    1       OUT MIXL DAC L1 Switch                   On
74      BOOL    1       OUT MIXR BST2 Switch                     Off
75      BOOL    1       OUT MIXR BST1 Switch                     Off
76      BOOL    1       OUT MIXR INR1 Switch                     Off
77      BOOL    1       OUT MIXR REC MIXR Switch                 Off
78      BOOL    1       OUT MIXR DAC R1 Switch                   On
79      BOOL    1       OUTVOL L Switch                          On
80      BOOL    1       OUTVOL R Switch                          On
81      BOOL    1       HPOVOL L Switch                          On
82      BOOL    1       HPOVOL R Switch                          On
83      BOOL    1       HPO MIX DAC1 Switch                      Off
84      BOOL    1       HPO MIX HPVOL Switch                     On
85      BOOL    1       LOUT MIX DAC L1 Switch                   Off
86      BOOL    1       LOUT MIX DAC R1 Switch                   Off
87      BOOL    1       LOUT MIX OUTVOL L Switch                 On
88      BOOL    1       LOUT MIX OUTVOL R Switch                 On
89      BOOL    1       HPO L Playback Switch                    On
90      BOOL    1       HPO R Playback Switch                    On
91      BOOL    1       LOUT L Playback Switch                   On
92      BOOL    1       LOUT R Playback Switch                   On

提高ADC Capture Volume值到110,輸入tinymix 9 110,得到以下結果

rk3288:/ # tinymix 9 110
rk3288:/ # tinymix                                                             
Mixer name: 'realtekrt5651codec_hdmiin'
Number of controls: 93
ctl     type    num     name                                     value
0       INT     2       HP Playback Volume                       31 31
1       INT     2       OUT Playback Volume                      24 24
2       BOOL    2       DAC2 Playback Switch                     On On
3       INT     2       DAC1 Playback Volume                     175 175
4       INT     2       Mono DAC Playback Volume                 175 175
5       INT     1       IN1 Boost                                0
6       INT     1       IN2 Boost                                0
7       INT     2       IN Capture Volume                        23 23
8       BOOL    2       ADC Capture Switch                       On On
9       INT     2       ADC Capture Volume                       110 110
10      INT     2       Mono ADC Capture Volume                  47 47
11      INT     2       ADC Boost Gain                           0 0
12      ENUM    1       RT5651 ASRC Switch                       Enable

當然了,單獨查看上述信息比較難以梳理,配合音頻通路圖會更加清晰,所以我們可以結合硬件原理圖一起梳理。

4.3 tinyplay
tinyplay是一個簡易的音樂播放器,一般用於播放測試。tinyplay只能播放wav原始格式的音樂,不能進行Mp3等格式的解碼,支持44.1kHz,48kHz採樣率的wav音樂。

在調用tinyplay播放音樂之前需要先使用tinymix切換好音頻通路:例如如下設置

rk3288:/ # tinyplay                                                            
Usage: tinyplay file.wav [-D card] [-d device] [-p period_size] [-n n_periods] 
1|rk3288:/ # tinyplay /sdcard/rec.wav -D 0 -d 1 -p 1024 -n 3                   
Playing sample: 2 ch, 44100 hz, 16 bit
rk3288:/ #

注:
-D card 聲卡
-d device 設備
-p period_size 一次中斷的幀數
-n n_periods 週期數

4.4 tinycap

tinycap是一個簡易的錄音軟件,一般用於錄音測試。

在調用tinycap錄音之前需要先調整好音頻通路:

rk3288:/ # tinycap /sdcard/rec.wav -D 0 -d 1 -c 2 -r 44100 -b 16 -p 1024 -n 3
Capturing sample: 2 ch, 44100 hz, 16 bit
^CCaptured 463872 frames  //ctrl+C 停止錄音

注:
-D card 聲卡
-d device 設備
-c channels 通道
-r rate 採樣率
-b bits pcm 位寬
-p period_size 一次中斷的幀數
-n n_periods 週期數

錄音結束通過ctrl+C強行退出即可,之後在/sdcard/路徑下查看到test.wav音頻文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章