Dela via


Start av HFP-enhet

Den här artikeln beskriver processen när en Bluetooth handsfree-profil (HFP) ansluts till ljudsystemet.

För varje länkad HFP-enhet som kommer till ljudsystemet registrerar Windows HFP-drivrutinen ett enhetsgränssnitt i klassen GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS. Ljuddrivrutinen använder gränssnittsaviseringar för enheter för att hålla sig informerad om alla instanser av GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS-gränssnitt. Ljuddrivrutinen anropar IoRegisterPlugPlayNotification inifrån sin AVStrMiniDevicePostStart-drivrutin (eller från en motsvarande Portcls-rutin) för att registrera ett återanrop för att identifiera de för närvarande installerade HFP-enheterna och meddelas om nya HFP-enheter.

När ljuddrivrutinen anropar IoRegisterPlugPlayNotification görs anropet med hjälp av följande parametrar:

  • EventCategory är inställt på EventCategoryDeviceInterfaceChange.
  • EventCategoryFlags är vanligtvis inställd på PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES för att omedelbart få meddelanden om befintliga gränssnitt. Vissa alternativa ljuddrivrutinsdesigner kan dock hitta befintliga gränssnitt på andra sätt.
  • EventCategoryData är inställt på GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS.
  • DriverObject är inställt på ljuddrivrutinens DriverObject.
  • CallbackRoutine är inställt på en rutin i ljuddrivrutinen som tar emot meddelandena.

I följande avsnitt beskrivs de uppgifter som ljuddrivrutinen kan utföra för varje registrerad instans av en länkad HFP-enhet.

Hantera gränssnittsinstanser

För varje gränssnittsinstans som är registrerad i klassen GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS måste ljuddrivrutinen använda följande protokoll för kommunikation:

  • När Windows anropar den återanropsrutin för ljuddrivrutinen som registrerades när ljuddrivrutinen anropade IoRegisterPlugPlayNotification, skickar Windows en symbolisk länk för HFP-gränssnittet med hjälp av DEVICE_INTERFACE_CHANGE_NOTIFICATION.SymbolicLinkName.
  • När ljuddrivrutinen anropar IoGetDeviceObjectPointer använder drivrutinen den symboliska länken för att hämta HFP FileObject och DeviceObject för HFP-enheten.
  • När ljuddrivrutinen skickar IOCTLs till HFP-drivrutinen använder drivrutinen HFP FileObject och DeviceObject för HFP-enheten.

Hämtar statisk information

Ljuddrivrutinen kan hämta statisk information från HFP-drivrutinen. HFP-drivrutinen kan till exempel ange ksnodetype, container-ID och det egna namnet på den kopplade HFP-enheten. Ljuddrivrutinen kan använda den här informationen för att skapa och initiera ett KS-filter eller filter som representerar den kopplade HFP-enheten. Ljuddrivrutinen använder IOCTL_BTHHFP_DEVICE_GET_DESCRIPTOR för att hämta den här informationen.

Ljuddrivrutinen kan också hämta Bluetooth-adressen för den kopplade HFP-enheten. Varje länkad HFP-enhet har en unik Bluetooth-adress, vilket kan vara användbart som en unik identifierarsträng. Mer information finns i Hämta Bluetooth-adress för HF-enhet.

Skapa, initiera ljudspecifik filterfabrikskontext

För att skapa och initiera en ljudspecifik filterfabrikskontext måste ljuddrivrutinen lagra HFP DeviceObject och HFP FileObject i filterfabrikskontexten och sedan initiera fältet IsConnected till false.

Skapa KS-filterfabriken

För varje enhetsinstans i GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS-gränssnittsklassen skapar och aktiverar ljuddrivrutinen en eller flera filterfabriker.

Om ljuddrivrutinen är en AVStream-drivrutin anropar ljuddrivrutinen KsCreateFilterFactory för att lägga till den nya filterfabriken och KsFilterFactorySetDeviceClassesState för att aktivera fabriken. Om ljuddrivrutinen är en PortCls-drivrutin skapar den indirekt och aktiverar KS-filterfabriker genom att anropa PcRegisterSubdevice. För många PortCls-ljuddrivrutinsdesigner finns det två underenheter registrerade för en viss parkopplad HFP-enhet.

Varje filterfabrik (eller, för PortCls-ljuddrivrutiner, varje par filterfabriker) representerar ljudfunktionerna för en enda parkopplad HFP-enhet. Ljuddrivrutinen skapar separata filterfabriker för varje länkad HFP-enhet som representeras av unika instanser av GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS gränssnitt. För varje parkopplad HFP-enhet måste ljuddrivrutinen använda unika strängar för parametern RefString i KsCreateFilterFactory, eller parametern Namn för PcRegisterSubdevice. Drivrutinsutvecklaren kan ha nytta av att använda den kopplade HFP-enhetens Bluetooth-adresssträng som en unik sträng. Mer information om hur du hämtar den unika strängen finns i Hämta Bluetooth-adress för HF-enhet .

Observera att det inte finns något specifikt maximalt antal möjliga parkopplade HFP-enheter, så ljuddrivrutinen bör undvika hårdkodningsspecifika begränsningar. Istället måste ljuddrivrutinen hantera den dynamiska ankomsten och borttagningen av flera GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS-gränssnitt på rätt sätt.

I praktiken måste dock en PortCls-drivrutin ange ett maximalt antal underenheter när den anropar PcAddAdapterDevice. PcAddAdapterDevice förallokerar extra minne för varje potentiell underenhet. Ljuddrivrutinsutvecklaren bör välja ett tal som är tillräckligt högt för att rymma många parkopplade enheter, men samtidigt välja ett tal som inte resulterar i slöseri med resurser. Till exempel kan stöd för endast två HFP-enheter vara otillräckligt, och stöd för två tusen skulle säkert resultera i överuttenta resurser. Det är dock troligt att det är rimligt att stödja sexton.

Om ljuddrivrutinen vid körning får besked om ett annat GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS-gränssnitt, men redan har registrerat sitt maximala antal subenheter, kan ljuddrivrutinen använda en algoritm för att välja en parkopplad HFP-enhet vars subenheter den kan avregistrera för att göra plats för den nya HFP-enheten. Ljuddrivrutinen kan till exempel hålla reda på HFP-enheten med den äldsta anslutningen. Medan en enklare men kanske mindre användarvänlig ljuddrivrutin helt enkelt kan ignorera ytterligare GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS-gränssnittet efter att ha nått sin högsta kapacitet.

Skicka statusen hämta anslutningsstatus iOCTL

Ljuddrivrutinen skickar IOCTL-förfrågan om anslutningsstatus för att få information om eventuella ändringar som har inträffat i anslutningen.

Skicka begäran om volymstatus med IOCTL

Ljuddrivrutinen skickar get volume status IOCTL för att få information om ändringar i volymnivån som har inträffat i volymstatusen för headsetet.