Freigeben über


HFP-Gerätestart

In diesem Artikel wird der Prozess erläutert, wenn ein HFP-Gerät (Bluetooth Hands-Free Profile) im Audiosystem eintrifft.

Für jedes gekoppelte HFP-Gerät, das im Audiosystem eingeht, registriert der Windows HFP-Treiber eine Geräteschnittstelle in der klasse GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS. Der Audiotreiber verwendet Geräteschnittstellenbenachrichtigungen, um über alle Instanzen der GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS-Schnittstellen auf dem Laufenden zu bleiben. Der Audiotreiber ruft IoRegisterPlugPlayNotification aus seiner AVStrMiniDevicePostStart-Treiberroutine (oder aus einer entsprechenden Portcls-Routine) auf, um einen Rückruf zu registrieren, um die aktuell installierten HFP-Geräte zu ermitteln und über neue HFP-Geräte benachrichtigt zu werden.

Wenn der Audiotreiber IoRegisterPlugPlayNotification aufruft, erfolgt der Aufruf mit den folgenden Parametern:

  • EventCategory ist auf EventCategoryDeviceInterfaceChange festgelegt.
  • EventCategoryFlags ist in der Regel auf PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES festgelegt, um sofortige Benachrichtigungen über vorhandene Schnittstellen zu erhalten. Einige alternative Audiotreiberdesigns können jedoch vorhandene Schnittstellen auf andere Wege finden.
  • EventCategoryData ist auf GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS festgelegt.
  • DriverObject ist auf das DriverObject des Audiotreibers festgelegt.
  • CallbackRoutine ist auf eine Routine im Audiotreiber festgelegt, der die Benachrichtigungen empfängt.

In den folgenden Abschnitten werden die Aufgaben beschrieben, die der Audiotreiber für jede registrierte instance eines gekoppelten HFP-Geräts ausführen kann.

Behandeln von Schnittstelleninstanzen

Für jede Schnittstelle instance, die in der GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS-Klasse registriert ist, muss der Audiotreiber das folgende Protokoll für die Kommunikation verwenden:

  • Wenn Windows die Rückrufroutine des Audiotreibers aufruft, die registriert wurde, wenn der Audiotreiber IoRegisterPlugPlayNotification heißt, übergibt Windows mithilfe von DEVICE_INTERFACE_CHANGE_NOTIFICATION einen symbolischen Link für die HFP-Schnittstelle. SymbolicLinkName.
  • Wenn der Audiotreiber IoGetDeviceObjectPointer aufruft, verwendet der Treiber den symbolischen Link, um das HFP-FileObject und das DeviceObject für das HFP-Gerät abzurufen.
  • Wenn der Audiotreiber IOCTLs an den HFP-Treiber sendet, verwendet der Treiber das HFP-FileObject und das DeviceObject für das HFP-Gerät.

Abrufen statischer Informationen

Der Audiotreiber kann statische Informationen vom HFP-Treiber abrufen. Der HFP-Treiber kann beispielsweise den ksnodetype, die Container-ID und den Anzeigenamen des gekoppelten HFP-Geräts angeben. Der Audiotreiber kann diese Informationen verwenden, um einen KS-Filter oder Filter zu erstellen und zu initialisieren, die das gekoppelte HFP-Gerät darstellen. Der Audiotreiber verwendet IOCTL_BTHHFP_DEVICE_GET_DESCRIPTOR , um diese Informationen abzurufen.

Der Audiotreiber kann auch die Bluetooth-Adresse des gekoppelten HFP-Geräts abrufen. Jedes gekoppelte HFP-Gerät verfügt über eine eindeutige Bluetooth-Adresse, die als eindeutige Bezeichnerzeichenfolge nützlich sein kann. Weitere Informationen finden Sie unter Abrufen der Bluetooth-Adresse des HF-Geräts.

Erstellen, Initialisieren des audiospezifischen Filterfactorykontexts

Um einen audiospezifischen Filterfactorykontext zu erstellen und zu initialisieren, muss der Audiotreiber das HFP-DeviceObject und das HFP-FileObject im Kontext der Filterfactory speichern und dann das IsConnected-Feld mit false initialisieren.

Erstellen der KS-Filterfactory

