Audio 相關程式碼分析
來源:互聯網
上載者:User
一、Audio系統綜述 Audio系統主要分成如下幾個層次: (1)media庫提供的Audio系統的上層介面;
(2)AudioFlinger作為Audio系統的中介層;
(3)Audio的硬體抽象層提供底層支援;
(4)Audio介面通過JNI和Java架構提供給上層。 Audio系統的各個層次介面主要提供了兩方面功能:放音(Track)和錄音(Recorder)。
在Android的Audio系統中,無論上層還是下層,都使用一個管理類和輸出輸入兩個類來表示整個Audio 系統,輸出輸入兩個類負責資料通道。 二、Audio架構分析 1、Audio的Java部分
代碼路徑:frameworks/base/media/java/android/media
與Audio相關的Java包是android.media,主要包含AudioManager和Audio系統的幾個類。 2、Audio的JNI部分
代碼路徑:frameworks/base/core/jni
產生庫libandroid_runtime.so,Audio的JNI是其中的一個部分。 3、Audio的架構部分
標頭檔路徑:frameworks/base/include/media/
原始碼路徑:frameworks/base/media/libmedia/ Audio本地架構是media庫的一部分,本部分內容被編譯成庫libmedia.so,
提供Audio部分的介面(包括基於Binder的IPC機制)。
Audio系統的核心架構在media庫中提供,對上面主要實現AudioSystem、AudioTrack和 AudioRecorder三個類。提供了IAudioFlinger類介面,在這個類中,可以獲得IAudioTrack和 IAudioRecorder兩個介面,分別用於聲音的播放和錄製。AudioTrack和 AudioRecorder分別通 過調用IAudioTrack和IAudioRecorder來實現。 Audio系統的標頭檔在frameworks/base/include/media/目錄中,主要的標頭檔如下:
AudioSystem.h:media庫的Audio部分對上層的總管介面;
IAudioFlinger.h:需要下層實現的總管介面;
AudioTrack.h:放音部分對上介面;
IAudioTrack.h:放音部分需要下層實現的介面;
AudioRecorder.h:錄音部分對上介面;
IAudioRecorder.h:錄音部分需要下層實現的介面。 IaudioFlinger.h、 IAudioTrack.h和IAudioRecorder.h這三個介面通過下層的繼承來實現 (即AudioFlinger)。AudioFlinger.h、AudioTrack.h和AudioRecorder.h是對上層提供的 介面,它們既供本地程式調用(例如聲音的播放器、錄製器等),也可以通過JNI向Java層提供接 口。 4、Audio Flinger
代碼路徑:frameworks/base/libs/audioflinger 這部分內容被編譯成庫libaudioflinger.so,它是Audio系統的本地服務部分。 AudioFlinger是Audio系統的中介層,在系統中起到服務作用,它主要作為libmedia提供的 Audio部分介面的實現。AudioFlinger的核心檔案是AudioFlinger.h和AudioFlinger.cpp,提 供了類AudioFlinger,這個類是一個IAudioFlinger的實現。AudioFlinger主要提供 createTrack()建立音訊輸出裝置IAudioTrack,openRecord()建立音訊輸入裝置 IAudioRecord。另外包含的就是一個get/set介面,用於控制。 從工作的角度看,AudioFlinger在初始化之後,首先獲得放音裝置,然後為混音器(Mixer)建立 線程,接著建立放音裝置線程,線上程中獲得放音裝置。 5、Audio的硬體抽象層介面
標頭檔路徑:hardware/libhardware_legacy/include/hardware/
其中主要的檔案為:AudioHardwareBase.h和AudioHardwareInterface.h。 Audio硬體抽象層的實現在各個系統中可能是不同的,需要使用代碼去繼承相應的類並實現它們,作 為Android系統本地架構層和驅動程式介面。Audio的硬體抽象層是AudioFlinger和Audio硬體的 介面,在各個系統的移植過程中可以有不同的實現方式。Audio硬體抽象層可以基於Linux標準的 ALSA或OSS音頻驅動實現,也可以基於私人的Audio驅動介面來實現。 在AudioHardwareInterface.h中定義了類:AudioStreamOut、AudioStreamIn和 AudioHardwareInterface。 在這個AudioHardwareInterface介面中,使用openOutputStream()和openInputStream()函 數分別擷取AudioStreamOut和AudioStreamIn兩個類,它們作為音頻輸入/輸出裝置來使用。此 外,AudioHardwareInterface.h定義了C語言的介面來擷取一個AudioHardware Interface類 型的指標。
extern "C" AudioHardwareInterface* createAudioHardware(void); 如果實現一個 Android的硬體抽象層,則需要實現AudioHardwareInterface、 AudioStream Out和AudioStreamIn三個類,將代碼編譯成動態庫libauido.so。 AudioFlinger會串連這個動態庫,並調用其中的createAudioHardware() 函數來擷取介面。