Sdílet prostřednictvím


Spuštění zařízení HFP

Tento článek vysvětluje proces, kdy zařízení Bluetooth hands-free (HFP) přichází do zvukového systému.

Pro každé párované zařízení HFP, které přijde do zvukového systému, ovladač Windows zaregistruje rozhraní zařízení ve třídě GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS. Ovladač zvuku používá oznámení rozhraní zařízení k tomu, aby měl přehled o všech instancích rozhraní GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS. Ovladač zvuku volá IoRegisterPlugPlayNotification ze své rutiny ovladače AVStrMiniDevicePostStart (nebo z ekvivalentní rutiny Portcls) k registraci zpětného volání ke zjištění aktuálně nainstalovaných zařízení HFP a k oznámení o nových zařízeních HFP.

Když ovladač zvuku volá IoRegisterPlugPlayNotification, volání se provede pomocí následujících parametrů:

  • EventCategory je nastavena na EventCategoryDeviceInterfaceChange.
  • EventCategoryFlags je obvykle nastaven na PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, aby přijímal okamžitá oznámení o existujících rozhraních. Některé alternativní návrhy ovladačů zvuku však můžou najít existující rozhraní jinými způsoby.
  • EventCategoryData je nastavena na GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS.
  • DriverObject je nastaven na objekt DriverObject zvukového ovladače.
  • CallbackRoutine je nastavena na funkci v ovladači zvuku, která obdrží oznámení.

Následující části popisují úlohy, které může ovladač zvuku provádět pro každou zaregistrovanou instanci spárovaného zařízení HFP.

Zpracování instancí rozhraní

Pro každou instanci rozhraní zaregistrovanou ve třídě GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS musí ovladač zvuku pro komunikaci použít následující protokol:

  • Když systém Windows volá rutinu zpětného volání zvukového ovladače zaregistrovanou při volání IoRegisterPlugPlayNotification, systém Windows předá symbolický odkaz pro rozhraní HFP pomocí DEVICE_INTERFACE_CHANGE_NOTIFICATION. SymbolicLinkName.
  • Když ovladač zvuku volá IoGetDeviceObjectPointer, ovladač použije symbolický odkaz k získání objektu HFP FileObject a DeviceObject pro zařízení HFP.
  • Když ovladač zvuku odešle IOCTLs do ovladače HFP, ovladač použije objekt FileObject a DeviceObject pro zařízení HFP.

Načítání statických informací

Ovladač zvuku může načíst statické informace z ovladače HFP. Například ovladač HFP může poskytnout ksnodetype, ID kontejneru a popisný název spárovaného zařízení HFP. Ovladač zvuku může tyto informace použít k vytvoření a inicializaci filtru KS nebo filtrů představujících spárované zařízení HFP. Ovladač zvuku používá IOCTL_BTHHFP_DEVICE_GET_DESCRIPTOR ke získání těchto informací.

Ovladač zvuku může také načíst adresu Bluetooth spárovaného zařízení HFP. Každé spárované zařízení HFP má jedinečnou adresu Bluetooth, která může být užitečná jako řetězec jedinečného identifikátoru. Další informace naleznete v tématu Získání adresy Bluetooth zařízení HF.

Vytváření, inicializace kontextu objektu pro vytváření filtrů specifických pro zvuk

Chcete-li vytvořit a inicializovat kontext objektu pro vytváření filtrů specifické pro zvuk, musí ovladač zvuku uložit objekt HFP DeviceObject a objekt HFP FileObject v kontextu objektu pro vytváření filtrů a pak inicializovat pole IsConnected na false.

Vytvoření továrny filtrování KS

Pro každou instanci zařízení ve třídě rozhraní GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS vytvoří a povolí ovladač zvuku jednu nebo více továren filtrů.

Pokud je zvukový ovladač typu AVStream, volá funkci KsCreateFilterFactory pro přidání nové továrny filtrů a funkci KsFilterFactorySetDeviceClassesState pro povolení této továrny filtrů. Pokud je zvukový ovladač ovladačem PortCls, nepřímo vytvoří a povolí objekty pro filtrování KS voláním PcRegisterSubdevice. U mnoha návrhů zvukových ovladačů PortCls jsou pro dané spárované zařízení HFP zaregistrovaná dvě dílčí zařízení.

Každá filtrovací továrna (nebo pro zvukové ovladače PortCls, každá dvojice továren filtrů) představuje zvukové funkce jednoho spárovaného zařízení HFP. Ovladač zvuku vytvoří samostatné filtrovací továrny pro každé spárované zařízení HFP reprezentované jedinečnými instancemi rozhraní GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS. Pro každé spárované zařízení HFP musí ovladač zvuku používat jedinečné řetězce pro parametr RefString KsCreateFilterFactory nebo parametr Name PcRegisterSubdevice. Vývojář ovladače může považovat za užitečné použít Bluetooth adresu spárovaného zařízení HFP jako jedinečný řetězec. Informace o tom, jak načíst jedinečný řetězec, najdete v tématu Získání adresy Bluetooth zařízení HF .

Všimněte si, že neexistuje žádný konkrétní maximální počet možných spárovaných zařízení HFP, takže ovladač zvuku by se měl vyhnout pevným omezením kódování. Místo toho musí ovladač zvuku správně zpracovávat dynamické doručení a odebrání více rozhraní GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS.

V praxi ale ovladač PortCls musí při volání PcAddAdapterDevice určit maximální počet dílčích zařízení. PcAddAdapterDevice předem přidělí další paměť pro každé potenciální dílčí zařízení. Vývojář zvukového ovladače by měl vybrat číslo dostatečně vysoké, aby vyhovovalo mnoha spárovaným zařízením, ale současně vyberte číslo, které nemá za následek plýtvání prostředky. Podpora pouze dvou zařízení HFP může být například nedostatečná a podpora dvou tisíc by jistě měla za následek nadměrné prostředky. Podpora šestnácti je však pravděpodobně rozumná.

Pokud je ovladač zvuku za běhu upozorněn na jiné rozhraní GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS, ale už zaregistroval maximální počet dílčích zařízení, může zvukový ovladač vyvolat nějaký algoritmus, který zvolí spárované zařízení HFP, jehož dílčí zařízení může zrušit registraci, aby se uvolnil prostor pro nové zařízení HFP. Například ovladač zvuku může sledovat zařízení HFP s nejstarším připojením. Zatímco jednodušší, ale možná méně uživatelsky přívětivý zvukový ovladač by mohl jednoduše ignorovat další rozhraní GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS při dosažení jeho maxima.

Odeslání IOCTL pro zjištění stavu připojení

Ovladač zvuku odešle IOCTL pro zjištění stavu připojení, aby získal informace o změnách v připojení.

Odeslání IOCTL pro zjištění stavu svazku

Ovladač zvuku odešle stav hlasitosti IOCTL, aby získal informace o všech změnách úrovně hlasitosti, ke kterým došlo ve stavu hlasitosti náhlavní soupravy.