音訊管理型 SCO 重新架構

本頁說明如何啟用音訊框架和音訊 HAL (AHAL),以管理同步連線導向 (SCO) 連線,這個程序稱為音訊管理 SCO (AMSCO)。

在 Android 17 以上版本中,Android 音訊架構會使用 SCO 管理功能管理 SCO 路由,這項功能原本是由藍牙 (BT) 架構處理。這項遷移作業會將 SCO 連線狀態從 BT 架構擁有的狀態,移至音訊串流活動的下游結果。

這項功能將音訊架構內的音訊路徑擁有權集中管理,讓 SCO 的音訊硬體抽象層 (HAL) 實作項目,與藍牙立體聲音訊傳輸規範 (A2DP) 和 LE Audio 等其他藍牙設定檔保持一致。這項重構作業簡化了電信和 BT 堆疊之間的互動,可實現更穩固的集中式音訊路徑架構。

架構總覽

AMSCO 架構會將 SCO 連線管理集中在 Android 音訊架構中,並根據音訊串流活動做出轉送決策。這項架構與先前的模型不同,先前的模型是由 BT 堆疊管理連線。此架構中各元件的角色如下:

只有在符合下列條件時,AHAL 才會啟動並暫停 SCO 會期:

  • 有效串流已修補至 SCO 裝置。
  • 音訊模式已設定,且 SCO 裝置的修補程式存在。

音訊架構會防止 A2DP 裝置在滿足這些特定條件時,擁有並行修補程式。音訊架構不再將 SCO 狀態變更或 A2DP 暫停傳送至 AHAL。

音訊架構會處理 SCO 管理作業,因此 BT 堆疊不再呼叫連線或中斷音訊。如果發生搶先中斷 SCO 連線或錯誤的情況,藍牙堆疊會透過 AudioManager#onHfpAudioDisconnected 通知音訊架構。

方案

請先評估下列相容性和架構需求,再實作 SCO 管理重構。

回溯相容性

如要讓框架繼續支援可能收到 OS 更新,但未更新 AHAL 或 BT AHAL 的裝置,請使用系統屬性指出必須啟用新的 SCO 管理功能。如果系統屬性已停用或 HAL 版本過時,系統最多會保留舊版路徑六年。

設定 HFP 工作階段

AHAL 必須使用新的免持聽筒設定檔 (HFP) 工作階段類型,才能啟動或暫停播放,與其他 BT 工作階段類型類似。串流狀態最終會使用不同的 IBluetoothAudioProviders 進行管理,這些 IBluetoothAudioProviders 會根據可用路徑,由 Factory 類別列舉及建構。

藍牙堆疊會盡可能使用硬體卸載路徑。在協商期間,編解碼器的偏好順序如下:LC3 硬體優先於 LC3 軟體,接著是 mSBC 硬體,然後是 mSBC 軟體,最後是 CVSD 硬體優先於 CVSD 軟體。

下列序列圖詳細說明 AHAL 與 BT 堆疊之間的互動,這些互動是建立串流狀態的必要條件。

硬體卸載程序

圖 1 說明 AHAL 和 BT 堆疊如何協調,為 SCO 音訊建立直接硬體資料路徑:

hw-offload-procedure

圖 1. 硬體卸載程序。

軟體資料路徑程序

圖 2 說明處理需要系統軟體處理的音訊資料流程:

sw-data-path

圖 2. 軟體資料路徑程序。

轉碼器重新協商程序

音訊閘道 (AG) 收到新的藍牙可用轉碼器 (AT+BAC) 指令時,AG 會重新啟動轉碼器協商程序。圖 3 說明瞭轉碼器重新協商程序:

codec-renego-process

圖 3. 編解碼器重新協商程序。

對 HeadsetStateMachine 的影響

Java 層級耳機狀態機器 (以 HeadsetStateMachine 類別表示) 大致維持不變,但 AUDIO_CONNECTED 狀態除外,該狀態是由原生堆疊事件驅動。在 Java 層中,系統不會再啟動 connectAudioNativedisconnectAudioNative。系統會改為回應原生堆疊的音訊連線狀態變更。這些變更是由 AHAL 的指令在 IBluetoothAudioProviderIBluetoothAudioPort 上觸發。

導入作業

如要整合 SCO 管理重構,請更新 BT 堆疊和音訊架構之間的通訊。

請按照下列步驟實作這項功能:

  1. 將作用中 BT 的變更通知音訊架構,以便在 HFP 裝置連線期間適當管理 SCO 啟動和終止作業,並處理作用中裝置變更。使用 AudioManager.handleBluetoothActiveDeviceChanged(HfpInfo) 將這項資訊提供給音訊架構。

    conn-hfp

    圖 4. 連線至 HFP 裝置。

    音訊架構會使用 AudioManagerAudioDeviceCallback#onAudioDevicesAdded 回呼,而非舊版廣播,來表示音訊裝置狀態。

  2. 使用 setCommunicationDevice(AudioDeviceInfodevice) 做為主要控制點,啟動 SCO 連線,實作 AHAL 串流控制項。

    如果 HfpTransport::StartRequest 傳回 BluetoothAudioCtrlAck::PENDING,AHAL 必須重試要求,因為 HFP 狀態機器尚未建立。

用途

以下各節將說明典型的關鍵使用者歷程 (CUJ)。

電信通話流程

SCO 管理重構作業會將 phoneStateChanged 變更為封鎖函式。這項修改會導致電信服務等待 BluetoothInCallService.onCallAdded 方法中的 phoneStateChanged 執行作業完成,然後才叫用音訊框架 API 來啟動 SCO 建立作業。

call-telecom

圖 5. 透過電信接聽或發起通話。

VoIP 通話流程

音訊架構會呼叫 BluetoothHeadset.startScoUsingVirtualVoiceCall 方法,啟動這項程序。藍牙堆疊將結果提供給音訊架構後,架構會指示 AHAL 執行 startStream。下圖說明這個流程:

call-voip

圖 6. 接聽或發起 VoIP 通話。

語音辨識

無論是免持 (HF) 還是 AG 發起的語音辨識,BT 堆疊都必須使用 AudioManager.setCommunicationDevice 要求音訊架構開啟 SCO。如下圖所示:

voice-recog

圖 7. 啟動語音辨識 SCO。

音訊連線

BT 堆疊會透過語音辨識要求音訊架構,藉此啟動 SCO 連線 AudioManager.setCommunicationDevice(AudioDeviceInfo)。如果通話處於啟用狀態,BT 堆疊會改為向電信堆疊提出要求。BluetoothInCallService#requestBluetoothAudio

這項程序如下圖所示:

audio-conn

圖 8. 音訊連線。

驗證和測試

為驗證這項功能是否正確整合,並符合品質標準,裝置製造商必須執行下列測試:

  • CTS 驗證器:使用 CTS 驗證器,在通話期間以互動方式測試音訊路徑。
  • 供應商測試套件 (VTS):使用 VTS 驗證 AHAL 和 BT AHAL 互動。

需求條件

這項功能須符合下列條件:

  • AHAL:實作時必須使用相容的 AHAL,支援重構的 SCO 管理路徑。