HFP 裝置連線
本文討論音訊系統如何判斷及處理藍牙免持式配置檔的連線狀態資訊, (HFP) 裝置。
音訊驅動程式必須支援 KSPROPERTY_JACK_DESCRIPTION ,並在篩選處理站內容中維護 IsConnected 字段。 驅動程式在處理 KSPROPERTY_JACK_DESCRIPTION 屬性時會使用這個值。
IOCTL_BTHHFP_DEVICE_GET_CONNECTION_STATUS_UPDATE成功完成時,音訊驅動程式會以新的連線狀態更新IsConnected。 如果狀態已變更,音訊驅動程式會引發 KSEVENT_PINCAPS_JACKINFOCHANGE 事件,導致音訊系統重新評估連線狀態。 音訊驅動程式接著會呼叫另一個 實例IOCTL_BTHHFP_DEVICE_GET_CONNECTION_STATUS_UPDATE ,以接收下一個狀態變更。 如果先前的狀態變更要求仍在擱置中,則第二次呼叫會失敗,而且音訊驅動程式不會更新其連線狀態,也不會對狀態變更資訊提出另一個要求。
如 核心串流考慮中所述,音訊驅動程式必須支援 KSPROPERTY_ONESHOT_RECONNECT 和 KSPROPERTY_ONESHOT_DISCONNECT。 這些屬性的處理程式必須將 REQUESTCONNECT 和 REQUESTDISCONNECT IOCTLs 分別傳送至 HFP 驅動程式。 這些 IOCTL 會快速完成,而且音訊驅動程式必須準備好回應傳回的結果。
本文也涵蓋音訊驅動程式開發人員必須注意的其他藍牙音訊裝置連線相關因素。
串流通道
串流通道代表音訊驅動程式配置無線頻寬。 在大部分情況下,這是 SCO 通道。 不過,管理 SCO 通道狀態的某些詳細數據會完全在 HFP 驅動程式內處理。 這包括遠端中斷連線,這可能是因為 HF 會起始音訊傳輸至 AG (電腦在此案例中扮演 AG 角色的案例) 。
音訊篩選釘選狀態
音訊驅動程式會實作兩個 KS 針腳的 KS 針腳狀態處理程式。 其中一個針腳必須有 SCO 串流通道,才能透過無線傳輸數據。 當其中一個針腳轉換成KSSTATE_ACQUIRE時,音訊驅動程式會傳送 IOCTL_BTHHFP_STREAM_OPEN 至 HFP 驅動程式來開啟通道。 這個異步呼叫可能需要幾秒鐘的時間才能完成。 音訊驅動程式不需要實作自己的逾時機制,而且應該等候IOCTL完成,再完成轉換至KSSTATE_ACQUIRE。
當這兩個 KS 針腳轉換成KSSTATE_STOP時,音訊驅動程式會將 IOCTL_BTHHFP_STREAM_CLOSE 傳送至 HFP 驅動程式,這會快速完成。
若要判斷何時要傳送 IOCTL_BTHHFP_STREAM_OPEN 和 IOCTL_BTHHFP_STREAM_CLOSE,音訊驅動程式可以使用簡單的參考計數機制來追蹤需要 SCO 串流通道的針腳數目。 當參考計數從 0 變更為 1 時,音訊驅動程式會開啟並關閉 SCO 串流通道。
在 IOCTL_BTHHFP_STREAM_OPEN上,HFP 驅動程式會要求 SCO 通道,如果尚未開啟,則會以 SCO 要求的結果完成要求。 在 IOCTL_BTHHFP_STREAM_CLOSE時,HFP 驅動程式會在開啟時要求 SCO 通道中斷連線。
遠端 SCO 連線和中斷連線
在遠端 SCO 中斷連線時,如果串流通道已關閉,HFP 驅動程式就不會執行任何動作。 如果開啟串流通道,HFP 驅動程式會啟動重新連線定時器。 當定時器到期時,如果 SCO 仍然中斷連線,而且串流通道仍然開啟,驅動程式會要求 SCO 通道。 請注意,當 SCO 中斷連線時,不會透過無線傳輸任何音訊數據,因此在此期間內音訊會有間距。 如果 SCO 要求失敗,HFP 驅動程式會藉由完成任何叫用 IOCTL_BTHHFP_STREAM_GET_STATUS_UPDATE,向音訊驅動程式發出串流通道狀態變更的訊號。 這應該很少見,因為遠端 SCO 中斷連線通常與要求將通話音訊傳輸至音訊閘道的 HF 裝置相關聯。 音訊驅動程式應該將此視為中串流錯誤狀況。
此程式可讓 VoIP 應用程式從 CallButtons API 接收音訊傳輸回呼,並在 HFP 端點上清除釋放其音訊資源,而不是造成串流錯誤。
在遠端 SCO 連線上,如果串流通道已開啟,驅動程式只會接受連線。 如果串流通道已關閉,HFP 驅動程式會接受連線並啟動中斷連線定時器。 當中斷連線定時器到期時,如果 SCO 仍然連線,而且數據流通道仍然關閉,驅動程式會中斷 SCO 連線。
此程式可讓 VoIP 應用程式從 CallButtons API 接收音訊傳輸回呼,並在 HFP 端點上建立音訊資源,而不會提前拒絕或關閉 SCO 連線。