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


http://blog.csdn.net/kevinx_xu/article/details/12951131

需求: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,如下:

 

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

 

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

 

[plain]  view plain  copy
 
  1. pcm.!default {  
  2.          type asym  
  3.          playback.pcm {  
  4.                  type plug  
  5.                  slave.pcm "hw:1,0"  
  6.          }  
  7.          capture.pcm {  
  8.                  type plug  
  9.                  slave.pcm "hw:1,0"  
  10.          }   
  11. }  

 

 
        

重啟后,聲音就從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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM