Android操作系統(tǒng)已經(jīng)占領(lǐng)了當(dāng)今設(shè)備的很大一部分,包括智能手機,電視和Tab。根據(jù)Statista的數(shù)據(jù),谷歌創(chuàng)建的Android移動操作系統(tǒng)(OS)是目前使用最廣泛的智能手機操作系統(tǒng),以接近71.8%的市場份額主導(dǎo)移動操作系統(tǒng)市場。
Android 在所有硬件平臺上被廣泛采用,因為它是一個開源軟件代碼和一個定義明確的框架結(jié)構(gòu)。Linux內(nèi)核是Android操作系統(tǒng)的核心,因為它提供了硬件和各種Android組件之間的抽象。音頻處理需要大量復(fù)雜的操作和密集的算法來產(chǎn)生高保真音頻輸出。Android 音頻架構(gòu)涉及許多復(fù)雜的軟件,必須處理許多方面,例如支持揚聲器、聽筒、耳機、HDMI、麥克風(fēng)、藍(lán)牙 SCO、A2DP 等音頻硬件,以及不同的軟件應(yīng)用程序,如電話、媒體播放器錄音機、VIOP 應(yīng)用程序和 SIP 應(yīng)用程序。本文重點介紹 Android 音頻架構(gòu)中不同組件的高級功能。
安卓音頻架構(gòu)概述
Android 音頻架構(gòu)概述了音頻功能的實現(xiàn)方式,并提供了指向相關(guān)源代碼的鏈接。
安卓音頻架構(gòu)
安卓音頻APP和JAVA框架
Android 框架由一組定義明確的 Java API 組成,使開發(fā)人員能夠輕松編寫 Android 應(yīng)用程序。Android 音頻應(yīng)用代碼使用這組不同的多媒體 (android.media) 框架 API。在內(nèi)部,這些 API 調(diào)用相應(yīng)的 Java 本機接口 (JNI) 粘附軟件代碼來訪問本機組件,這些組件進(jìn)一步與較低層交互以在硬件上播放音頻。
粘結(jié) 劑
進(jìn)程間通信 (IPC) 是所有不同 Android 組件交換信息的重要機制。Android 進(jìn)程使用名為“Binder”的特定于 Android 的 IPC 來調(diào)用另一個 Android 進(jìn)程中的例程,并通過參數(shù)交換數(shù)據(jù)。上層使用 Binder API 與本機音頻服務(wù)和下層硬件層進(jìn)行通信。
音頻管理器
音頻管理器是原生的Android服務(wù),是整個音頻子系統(tǒng)的核心組件。從Android 7 Nougat版本開始,它不是原生媒體服務(wù)的一部分,而是在用戶空間中作為單獨的Android進(jìn)程運行。它為不同的服務(wù)運行三個線程,即音頻策略、音頻投點和音頻以執(zhí)行其功能。
音頻策略服務(wù)
策略決策主要包括打開新的輸入/輸出音頻流,并在通過 UI 和流音量管理更改或選擇后將音頻重新路由到不同的音頻設(shè)備。音頻策略服務(wù)處理執(zhí)行這些策略決策所需的所有操作。此服務(wù)還跟蹤用戶事件和當(dāng)前系統(tǒng)狀態(tài),以通知音頻投點服務(wù)。
音頻投擲器服務(wù)
音頻傳票服務(wù)調(diào)用音頻硬件抽象層 (HAL) API 以與音頻硬件交互。它為上層提供了一個可訪問的界面。音頻策略服務(wù)定義的策略決策和策略由此服務(wù)執(zhí)行。它還負(fù)責(zé)與音頻設(shè)備通信并維護(hù)其狀態(tài)。它處理多個音頻流(通知和音樂)的混合、音量縮放、音頻流寫入,并為媒體播放器提供寫入音頻幀等信息。
音頻服務(wù)
Audio 是 Android 8 Oreo 版本中引入的新 Android C API。它專為需要低延遲的高性能音頻應(yīng)用而設(shè)計。Android 音頻應(yīng)用調(diào)用音頻 API 來讀取和寫入音頻流中的數(shù)據(jù)。音頻服務(wù)處理這些低延遲音頻 API。音頻 API 中有兩種模式,即“獨占模式”,它允許客戶端應(yīng)用程序代碼直接寫入與 ALSA 驅(qū)動程序共享的內(nèi)存映射緩沖區(qū),以及“共享模式”,它混合所有共享流并遵循音頻 HAL 路徑。
音頻 HAL
硬件抽象層 (HAL) 是 Android 堆棧中的一個層,它為上層運行的本機音頻服務(wù)提供標(biāo)準(zhǔn)訪問接口。音頻 HAL 將上層橋接到較低級別的音頻驅(qū)動程序?qū)崿F(xiàn)。供應(yīng)商必須使用特定的音頻驅(qū)動程序代碼實現(xiàn)音頻 HAL 接口。音頻 HAL 作為單獨的 Android 進(jìn)程在用戶空間中運行,以執(zhí)行上層所需的功能。
下面列出了音頻 HAL 提供的主要功能。
管理音頻輸入/輸出流的打開和關(guān)閉,包括設(shè)置音頻通道、采樣率和音頻格式等流參數(shù)。它還必須處理媒體播放器的不同狀態(tài),包括播放、暫停、恢復(fù)和待機,并為硬件上寫入的音頻幀和時間戳提供反饋路徑數(shù)據(jù)。
加載需要特殊音頻處理和解碼的特定庫集,從而將原始數(shù)據(jù)發(fā)送到音頻硬件。
音頻設(shè)備接口
Android 音頻架構(gòu)支持不同類型的音頻設(shè)備,包括藍(lán)牙設(shè)備、電視調(diào)諧器系統(tǒng)、HMDI 連接和 I2S 揚聲器。音頻 HAL 負(fù)責(zé)將音頻數(shù)據(jù)包從上層發(fā)送到這些設(shè)備。選擇特定音頻設(shè)備或?qū)⑵洳迦?Android 硬件后,音頻策略管理器將執(zhí)行一組定義并與音頻設(shè)備關(guān)聯(lián)的策略,并且所有層都配置為支持音頻數(shù)據(jù)流經(jīng)它。Audio HAL 特別加載與音頻設(shè)備交互的接口代碼并對其執(zhí)行讀寫操作,此接口代碼還為連接到其他 HAL 的音頻設(shè)備執(zhí)行 HAL 間 IPC,例如,需要藍(lán)牙 HAL 交換數(shù)據(jù)的藍(lán)牙音頻設(shè)備。
內(nèi)核驅(qū)動程序
音頻 HAL 實現(xiàn)具有與音頻驅(qū)動程序交互的代碼。Android 內(nèi)核使用高級 Linux Sound Architecture (ALSA) 子系統(tǒng),或者供應(yīng)商可以引入與 HAL 無關(guān)的自定義驅(qū)動程序。Tiny ALSA是一個小型庫,用于與Linux內(nèi)核中的ALSA接口,音頻HAL使用它與不同的聲卡進(jìn)行交互。
Android堆棧是需要為不同的硬件平臺構(gòu)建的巨大軟件代碼。理解和修改較低的Android層非常困難,因為它需要大量的調(diào)試技能。硬件級實現(xiàn)因每個供應(yīng)商而異,需要與為上層定義的接口準(zhǔn)確映射。代碼庫中許多未記錄的部分更加復(fù)雜且特定于供應(yīng)商,并且它使用復(fù)雜的IPC機制,并在編程語言之間切換。
Softnautics使多媒體公司能夠設(shè)計和開發(fā)連接的多媒體解決方案。我們幫助客戶進(jìn)行Android底層所需的不同自定義和集成,其中主要包括用戶和內(nèi)核空間中的本機代碼。我們還協(xié)助客戶添加基于音頻的無線設(shè)備并將其集成到Android音頻子系統(tǒng)中。我們在了解 Android 架構(gòu)中的不同層以進(jìn)行定制和圍繞它的新設(shè)計方面擁有專業(yè)知識。我們在設(shè)計高性能媒體應(yīng)用程序、構(gòu)建完整的視頻管道、音頻/視頻編解碼器開發(fā)、應(yīng)用程序移植等方面擁有實踐經(jīng)驗。
審核編輯?:郭婷
-
智能手機
+關(guān)注
關(guān)注
66文章
18419瀏覽量
179729 -
Android
+關(guān)注
關(guān)注
12文章
3917瀏覽量
127061 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6696瀏覽量
123147
發(fā)布評論請先 登錄
相關(guān)推薦
評論