音訊管理 SCO 重新架構

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

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

這項功能將音訊架構內的音訊路徑擁有權集中管理,讓 SCO 的音訊硬體抽象層 (HAL) 實作與其他藍牙設定檔 (例如藍牙立體聲音訊傳輸規範 (A2DP) 和低功耗藍牙音訊) 保持一致。這項重構作業簡化了電信和 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 堆疊會透過語音辨識期間的 AudioManager.setCommunicationDevice(AudioDeviceInfo) 要求音訊架構,啟動 SCO 連線。如果通話處於啟用狀態,BT 堆疊會改為向電信堆疊提出要求。BluetoothInCallService#requestBluetoothAudio

這項程序如下圖所示:

audio-conn

圖 8. 音訊連線。

驗證和測試

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

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

需求條件

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

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