因為Android中默認並沒有使用標准alsa,而是使用的是tinyalsa。所以就算基於命令行的測試也要使用libtinyalsa。Android系統在上層Audio千變萬化的時候,能夠能這些個工具實時查看到,比方音頻通道的切換等等.
1.編譯tinyalsa配套工具
$ mmm external/tinyalsa/
編譯完后會產生tinyplay/tinymix/tinycap等等工具。
tinymix: 查看配置混音器
tinyplay: 播放音頻
tinycap: 錄音
2.查看當前系統的聲卡
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]可選選項。
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:/ #
相應解釋:
| 英文 |
中文 |
備注 |
| 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.8kHz的wav音樂。
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。
制作靜態庫參考:Linux下Gcc生成和使用靜態庫和動態庫具體解釋
其他被證實為假的如果:
1.須要改寫init.rc讓系統不啟動android相關的服務(mediaserver)
2.須要通過其他途徑獲取tinyalsa.
