如何在Android平臺上使用USB Audio設備

需求:USB Headset插上去後,聲音要從本地CODEC切換到USB Headset輸出/輸入。


上網搜了有關USB Audio Hotplug的東西,比較適用的資源如下:

1、Hotplugging USB audio devices (Howto)

題目看起來很吻合我們的問題,事實上並沒有多少參考價值。其中腳本/etc/hotplug/usb/extigy或許可以捕捉到USB Audio設備的熱插拔事件,應該可以進一步驗證和利用,留意這點。


2、Example to map USB Ports to ALSA card numbers and add each sound card to a combined, single interface device

這是利用udev來獲取USB熱插拔事件,雖然Android沒有udev,但例子程序對熱插拔事件字符串的處理值得參考。


3、USB mic on Linux

其實我們工作的第一步:驗證USB Headset是否可以回放錄音。

3.1、插上USB Headset,可以看到alsa的確加載了USB Audio,如下:

~ # cat /proc/asound/cards
 0 [WMTSOC         ]: HWDAC - WMT_SOC
                      WMT_SOC (HWDAC)
 1 [default        ]: USB-Audio - C-Media USB Headphone Set  
                      C-Media USB Headphone Set   at usb-0000:00:06.0-1, full speed

3.2、參考了這個鏈接,寫了如下的配置文件/etc/asond.conf:

pcm.!default {
         type asym
         playback.pcm {
                 type plug
                 slave.pcm "hw:1,0"
         }
         capture.pcm {
                 type plug
                 slave.pcm "hw:1,0"
         } 
}


重啓後,聲音就從Headset出來了。

hw:1,0對應card1即USB-Audio - C-Media USB Headphone Set


4、Linux下USB設備熱插拔

到此,需要考慮在Android平臺切換USB Audio的實現問題了。有幾個途徑:1/ hotplug/usb;2/ udev;3/ netlink。這裏就是netlink的實現方式,鏈接裏有個證實可用的例子程序,目前可能需要做熱插拔事件字符串的處理。


難點:

Android音頻設備的切換底層入口是alsa_default.cpp,目前看來需要在asound.conf定義好local CODEC和USB Audio的plug;還需要修改alsa_default.cpp,最主要Android要知道USB Audio插上時打開USB Audio的plug,USB Audio拔下時打開local CODEC的plug。這樣一想,修改的幅度還是蠻大的。而且未能確定如果在播放的過程中,切換音頻設備是否有影響?如果alsa允許只是配置好asound.conf達到同樣的目的,那就好辦了,可惜目前找不到這方面的資料,應該沒有這個便利了。


進展:

2011/9/19:按照以上難點分析,大致完成了整個Android框架層的代碼和ALSA配置文件,基本實現了USB Audio熱插拔時的音頻設備切換。但有個很大的問題:在播放時切換音頻設備會導致AudioFlinger服務crash(之前做2G通話時也遇到這個問題,用其他辦法規避了)。看來在切換音頻設備時,應該停止播放;等切換完成後,再恢復播放。


傳聞Android3.1開始支持USB Audio設備:“Your device will support USB Host Mode, applications can now manage connected USB peripherals such as audio devices. input devices, communications devices, and more.”。但Android3.1何時才能開源?


已經有思路了,剛想起Android本身不是支持Bluetooth音頻嗎?Bluetooth Headset的切換應該與USB Headset本質差不多吧。應該仔細研究下藍牙音頻是如何實現的。Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager


發佈了59 篇原創文章 · 獲贊 62 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章