[轉]Android音頻底層調試-基於tinyalsa

http://blog.csdn.net/kangear/article/details/38139669html

 

[-]python

  1. 編譯tinyalsa配套工具
  2. 查看當前系統的聲卡
  3. tinymix查看混響器
  4. 使用tinyplay播放wav音樂
  5. tinycap使用
 

      因爲Android中默認並無使用標準alsa,而是使用的是tinyalsa,因此就算基於命令行的測試也要使用libtinyalsa。Android系統在上層Audio變幻無窮的時候,能夠能這些個工具實時查看到,好比音頻通道的切換等等.android

 

1.編譯tinyalsa配套工具

$ mmm external/tinyalsa/git

編譯完後會產生tinyplay/tinymix/tinycap等等工具。github

tinymix: 查看配置混音器工具

tinyplay: 播放音頻測試

tinycap: 錄音網站

 

2.查看當前系統的聲卡

 

[python] view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. root@android:/ # cat /proc/asound/cards   
  2.  0 [RKRK616        ]: RK_RK616 - RK_RK616  
  3.                       RK_RK616  
  4.  1 [ROCKCHIPSPDIF  ]: ROCKCHIP-SPDIF - ROCKCHIP-SPDIF  
  5.                       ROCKCHIP-SPDIF  
  6. root@android:/ #   
root@android:/ # cat /proc/asound/cards
 0 [RKRK616        ]: RK_RK616 - RK_RK616
                      RK_RK616
 1 [ROCKCHIPSPDIF  ]: ROCKCHIP-SPDIF - ROCKCHIP-SPDIF
                      ROCKCHIP-SPDIF
root@android:/ # 

 

3.tinymix查看混響器

tinymix使用方法a.不加任何參數-顯示當前配置狀況 b.tinymix [ctrl id] [var]不加[var]能夠查看該[ctrl id]可選選項。ui

 

[python] view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. root@android:/ # tinymix   
  2. Number of controls: 7  
  3. ctl type    num name                                     value  
  4. 0   ENUM    1   Playback Path                            OFF  
  5. 1   ENUM    1   Capture MIC Path                         MIC OFF  
  6. 2   ENUM    1   Voice Call Path                          OFF  
  7. 3   ENUM    1   Voip Path                                OFF  
  8. 4   INT 2   Speaker Playback Volume                  0  
  9. 5   INT 2   Headphone Playback Volume                0  
  10. 6   ENUM    1   Modem Input Enable                       ON  
  11. root@android:/ #  
root@android:/ # tinymix
Number of controls: 7
ctl	type	num	name                                     value
0	ENUM	1	Playback Path                            OFF
1	ENUM	1	Capture MIC Path                         MIC OFF
2	ENUM	1	Voice Call Path                          OFF
3	ENUM	1	Voip Path                                OFF
4	INT	2	Speaker Playback Volume                  0 0
5	INT	2	Headphone Playback Volume                0 0
6	ENUM	1	Modem Input Enable                       ON
root@android:/ #

 

對應解釋:spa

英文

中文

備註

Playback Path

音頻輸出通道

 

Capture MIC Path

音頻輸入通道

 

Voice Call Pah

通話音頻通道

設備沒有通話模塊,暫沒法測試

Voip Pah 

IP電話音頻通道

場景Gtalk;值有:SPK/HP_NO_MIC/BT

Speaker Playback Volume

揚聲器音量

和上層音量值無關

Headphone Playback Volume

耳機音量

同上

Modem Input Enable

暫不知何用

經測試不能控制音頻輸入輸出

 

 

 

Playback Path有:

英文

中文

備註

OFF

關閉

 

RCV

 

SPK

揚聲器

經常使用

HP

耳機帶麥

 

HP_NO_MIC

耳機無麥

經常使用

BT

藍牙

 

SPK_HP

 

RING_SPK

 

RING_HP

 

RING_HP_NO_MIC

 

RING_SPK_HP

 

例:將輸出切換到揚聲器

root@android:/ # tinymix 0 SPK

關於tinymix小結:

經過觀察發現,Android系統的聲音音量的調節並無直接使用tinyalsa,而基於上層軟件實現,由於不管上層音量怎麼改變,這裏看到的都是24(以我採用的設備爲例)。通道的切換是真正使用了tinyalsa,當經過不一樣通道播放音樂的時候能夠實時觀察到通道的切換。在某個網站上看到Android在沒有聲音播放的3秒後會關於alsa,這裏也獲得了證明,我之前認爲Android系統會永久佔用音頻設備。

當經過藍牙播放音樂的時候,已經不通過alsa了。tinymix查看得都處理關閉狀態,由於Android4.2的藍牙協議所有在用戶層實現了,直接走uart通道。這樣的設計方式一時半會不能理解。

 

4.使用tinyplay播放wav音樂

這個只是一個最基本的播放器,因此不支持播放MP3等等壓縮過格式的音樂。沒有學會使用前,網上都說很麻煩,可是如今看來一點也不麻煩,直接播放了44.1kHz/44.8kHzwav音樂。

 

[python] view plain copy print ? 在CODE上查看代碼片 派生到個人代碼片
  1. root@android:/ # tinyplay /sdcard/0_16.wav                                        
  2. Playing sample: 2 ch, 44100 hz, 16 bit  
  3. root@android:/ #   
root@android:/ # tinyplay /sdcard/0_16.wav                                     
Playing sample: 2 ch, 44100 hz, 16 bit
root@android:/ # 

 

注:播放以前得首先使用tinymix把通道設置好,上文中已經給出了設置到揚聲器中的例子;因爲播放時使用的最大音量進行播放的,因此注意防止被嚇到。這裏將測試音頻文件上傳。

 

5.tinycap使用

root@android:/ # tinycap /sdcard/test.wav

能夠進行錄音。

 

目前只遇到這些,就先總結到這,能夠隨時再深刻。

 

 

20141014更新:

1.原來tinyalsa最原始的源碼在這裏tinyalsa_github

2.本身fork一份,添加靜態編譯方法以及busybox方式的將tinymix/tinyplay/tinycap/tinypcminfo集成一個tinyalsa

tinyalsa-utils 包含了tinymix/tinyplay/tinycap/tinypcminfo使用方法是 tinyalsa + 工具名。好比要運行tinymix,那麼就執行 tinyalsa mix或者tinyalsa tinymix下載地址

root@android:/ # tinyalsa mix                                                  

Mixer name: 'RK_RK616'

Number of controls: 7

ctl type num name                                     value

0 ENUM 1 Playback Path                            OFF

1 ENUM 1 Capture MIC Path                         Main Mic

2 ENUM 1 Voice Call Path                          OFF

3 ENUM 1 Voip Path                                OFF

4 INT 2 Speaker Playback Volume                  0 0

5 INT 2 Headphone Playback Volume                0 0

6 ENUM 1 Modem Input Enable                       ON

root@android:/ # 

3.根據這個[PATCH] tinyalsa: new package信息顯示,之後tinyalsa也會被集成進busybox中。

4.若是出現Failed to open mixer錯誤,表明你的Android設備不是alsa音頻驅動,而是legacy OSS device

製做靜態庫參考:LinuxGcc生成和使用靜態庫和動態庫詳解


 

其它被證明爲假的假設:

1.須要改寫init.rc讓系統不啓動android相關的服務(mediaserver)

2.須要經過其它途徑獲取tinyalsa.

相關文章
相關標籤/搜索