1. 程式人生 > >Android6.0 Audio系統架構

Android6.0 Audio系統架構

#android audio

Why audio ?


由於個人興趣的原因,從系統科調整到音訊科。


一個禮拜前,對Audio的認識是這樣的:


整體架構圖

之後,慢慢接觸程式碼之後,發現架構應該是這樣的:


audio架構圖


(圖來自AOSP:https://source.android.com/devices/audio/index.html)

區別在於,下面這個圖,是從原始碼和實現的角度上說的。


並且第一個圖錯誤的地方在於media server屬於本地服務,不應該在Java空間。


下面仔細說一下,每一層:(按照程式碼的位置來說)

JAVA層


(上層應用框架層)


framework/base/media/java/android/media 也就是android.media.*


java層


重點關注: AudioManager.java 以及 AudioSystem


因為這部分API是有SDK文件,所以結合文件看起來比較簡單。


JNI


然後就是膠水部分:(JNI)


(這一部分並不能單獨作為一層,只是起過渡到native層的作用,而native層接觸audio hardware)


audio_jni_1

當然,還有一部分在:frameworks/base/media/jni (具體做什麼還沒有確定)


Native2jni


Native層(供jni直接呼叫的&或者直接通過NDK本地介面進行呼叫),稱為native2jni


native_jni


重點就關注AudioPolicy.cpp AudioPolicy.cpp ….


Native2AudioFlinger


同樣也是這個目錄 frameworks/av/media/libmedia,不同的是這些程式碼,多是是留給audioFlinger實現的。


相當於這裡才真正是media service這個本地服務的呼叫客戶端,所以這裡會保留很多I開頭的檔案(具體實現交給audioFilinger)


native2audioflinger


Audio*呼叫IAudio訪問media server是通過引用標頭檔案


native標頭檔案

AudioFlinger


這裡其實就是media_server, binder的服務端。


mx3FDC4

具體就是下面兩個資料夾,其中audiopolicy不清楚(但看裡面應該是engine)


media_server


主要關注一下 audiofilinger裡面的內容


audioflinger


這是整個架構中核心,這裡放的是真正和HAL層實現互動的程式碼。

HAL層(硬體抽象層)


這裡放置了大量的函式指標,也就是會所這裡就是留給你去實現。(或者硬體廠商去實現)


hal_h


硬體抽象層,由於要和核心互動,所以其實現會單獨剖離出來,並沒有放在核心裡面(可能是為了硬體廠商保密)


但這裡也給出了HAL供呼叫的基本思路(繼承結構)


hal_c

具體的實現,一般放在hardware/目錄下,具體不公開。


最後才是驅動層。

Driver層(核心層)


和HAL互動,並控制硬體(具體還不太清楚,先不探究,先搞定通用部分)


The audio driver interacts with your hardware and HAL implementation. You can use Advanced Linux Sound Architecture (ALSA), Open Sound System (OSS), or a custom driver (HAL is driver-agnostic).


以上就大致&並結合程式碼位置,說了下Android中Audio的相關架構。


整體上把握了一下,之後看程式碼需要很多基礎,慢慢說。