手機能夠說是如今人平常生活中最離不開的電子設備了。它自誕生以來,從模擬的發展到數字的,從1G發展到目前的4G以及不久未來的5G,從最初的只有惟一的功能(打電話)發展到目前的全功能,從功能機(feature phone)發展到智能機(smart phone),可謂變化巨大。對於手機上的音頻來講,剛開始只有語音通訊功能,如今不只語音通訊,還能夠聽音樂、錄音、智能語音(語音輸入/語音交互)等。智能手機中的音頻場景衆多,能夠說是手機多媒體系統中最複雜的子系統了。今天咱們就談談Android智能手機上的音頻。html
先從硬件談起吧。下圖是android智能手機中目前主流的跟音頻相關的硬件框圖。android
上圖中AP是應用處理器(application processor),如今用的最多的是ARM的處理器,在上面主要運行的是操做系統(OS,例如android)和應用程序。CP是通訊處理器(communication processor),也叫基帶處理器(baseband processor,BP)或者modem,上面主要處理跟通訊相關的,好比手機信號好很差就跟它相關。Audio DSP,顧名思義,就是一個處理音頻的DSP。我在剛作手機的時候就很納悶如今AP處理器頻率那麼高,音頻處理(尤爲是語音)CPU load 不高,AP上徹底能夠處理,爲啥還要額外加一個音頻DSP處理音頻呢,這不是增長了成本嗎?隨着作的深刻,知道了這主要是出於功耗的考慮。功耗是手機上的一個重要指標,也是過認證的必選項,它決定了手機的續航能力。在手機電池技術沒有得到突破的如今,要想續航能力強,就得降功耗。音頻中的打電話和聽音樂是手機上的最主要功能之一,必須在這兩種場景降低功耗。怎麼降呢?就是加一塊專門處理音頻的DSP,在打電話和聽音樂時讓AP在絕大多數時間都出於sleep狀態,這樣功耗就降下來了。 AP、CP和audio DSP之間經過IPC(inter-processor communication)通訊,交互控制消息和音頻數據。一般AP、CP和audio DSP(固然還包括其餘功能的處理器)集成在一個芯片內,造成一個SOC(system on chip,片上系統)。此外有一個主要用於音頻採集和播放的硬件codec芯片,它受AP控制(使能以及選擇不一樣音頻路徑等,主要是配置寄存器),與audio DSP經過I2S總線交換音頻數據。連着硬件codec的是各類外設,有MIC(如今主流的是雙MIC方案)、earpiece(聽筒)、speaker(揚聲器)、有線耳機(有三段式四段式兩種,三段式沒有MIC功能,四段式有)等。可是藍牙耳機比較特殊,它是直接經過I2S總線與audio DSP鏈接的,主要是由於音頻的採集和播放在藍牙芯片裏都有了。當用藍牙耳機聽音樂時,音頻碼流在AP上解碼成PCM數據用A2DP協議通過UART直接送給藍牙耳機播放,而不是通過audio DSP經過IIS總線送給藍牙耳機播放。網絡
再來看軟件。音頻相關的軟件在三個處理器(AP/CP/audio DSP)上都有,先看AP上的音頻軟件。本文講的是Android智能手機上的音頻,運行的固然就是Android系統了,Android系統就運行在AP上。Android裏有multimedia framework,audio是其中的一部分,AP上audio部分的軟件框圖以下:app
Android音頻軟件分不一樣的層,主要有kernel/user/Framework/JNI/Java。從底層kernel向上講吧。Android的核用的是Linux的。Linux上音頻相關的子系統叫ALSA,包括kernel space和user space兩部分。Kernel space裏是音頻驅動,user space裏主要是提供API給應用程序調用。Android的音頻驅動跟Linux是同樣的,在user space裏對ALSA進行了裁剪造成了tinyalsa。關於這些我在前面的文章( 音頻的採集和播放)裏簡單描述過,有興趣能夠去看看。同時user space裏還有音頻軟件編解碼的各類庫,包括音樂的(MP3/AAC等)和語音的(AMR-NB/AMR-WB等)。再向上就是Framework,裏面模塊衆多,主要有NuPlayer/stageFright Record/openMAX/AudioFlinger等,網上講audio Framework的文章太多了,這裏就不細講了。Auido HAL(Hardware Adapter Layer,硬件適配層)也在這一層。Framework上層是JNI(Java Native Interface),提供接口供Java調用,提供的接口主要有MediaRecorder/MediaPlayer/AudioTrack/AudioRecorder。最上層是Java層,也就是各類帶有音頻功能的APP(調用提供的API)了。ui
再看audio DSP上的音頻軟件。下圖是audio的軟件框圖:spa
從上圖看出,模塊主要有codec(MP3/AAC/AMR/EVS等)、前處理(AGC/ANS/AGC等)、後處理(EQ/AGC/ANS 等)、重採樣(SRC)、混音(MIX)、從DMA獲取採集到的音頻數據(CAPTURE)、將音頻數據送給DMA後播放(PLAY)等,固然還有接收和發送給其餘處理器的音頻數據處理等,AP和CP都要與audio DSP交互語音數據。操作系統
最後看CP上的音頻軟件,它上面處理的就是跟語音通訊相關的。2/3G跟4G徹底處理徹底不同(2/3G是CS call,會有專用的信道處理語音。4G是一個純IP的網絡,是PS call),會有兩套處理機制。我沒作過CP上的音頻處理(我主要作audio DSP上的音頻處理,偶爾作些AP上的音頻處理),對2/3G下的語音處理不熟悉,對4G下的語音處理了解。下圖是4G下的音頻軟件處理框圖:code
主要分兩大部分,IMS stub,處理IMS(IP Multimedia Subsystem, IP多媒體子系統)中的語音數據相關的(IMS 控制協議相關的在AP中處理)。Audio,對IMS中語音數據的pack/unpack以及與audio DSP的交互等。htm
智能手機中音頻場景衆多,有些場景中三個處理器中的音頻軟件都會涉及,好比打電話,AP上主要是處理一些控制上的邏輯,CP和audio DSP上不只有控制邏輯,還有語音數據的處理,上行是先從MIC採集到語音經Audio DSP處理後變成碼流發給CP,CP處理後通過空口發到網絡上,下行是CP從空口拿語音碼流,處理後發給audio DSP,audio DSP再解碼後發給codec芯片直到外設播放出來。有些場景只涉及部分處理器中的音頻軟件,好比在播放音樂時CP上的音頻軟件就不會涉及,在用APP播放音樂時,是音樂從AP上傳到audio DSP上,通過相關處理後經過外設播放出來。在下一篇文章中我會詳細的描述在各類音頻場景中音頻數據的流向。blog