供應商可以實作兩項重要功能,減少音訊延遲:
- AudioFlinger 中的 FAST Mixer:Android 4.1 推出這項功能,支援使用 Java AudioTrack 和 AAudio 的應用程式。FAST Mixer 涉及的公開用戶端 API 或 HAL API 變更最少。
- AAudio MMAP:Android 8.1 推出的這項功能可讓原生應用程式透過 AAudio 達到更低的延遲。詳情請參閱 AAudio 和 MMAP。
本頁面說明初始音訊延遲設計,這項設計隨著時間不斷演進。裝置 OEM 和 SoC 供應商必須深入瞭解這項設計,才能確保在特定裝置和晶片組上正確實作。本頁面不適用於應用程式開發人員。
建立測試群組
用戶端可以選擇在 AudioTrack C++ 建構函式的 audio_output_flags_t
參數中設定位元 AUDIO_OUTPUT_FLAG_FAST
,或使用 AudioTrack::set()
。目前只有下列用戶端會這麼做:
- 以 OpenSL ES 或 AAudio 為基礎的 Android 原生音訊
android.media.SoundPool
android.media.ToneGenerator
AudioTrack C++ 實作會檢查AUDIO_OUTPUT_FLAG_FAST
要求,並視需要選擇在用戶端層級拒絕要求。如果決定要轉送要求,會使用 IAudioTrack
工廠方法 IAudioFlinger::createTrack()
的 track_flags_t
參數中的 TRACK_FAST
位元。
AudioFlinger 音訊伺服器會檢查 TRACK_FAST
要求,並視需要拒絕伺服器層級的要求。並透過共用記憶體控制區塊的位元 CBLK_FAST
,告知用戶端要求是否已獲准。
影響決定的因素包括:
- 這個輸出內容有快速混音器執行緒 (請參閱下文)
- 追蹤記錄取樣率
- 是否有用戶端執行緒可執行這個軌道的處理常式
- 追蹤緩衝區大小
- 可用的快速通道名額 (請見下文)
如果客戶的要求獲得核准,即為快速通道。否則稱為「一般軌道」。
混音器執行緒
AudioFlinger 建立一般混音器執行緒時,會決定是否同時建立快速混音器執行緒。一般混音器和快速混音器都不會與特定音軌建立關聯,而是與一組音軌建立關聯。一律會有正常的混音器執行緒。如果存在快速混音器執行緒,則會從屬於一般混音器執行緒,並受其控制。
快速混音器
功能
快速混音器執行緒提供下列功能:
- 混合一般混音器的子混音和最多七個用戶端快速音軌
- 每條音軌的衰減
省略的功能:
- 依音軌轉換取樣率
- 音軌專屬效果
- 每個混音效果
句號
快速混音器會定期執行,建議週期為 2 到 3 毫秒,如果需要排程穩定性,則可稍微提高至 5 毫秒。選擇這個數字是為了考量完整的緩衝區管道,讓總延遲時間達到 10 毫秒左右。雖然可以選擇較小的值,但可能會導致耗電量增加,且視 CPU 排程可預測性而定,發生故障的機率也會提高。值可以更大 (最多 20 毫秒),但會導致總延遲時間變長,因此應避免使用。
時段設定
快速混音器會以較高的SCHED_FIFO
優先順序執行,這類工作需要極少的 CPU 時間,但必須經常執行,且排程抖動要低。抖動
表示週期時間的變化,也就是實際週期時間與預期週期時間之間的差異。
如果太晚執行,可能會因緩衝區不足而發生故障。如果太早執行,系統會從快速通道提取資料,但該通道尚未提供資料,因此會發生故障。
會使影片被封鎖
理想情況下,快速混音器執行緒絕不會遭到封鎖,HAL
write()
除外。快速混合器內的其他封鎖情況則視為錯誤。尤其是避免使用互斥鎖。而是使用非阻塞演算法 (也稱為無鎖演算法)。如要進一步瞭解這個主題,請參閱「避免優先權反轉」。
與其他元件的關係
快速混音師與客戶的直接互動較少,具體來說,它不會看到繫結層級的作業,但會存取用戶端的共用記憶體控制區塊。
快速混音器會透過狀態佇列接收一般混音器的指令。
除了擷取音軌資料,與用戶互動的方式與一般混音器相同。
快速混音器的主要接收器是音訊 HAL。
一般混音器
功能
所有功能皆已啟用:
- 最多 32 條音軌
- 每條音軌的衰減
- 依音軌轉換取樣率
- 處理特效
句號
計算出的時間長度為快速混音器週期的第一個整數倍數,且 >= 20 毫秒。
時段設定
一般混音器會以較高的 SCHED_OTHER
優先順序執行。
會使影片被封鎖
一般混音器可以封鎖,而且通常會在各種互斥鎖,以及封鎖管道寫入子混音時封鎖。
與其他元件的關係
一般混音器會與外部世界大量互動,包括繫結器執行緒、音訊政策管理員、快速混音器執行緒和用戶端軌。
一般混音器的接收器是快速混音器軌道 0 的封鎖管道。
旗幟
AUDIO_OUTPUT_FLAG_FAST
位元是提示。我們無法保證一定會滿足要求。
AUDIO_OUTPUT_FLAG_FAST
是指用戶端層級的概念。不會顯示在伺服器中。
TRACK_FAST
是用戶端對伺服器的概念。