本頁說明如何啟用音訊框架和音訊 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 音訊建立直接硬體資料路徑:
圖 1. 硬體卸載程序。
軟體資料路徑程序
圖 2 說明處理需要系統軟體處理的音訊資料流程:
圖 2. 軟體資料路徑程序。
轉碼器重新協商程序
音訊閘道 (AG) 收到新的藍牙可用轉碼器 (AT+BAC) 指令時,AG 會重新啟動轉碼器協商程序。圖 3 說明瞭轉碼器重新協商程序:
圖 3. 編解碼器重新協商程序。
對 HeadsetStateMachine 的影響
Java 層級耳機狀態機器 (以 HeadsetStateMachine 類別表示) 大致維持不變,但 AUDIO_CONNECTED 狀態除外,該狀態是由原生堆疊事件驅動。在 Java 層中,系統不會再啟動 connectAudioNative 或 disconnectAudioNative。系統會改為回應原生堆疊的音訊連線狀態變更。這些變更是由 AHAL 的指令在 IBluetoothAudioProvider 或 IBluetoothAudioPort 上觸發。
導入作業
如要整合 SCO 管理重構,請更新 BT 堆疊和音訊架構之間的通訊。
請按照下列步驟實作這項功能:
將作用中 BT 的變更通知音訊架構,以便在 HFP 裝置連線期間適當管理 SCO 啟動和終止作業,並處理作用中裝置變更。使用
AudioManager.handleBluetoothActiveDeviceChanged(HfpInfo)將這項資訊提供給音訊架構。
圖 4. 連線至 HFP 裝置。
音訊架構會使用
AudioManagerAudioDeviceCallback#onAudioDevicesAdded回呼,而非舊版廣播,來表示音訊裝置狀態。使用
setCommunicationDevice(AudioDeviceInfodevice)做為主要控制點,啟動 SCO 連線,實作 AHAL 串流控制項。如果
HfpTransport::StartRequest傳回BluetoothAudioCtrlAck::PENDING,AHAL 必須重試要求,因為 HFP 狀態機器尚未建立。
用途
以下各節將說明典型的關鍵使用者歷程 (CUJ)。
電信通話流程
SCO 管理重構作業會將 phoneStateChanged 變更為封鎖函式。這項修改會導致電信服務等待 BluetoothInCallService.onCallAdded 方法中的 phoneStateChanged 執行作業完成,然後才叫用音訊框架 API 來啟動 SCO 建立作業。

圖 5. 透過電信接聽或發起通話。
VoIP 通話流程
音訊架構會呼叫 BluetoothHeadset.startScoUsingVirtualVoiceCall 方法,啟動這項程序。藍牙堆疊將結果提供給音訊架構後,架構會指示 AHAL 執行 startStream。下圖說明這個流程:

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

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

圖 8. 音訊連線。
驗證和測試
為驗證這項功能是否正確整合,並符合品質標準,裝置製造商必須執行下列測試:
- CTS 驗證器:使用 CTS 驗證器,在通話期間以互動方式測試音訊路徑。
- 供應商測試套件 (VTS):使用 VTS 驗證 AHAL 和 BT AHAL 互動。
需求條件
這項功能須符合下列條件:
- AHAL:實作時必須使用相容的 AHAL,支援重構的 SCO 管理路徑。