Für jedes Gerät instance in der GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS-Schnittstellenklasse erstellt und aktiviert der Audiotreiber eine oder mehrere Filterfabriken.

Wenn der Audiotreiber ein AVStream-Treiber ist, ruft der Audiotreiber KsCreateFilterFactory auf, um die neue Filterfactory und KsFilterFactorySetDeviceClassesState hinzuzufügen, um die Factory zu aktivieren. Wenn der Audiotreiber ein PortCls-Treiber ist, wird durch den Aufruf von PcRegisterSubdevice indirekt KS-Filterfabriken erstellt und aktiviert. Für viele PortCls-Audiotreiberdesigns sind zwei Untergeräte für ein bestimmtes gekoppeltes HFP-Gerät registriert.

Jede Filterfactory (oder für PortCls-Audiotreiber jedes Paar von Filterfabriken) stellt die Audiofunktionalität eines einzelnen gekoppelten HFP-Geräts dar. Der Audiotreiber erstellt separate Filterfactorys für jedes gekoppelte HFP-Gerät, das durch eindeutige Instanzen von GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS Schnittstellen dargestellt wird. Für jedes gekoppelte HFP-Gerät muss der Audiotreiber eindeutige Zeichenfolgen für den RefString-Parameter von KsCreateFilterFactory oder den Name-Parameter von PcRegisterSubdevice verwenden. Der Treiberentwickler kann es sinnvoll finden, die Bluetooth-Adresszeichenfolge des gekoppelten HFP-Geräts als eindeutige Zeichenfolge zu verwenden. Informationen zum Abrufen der eindeutigen Zeichenfolge finden Sie unter Abrufen der Bluetooth-Adresse des HF-Geräts .

Beachten Sie, dass es keine bestimmte maximale Anzahl möglicher gekoppelter HFP-Geräte gibt, sodass der Audiotreiber bestimmte Einschränkungen bei der Hartcodierung vermeiden sollte. Stattdessen muss der Audiotreiber die dynamische Ankunft und Entfernung mehrerer GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS Schnittstellen ordnungsgemäß verarbeiten.

In der Praxis muss ein PortCls-Treiber jedoch beim Aufrufen von PcAddAdapterDevice eine maximale Anzahl von Untergeräten angeben. PcAddAdapterDevice weist jedem potenziellen Untergerät vorab zusätzlichen Arbeitsspeicher zu. Der Audiotreiberentwickler sollte eine Zahl auswählen, die hoch genug ist, um viele gekoppelte Geräte aufzunehmen, aber gleichzeitig eine Zahl auswählen, die nicht zu Einer Verschwendung von Ressourcen führt. Beispielsweise könnte die Unterstützung von nur zwei HFP-Geräten unzureichend sein, und die Unterstützung von zweiTausenden würde sicherlich zu übermäßig beanspruchten Ressourcen führen. Es ist jedoch wahrscheinlich sinnvoll, sechzehn zu unterstützen.

Wenn der Audiotreiber zur Laufzeit über eine andere GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS-Schnittstelle benachrichtigt wird, aber bereits die maximale Anzahl von Untergeräten registriert hat, kann der Audiotreiber einen Algorithmus aufrufen, um ein gekoppeltes HFP-Gerät auszuwählen, dessen Untergeräte er die Registrierung aufheben kann, um Platz für das neue HFP-Gerät zu schaffen. Beispielsweise könnte der Audiotreiber das HFP-Gerät mit der ältesten Verbindung nachverfolgen. Während ein einfacherer, aber vielleicht weniger benutzerfreundlicher Audiotreiber zusätzliche GUID_DEVINTERFACE_BLUETOOTH_HFP_SCO_HCIBYPASS Schnittstelle einfach ignorieren könnte, nachdem er sein Maximum erreicht hat.

Senden der get-Verbindung status IOCTL

Der Audiotreiber sendet die Get-Verbindung status IOCTL, um Informationen zu allen Änderungen zu erhalten, die in der Verbindung aufgetreten sind.

Senden des Get-Volumes status IOCTL

Der Audiotreiber sendet die Get-Lautstärke status IOCTL, um Informationen zu änderungen der Lautstärke zu erhalten, die in der Lautstärke status des Headsets aufgetreten sind.