之前轉載過一篇文章-智能手機音頻系統(tǒng)概述,描述了手機音頻系統(tǒng)設計框圖。實際上那是一個簡單的做法,應用中有較大的局限性。那么一個完善的音頻框架應該是什么樣的呢?這兩天根據(jù)Android4.0源碼的一些線索,找到了相應的硬件資料,摘錄下來。
注:以samsung tuna方案(即galaxy nexus)為例。
在ANDROID音頻系統(tǒng)散記之四:4.0音頻系統(tǒng)HAL初探中,提及到samsung的tuna方案,其實就是大名鼎鼎的galaxy nexus了。
android-4.0.3_r1\device\samsung\tuna\audio\audio_hw.c,這文件就是tuna的音頻HAL了,從中我們看出:根據(jù)上層的音頻策略打開/關閉相應的pcm設備。
2、mm_ul:audio record設備,即audio upload link;
3、vx:voice設備,通話模塊的聲音就是經過這個設備的。
根據(jù)上層聲音模式audio_mode_t來選擇打開不同的pcm設備,詳細見select_mode()函數(shù)。
audio_hw.c還定義了各種音頻路徑(音頻路徑概念見:DAPM之二:audio paths與dapm kcontrol)。
2、hs_output:headset輸出路徑;
3、......
根據(jù)上層的audio_devices_t選擇打開或關閉對應的音頻路徑部件,如:
以上的mode和device都是由Android更上一層的音頻策略所決定的,不在本模塊的討論范疇,這里僅需要按照音頻策略來打開正確的音頻通道。
另外有一個我非常疑惑的地方:tuna的audio_hw.c中選用的采樣率是48khz,但是Android的framework層是先SRC到44.1khz的,因此這會犯高通同樣的錯誤-雙重SRC(48khz->44.1khz->48khz),對音質的損害非常大。為什么不直接使用44.1khz的采樣率呢?
如我們所知,galaxy nexus用的是omap4460,音頻芯片是twl6040。因此我們下載omap的kernel代碼:
就本篇的討論內容來看,我們只需關注如下幾個源文件:
1、sound\soc\codecs\twl6040.c
2、sound\soc\omap\omap-abe-dsp.c和sound\soc\omap\omap-abe.c
twl6040.c是音頻芯片twl6040的驅動代碼,這部分是通用的;
omap-abe是omap4460的音頻后端處理(Audio Back-End)驅動代碼,這是平臺相關的。結合后面的硬件框圖來看,就會明白audio_hw很大程度是直接控制abe。
其中omap的dsp代碼是以firmware的形式提供的,因此omap-abe-dsp.c用于調用dsp的接口函數(shù)。
omap4460數(shù)據(jù)手冊及設計資料如下:
ABE:http://focus.ti.com/pdfs/wtbu/OMAP4430_ES2%20x_4460_ES1%200_PUBLIC_TRM_Addendum_ABE_HAL_vC.pdf
音頻系統(tǒng)框圖如下:
左邊是OMAP的ABE,右邊是codec twl4060,由此可知:音頻先經過OMAP ABE的處理,再送到codec輸出。
通話下行路徑:ABE[VX_DL -> DL_Mixer -> ...] -> PDM_DL -> CODEC[DAC -> Earpiece/Headfree/Headset]
其中在ABE端還要經過一些EQ、Gain、SRC、Echo部件,這里不一一列出了??梢奜MAP ABE是非常復雜的一個模塊,聲音在這里處理好之后才送到CODEC,相比之下CODEC端的工作就簡單多了。
聯(lián)系客服