共用方式為


HFP 裝置啟動

本文說明當藍牙免操作配置檔 (HFP) 裝置抵達音訊系統時的程式。

對於抵達音訊系統的每個配對 HFP 裝置,Windows HFP 驅動程式會在 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 類別中註冊裝置介面。 音訊驅動程式會使用裝置介面通知,隨時掌握GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS介面的所有實例。 音訊驅動程式會從其AVStrMiniDevicePostStart驅動程式例程內呼叫IoRegisterPlugPlayNotification,或從對等的 Portcls 例程 () 呼叫 IoRegisterPlugPlayNotification,以註冊回呼以探索目前安裝的 HFP 裝置,並收到新 HFP 裝置的通知。

當音訊驅動程式呼叫 IoRegisterPlugPlayNotification 時,會使用下列參數進行呼叫:

  • EventCategory 設定為 EventCategoryDeviceInterfaceChange。
  • EventCategoryFlags 通常會設定為 PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES,以接收現有介面的立即通知。 不過,某些替代音訊驅動程序設計可能會透過其他方式尋找現有的介面。
  • EventCategoryData 設定為 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS。
  • DriverObject 會設定為音訊驅動程式的 DriverObject。
  • CallbackRoutine 會設定為音訊驅動程式中的例程,以接收通知。

下列各節概述音訊驅動程式可以針對配對 HFP 裝置的每個已註冊實例執行的工作。

處理介面實例

針對在 GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS 類別中註冊的每個介面實例,音訊驅動程序必須使用下列通訊協議來進行通訊:

  • 當 Windows 在音訊驅動程式呼叫 IoRegisterPlugPlayNotification 時註冊音訊驅動程式的回呼例程時,Windows 會使用 DEVICE_INTERFACE_CHANGE_NOTIFICATION 傳遞 HFP 介面的符號連結。SymbolicLinkName
  • 當音訊驅動程式呼叫IoGetDeviceObjectPointer時,驅動程式會使用符號連結來取得HFP FileObject和HFP裝置的DeviceObject。
  • 當音訊驅動程式將IOCTLs傳送至HFP驅動程式時,驅動程式會使用HFP FileObject和HFP裝置的DeviceObject。

擷取靜態資訊

音訊驅動程式可以從 HFP 驅動程式擷取靜態資訊。 例如,HFP 驅動程式可以提供 ksnodetype、容器標識碼,以及配對 HFP 裝置的易記名稱。 音訊驅動程式可以使用這項資訊來建立及初始化代表配對HFP裝置的 KS 篩選器或篩選器。 音訊驅動程式會使用 IOCTL_BTHHFP_DEVICE_GET_DESCRIPTOR 來取得這項資訊。

音訊驅動程式也可以擷取配對HFP裝置的藍牙位址。 每個配對的 HFP 裝置都有唯一的藍牙位址,可作為唯一標識符字串。 如需詳細資訊,請參閱 取得 HF 裝置的藍牙位址

建立、初始化音訊特定的篩選處理站內容

若要建立和初始化音訊特定的篩選處理站內容,音訊驅動程序必須將 HFP DeviceObject 和 HFP FileObject 儲存在篩選處理站內容中,然後將 IsConnected 字段初始化為 false。

建立 KS 篩選處理站

針對GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS介面類別中的每個裝置實例,音訊驅動程式會建立並啟用一或多個篩選處理站。

如果音訊驅動程式是AVStream驅動程式,音訊驅動程式會呼叫 KsCreateFilterFactory 來新增篩選處理站和 KsFilterFactorySetDeviceClassesState 以啟用 Factory。 如果音訊驅動程式是 PortCls 驅動程式,則會藉由呼叫 PcRegisterSubdevice 間接建立並啟用 KS 篩選處理站。 針對許多 PortCls 音訊驅動程式設計,針對指定的配對 HFP 裝置註冊了兩個子裝置。

每個篩選處理站 (,或針對 PortCls 音訊驅動程式,每對篩選處理站) 代表單一配對 HFP 裝置的音訊功能。 音訊驅動程式會針對GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS介面的唯一實例所代表的每個配對 HFP 裝置,建立個別的篩選處理站。 對於每個配對的 HFP 裝置,音訊驅動程式必須為 KsCreateFilterFactory 的 RefString 參數使用唯一字串,或 PcRegisterSubdevice 的 Name 參數。 驅動程式開發人員可能會發現使用配對 HFP 裝置的藍牙位址字串作為唯一字串會很有用。 如需如何擷取唯一字串的相關信息,請參閱 取得 HF 裝置的藍牙位址

請注意,沒有特定的可能配對 HFP 裝置數目上限,因此音訊驅動程式應該避免硬式編碼特定限制。 相反地,音訊驅動程式必須正確地處理多個GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS介面的動態抵達和移除。

不過,在呼叫 PcAddAdapterDevice 時,PortCls 驅動程式必須指定子裝置數目上限。 PcAddAdapterDevice 會預先配置每個潛在子裝置的額外記憶體。 音訊驅動程式開發人員應該選取足以容納許多配對裝置的數位,但同時選取不會浪費資源的數位。 例如,僅支援兩個 HFP 裝置可能不足,而支援 2 千個,確實會導致過度擴充的資源。 不過,支援十六個可能是合理的。

如果在運行時間,音訊驅動程式收到另一個GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS介面的通知,但已註冊其子裝置數目上限,則音訊驅動程式可以叫用一些演算法來選擇配對的 HFP 裝置,其子裝置可以取消註冊以讓新的 HFP 裝置有空間。 例如,音訊驅動程式可以使用最舊的連線來追蹤 HFP 裝置。 雖然較簡單但可能較不方便使用的音訊驅動程式可能只會忽略達到最大值之後的額外GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS介面。

傳送取得連線狀態 IOCTL

音訊驅動程式會傳送取得連線狀態 IOCTL,以取得連線中發生之任何變更的相關信息。

傳送取得磁碟區狀態 IOCTL

音訊驅動程式會傳送取得音量狀態 IOCTL,以取得在頭戴式裝置音量狀態中發生之任何音量層級變更的相關信息。