減少延遲時間的設計

供應商可以實作兩項重要功能,減少音訊延遲:

  • 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()。目前只有下列用戶端會這麼做:

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 是用戶端對伺服器的概念。