Freigeben über


Bluetooth Low Energy (LE)-Audio

Dieser Artikel enthält eine Übersicht über Bluetooth LE Audio, die in Windows 11, Version 22H2 (KB5026446) eingeführt wurde.

Einleitung

Bluetooth LE Audio ermöglicht das Streamen von Unicast-Audio oder das Übertragen von Broadcast-Audio an Bluetooth LE-Geräte über einen isochronen Transport. Ab Version 5.3 der Bluetooth Core-Spezifikation gibt es keine standarddefinierte Hostcontrollerschnittstelle (HCI) für Hostplattformen zum Senden und Empfangen von isochronen Daten an und vom Bluetooth-Controller. In diesem Dokument wird der spezifische Audiopfad (VSAP) für Windows Bluetooth definiert, um Plattformen die Verwendung von herstellerspezifischen Lösungen zur Aktivierung des Bluetooth LE-Audiostreamings zu ermöglichen. Die VSAP-Softwareschnittstelle verwendet Windows-Audioklassenerweiterungen (ACX) und weitere Schnittstelleneigenschaften, die in diesem Dokument definiert sind.

Terminologie und Voraussetzungen

Zusätzlich zu den in dieser Tabelle definierten Begriffen verweist dieses Dokument auch auf Begriffe, die von Windows-Audioklassenerweiterungen definiert sind.

Begriff Definition
LE-Audio Kurz für Bluetooth LE Audio
Klassisches Audio Bluetooth-Audiostreaming, das das freihändige Profil (HFP) und erweiterte Audioverteilungsprofil (A2DP) verwendet
Audiogerät Ein einzelnes Remote-Bluetooth LE-Audiogerät oder eine Gruppe von Bluetooth LE Audio-Geräten, die zusammen einen einzelnen Audioendpunkt aus der Perspektive von Windows erstellen.
BAP Das Grundlegende Audioprofil definiert, wie Geräte Audio mithilfe von Bluetooth Low Energy (LE)-Kommunikation verteilen und nutzen können.
TMAP Das Telefonie- und Medienaudioprofil gibt interoperable Konfigurationen von Audiodiensten und Profilen auf niedrigerer Ebene an.
ASCS Der Audiostream-Steuerungsdienst definiert eine Standardmethode für Bluetooth LE-Audiogeräte zum Konfigurieren und Einrichten von Unicast-Audiostreams.
PACS Der Published Audio Capabilities Service definiert eine Standardmethode für Bluetooth LE-Audiogeräte, um ihre unterstützten Audiocodec-Fähigkeiten zu melden.
CIS Der Transport von verbundenen isochronen Streams wird verwendet, um Unicast-Audiodaten zwischen Bluetooth LE-Geräten zu senden und zu empfangen.
BIS Der Übertragung isochroner Stream-Transport wird für verbindungslose Audiodatenübertragungen verwendet.
ACX Abkürzung für Audioklassenerweiterungen, bei denen es sich um das Treibermodell handelt, das von allen Audiotreibern benötigt wird, um Bluetooth LE Audio unter Windows zu unterstützen.
Streamingschaltungen Mindestens ein ACXCIRCUIT-Objekt, das vom anbieterspezifischen Audio-Treiberstapel für seinen Streaming-Pfad erstellt wurde.
Profilschaltung Ein ACXCIRCUIT-Objekt , das von der Bluetooth LE-Audioprofilimplementierung unter Windows erstellt wurde. Dieser ACXCIRCUIT ist kein Streaming-Schaltkreis.

In diesem Artikel wird davon ausgegangen, dass sie mit den zuvor definierten Begriffen und den folgenden HCI-Befehlen vertraut sind, die in der Bluetooth Core-Spezifikation definiert sind:

  • Befehle des lokalen Controllers
    • HCI_Read_Local_Supported_Codecs (v2)
    • HCI_Read_Local_Supported_Codec_Capabilities
    • HCI_LE_Setup_ISO_Data_Path
    • HCI_LE_Remove_ISO_Data_Path
    • HCI_Configure_Data_Path
  • Unicast Streaming-Befehle
    • HCI_LE_Set_CIG_Parameters
    • HCI_LE_Create_CIS
    • HCI_LE_Remove_CIG
  • Streamingbefehle übertragen
    • HCI_LE_Create_BIG
    • HCI_LE_Terminate_BIG
    • HCI_LE_BIG_Create_Sync
    • HCI_LE_BIG_Terminate_Sync
    • HCI_LE_Set_Periodic_Advertising_Parameters
    • HCI_LE_Set_Periodic_Advertising_Data
    • HCI_LE_Set_Periodic_Advertising_Enable
    • HCI_LE_Periodic_Advertising_Create_Sync
    • HCI_LE_Periodic_Advertising_Create_Sync_Cancel
    • HCI_LE_Periodic_Advertising_Terminate_Sync
    • HCI_LE_Set_Periodic_Advertising_Receive_Enable
    • HCI_LE_Periodic_Advertising_Report
    • HCI_LE_BIGInfo_Advertising_Report
    • HCI_LE_Read_Periodic_Advertiser_List_Size
    • HCI_LE_Add_Device_To_Periodic_Advertiser_List
    • HCI_LE_Remove_Device_From_Periodic_Advertiser_List
    • HCI_LE_Clear_Periodic_Advertiser_List
    • HCI_LE_Periodic_Advertising_Set_Info_Transfer
    • HCI_LE_Periodic_Advertising_Sync_Transfer
    • HCI_LE_Set_Default_Periodic_Advertising_Sync_Transfer_Parameters
    • HCI_LE_Set_Periodic_Advertising_Sync_Transfer_Parameters

Bluetooth LE Audio VSAP erfordert, dass die Audiotreiber das ACX-Framework verwenden. Die Einführung von ACX für Bluetooth LE Audio bietet mehrere Vorteile, z. B.:

  • Unterstützt das bevorzugte Audiotreibermodell für Windows in Zukunft.
  • Verwendet die systemeigene Unterstützung von ACX für Multistapel-Audiolösungen, ohne dass ein dedizierter DDI zwischen Treibern erforderlich ist.
  • Erfordert nicht, dass IHV-Audiotreiber Anforderungen vom Audiosystem an den Bluetooth-Stapel weiterleiten. Stattdessen kann ACX Anforderungen direkt über den Profilkreis an den Bluetooth-Stack senden.

Architektur

Definitionen

Die folgenden Komponenten sind an den verschiedenen VSAP-Architekturvarianten beteiligt.

Windows ACX-Framework

Diese Komponente ermöglicht die Unterstützung für einen Multi-Stack-Audioendpunkt. Bei Bluetooth LE Audio bestehen die Softwarekomponenten, die einen Audioendpunkt ausmachen, aus dem herstellerspezifischen Audiotreiber-Stack und dem Windows Bluetooth LE Audio-Profil.

Anbieterspezifischer Audiotreiberstapel

Diese herstellerspezifische Komponente ist für das Senden und Empfangen von Bluetooth LE Audio-Daten an und von einem Bluetooth-Controller über eine vom Hersteller definierte Audioschnittstelle verantwortlich. Sie besteht aus mindestens einem ACX-Streamingtreiber, um die eingehenden und ausgehenden Audiodaten zu verwalten. Weitere ACX-Treiber sind möglicherweise enthalten, wenn sie teile des ACX-Audioendpunkts mit mehreren Schaltungen sind. Diese Komponente wird auch als IHV ACX Streaming Driver in diesem Dokument bezeichnet.

Windows Bluetooth LE Audio-Profil

Diese Komponente enthält die Implementierung des Grundlegenden Audioprofils (BAP), des Lautstärkesteuerungsprofils und des Mikrofonsteuerungsprofils. Es ist für das Erstellen des Steuerelements ACXCIRCUIT für jedes Bluetooth LE Audio-Gerät oder eine Gruppe von Geräten verantwortlich, die mit Windows gekoppelt sind. Außerdem werden Audioformate vom Remotegerät und Bluetooth-Controller gemeldet und der Status von isochronen Kanälen und Gruppen verwaltet.

Windows Bluetooth Core Stack

Diese Komponente bietet eine Schnittstelle, über die das Windows Bluetooth LE-Audioprofil unterstützte Codec-Funktionen vom lokalen Bluetooth-Controller abfragen und den Status von isochronen Kanälen und Gruppen verwalten kann.

LC3-Codec

Diese Unterkomponente übersetzt zwischen komprimierten LC3-Audio- und PCM-Audiodaten. Sie muss sowohl Codierungs- als auch Decodierungsfunktionen unterstützen. Der LC3-Codec kann als Teil des anbieterspezifischen Audiotreiberstapels (VSAP) in Software implementiert werden. Alternativ kann sie als Teil des Audio-DSP oder Bluetooth-Controllers in der Hardware implementiert werden. Das Diagramm erwähnt LC3 namentlich, da es sich um den Standard-Codec handelt, der von der Bluetooth SIG unterstützt wird. Zukünftige Codecs und herstellerspezifische Codecs, die von Windows unterstützt werden, können auch auf ähnliche Weise in die Architektur integriert werden.

Architekturvarianten

Die Bluetooth LE Audio VSAP-Architektur unterstützt verschiedene Varianten für Streaming.

  1. Sideband-Bluetooth-LE-Audio-Streaming ohne Audio-Auslagerung
  2. Sideband Bluetooth LE Audio-Streaming mit Audio-Auslagerung
  3. Herstellerspezifisches Inband Bluetooth LE Audio Streaming

In den folgenden Diagrammen werden die schattierten Komponenten vom IHV bereitgestellt, und die nicht schattenfreien Komponenten werden vom Betriebssystem bereitgestellt.

Sideband-Bluetooth-LE-Audio-Architektur ohne Audioentlastung

Eine Sidebandarchitektur verwendet eine herstellerspezifische Audioschnittstelle, um dem Stapel des Audiotreibers das Senden und Empfangen von Audiodaten an den Bluetooth-Controller zu ermöglichen. Dieser Datenpfad ist vom HCI-Datenpfad getrennt, der für andere Bluetooth-Daten verwendet wird, z. B. signalisieren von Nachrichten zwischen dem Unicast-Client und dem Remote-Unicast-Server. Im folgenden Diagramm wird eine Sidebandarchitektur modelliert, in der der LC3-Codec im Bluetooth-Controller gehostet wird. Es ist auch möglich, den LC3-Codec als Teil des anbieter­spezifischen Audio­treiber­stapels zum Zweck der Software-Codierung und -Decodierung zu hosten. In diesem Fall würde das an den Bluetooth-Controller gesendete Audio als LC3-Audioframes anstelle von PCM-Audio formatiert.

Das folgende Diagramm zeigt eine Sideband Bluetooth LE Audio-Architektur mit einem LC3-Codec im Bluetooth-Controller.

Diagramm der Sideband Bluetooth LE Audio-Architektur mit LC3-Codec im Bluetooth-Controller.

Das folgende Diagramm zeigt eine Sideband Bluetooth LE Audio-Architektur mit einem LC3-Codec im Audiotreiberstapel.

Diagramm der Sideband Bluetooth LE Audio-Architektur mit LC3-Codec im Audiotreiberstapel.

Sideband-Bluetooth-LE-Audio-Architektur mit Audio-Offload

Eine Sideband-Architektur mit Audio offload umfasst eine Audio-DSP-Hardwarekomponente, um eine Bluetooth LE Audio Streaming-Lösung mit leistungssparenden Vorteilen bereitzustellen. Die folgenden Diagramme veranschaulichen eine mögliche Architektur mit dem LC3-Codec im Bluetooth-Controller und dem Codec im Audio-DSP.

Das folgende Diagramm zeigt ein Sideband Bluetooth LE Audio mit Audio offload-Architektur mit einem LC3-Codec im Bluetooth-Controller.

Diagramm von Sideband Bluetooth LE Audio mit Audio offload-Architektur mit LC3-Codec im Bluetooth-Controller.

Das folgende Diagramm zeigt ein Sideband Bluetooth LE Audio mit Audio offload-Architektur mit einem LC3-Codec im Audio-DSP.

Diagramm eines Sideband-Bluetooth-LE-Audios mit Architektur zur Audioauslagerung, das einen LC3-Codec im Audio-DSP verwendet.

Herstellerspezifischer Inband-Bluetooth LE-Audioarchitektur

Die VSAP-Inbandarchitektur ermöglicht es einer benutzerdefinierten Pipeline, Bluetooth LE-Audiodaten vom herstellerspezifischen Audiotreiberstapel an den HCI des Bluetooth-Controllers zu senden und zu empfangen. Diese Architektur enthält eine neue Komponente, die "IHV ISO Merge Component". Diese Komponente ist für die Verwaltung der Flusssteuerung für die ISO-Daten verantwortlich. Sie muss auch die HCI-Befehlsflusssteuerung mit dem Windows Bluetooth Core Stack teilen, wenn sie HCI-Befehle senden muss.

Das folgende Diagramm zeigt eine anbieterspezifische Inband-Bluetooth-LE-Audio-Architektur.

Diagramm der herstellerspezifischen Inband-Bluetooth-LE-Audio-Architektur.

Detailliertes Design

Anforderungen an das Audioformat

KSAUDIO_PACKETSIZE_CONSTRAINTS2

IHV ACX-Audiotreiber sind erforderlich, um die KSAUDIO_PACKETSIZE_CONSTRAINTS2-Eigenschaft zu unterstützen. Die Unterstützung dieser Eigenschaft reduziert die Zeit zwischen dem Hinzufügen eines Bluetooth LE-Audiogeräts zu Fenstern und dem Audiogerät, das für Anwendungen zum Streaming verfügbar wird.

Dauer des Audioframes

Bluetooth LE Audioprofile ermöglichen Implementierungen die Unterstützung des Audiostreamings mit Framedauern von 7,5 Millisekunden oder 10 Millisekunden. Windows erfordert Codecs, die von IHVs bereitgestellt werden, um beide Framedauern zu unterstützen. Diese Anforderung gewährleistet die Interoperabilität mit Bluetooth LE-Audiozubehörgeräten und die Qualität der Koexistenz mit anderen Bluetooth LE-Geräten, die mit dem System verbunden sind.

Definitionen des Signalverarbeitungsmodus

Bluetooth LE Audio unterstützt eine Vielzahl von Streamingformaten, um verschiedene Benutzerszenarien zu unterstützen. Die BAP- und TMAP-Spezifikationen definieren obligatorische unterstützte Formate für die Zertifizierung. Windows wendet Audiosignalverarbeitungsmodi an, um das Format zu korrelieren, das mit dem Szenario verwendet wird, das das System ausführt. Audiotreiber, die Bluetooth LE Audio unterstützen, müssen die Unterstützung für die Signalverarbeitungsmodi und -formate in der folgenden Tabelle angeben. Darüber hinaus unterstützt Bluetooth LE Audio den Rohsignalverarbeitungsmodus nicht, sodass Audiotreiber keine unterstützten Formate für diesen Modus bewerben.

Unicast rendern Stream-Audioformate und Signalverarbeitungsmodi

Bluetooth LE Audio erfordert, dass Unicast-Renderaudioformate für die folgenden Signalverarbeitungsmodi deklariert werden:

  • Standard (AUDIO_SIGNALPROCESSINGMODE_DEFAULT)
    • Dieser Modus wird für unidirektionale Renderszenarien verwendet, z. B. Musikwiedergabe, Benachrichtigungen und Videospielaudio.
  • Kommunikation (AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS)
    • Dieser Modus wird für bidirektionale Szenarien wie Sprachanrufe verwendet.

Die folgenden Tabellen sind Listen symmetrischer Formate für jeden Anwendungsfall- und Signalverarbeitungsmodus. Die Unterstützung für asymmetrische Formate ist in Super wideband Stereo für Sprachszenarien definiert.

Audioformate werden von den am häufigsten bevorzugten bis zum am wenigsten bevorzugten sortiert.

Systemsounds, Musikwiedergabe und Videospielaudio, wenn eine Verbindung mit einem Stereogerät oder einer koordinierten Gruppe von Geräten hergestellt wird

Signalverarbeitungsmodus: Standard

Abtastfrequenz Kanalanzahl Bittiefe Framedauer Audiodatenrate BAP-Codec-Konfigurations-ID (Tabelle 3.11 der BAP-Spezifikation)
48 kHz 2 16 7,5 ms 96 kbit/s 48_3
48 kHz 2 16 7,5 ms 80 kbit/s 48_1
48 kHz 2 16 10 ms 96 kbit/s 48_4
48 kHz 2 16 10 ms 80 kbit/s 48_2
32 kHz 2 16 7,5 ms 64 kbit/s 32_1
32 kHz 2 16 10 ms 64 kbit/s 32_2
24 kHz 2 16 7,5 ms 48 KBit/s 24_1
24 kHz 2 16 10 ms 48 KBit/s 24_2
Systemsounds, Musikwiedergabe und Audiowiedergabe von Videospielen, wenn sie mit einem einzelnen Element einer koordinierten Einheit verbunden sind (einzelner Ohrhörer oder Hörgerät).

Signalverarbeitungsmodus: Standard

Abtastfrequenz Kanalanzahl Bittiefe Framedauer Audiodatenrate BAP-Codec-Konfigurations-ID (Tabelle 3.11 der BAP-Spezifikation)
48 kHz 1 16 7,5 ms 96 kbit/s 48_3
48 kHz 1 16 7,5 ms 80 kbit/s 48_1
48 kHz 1 16 10 ms 96 kbit/s 48_4
48 kHz 1 16 10 ms 80 kbit/s 48_2
32 kHz 1 16 7,5 ms 64 kbit/s 32_1
32 kHz 1 16 10 ms 64 kbit/s 32_2
24 kHz 1 16 7,5 ms 48 KBit/s 24_1
24 kHz 1 16 10 ms 48 KBit/s 24_2
16 kHz 1 16 7,5 ms 32 kbit/s 16_1
16 kHz 1 16 10 ms 32 kbit/s 16_2
Rendern von Sprachrekordern, VOIP-Anrufen oder Videospielaudio mit Sprachchat

Signalverarbeitungsmodus: Kommunikation

Abtastfrequenz Kanalanzahl Bittiefe Framedauer Audiodatenrate BAP-Codec-Konfigurations-ID (Tabelle 3.11 der BAP-Spezifikation)
32 kHz 1 16 7,5 ms 64 kbit/s 32_1
32 kHz 1 16 10 ms 64 kbit/s 32_2
24 kHz 1 16 7,5 ms 48 KBit/s 24_1
24 kHz 1 16 10 ms 48 KBit/s 24_2
16 kHz 1 16 7,5 ms 32 kbit/s 16_1
16 kHz 1 16 10 ms 32 kbit/s 16_2
Unicast-Aufnahmedatenstrom-Audioformate und Signalverarbeitungsmodi

Bluetooth LE Audio erfordert, dass Unicast-Aufnahmeaudioformate für den Standardsignalverarbeitungsmodus (AUDIO_SIGNALPROCESSINGMODE_DEFAULT) deklariert werden. Die Liste der unterstützten Aufnahmeformate befindet sich in der folgenden Tabelle.

Audioformate werden von den am häufigsten bevorzugten bis zum am wenigsten bevorzugten sortiert.

Aufzeichnen von Sprachrekordern, VOIP-Anrufen oder Videospielaudio mit Sprachchat

Signalverarbeitungsmodus: Standard

Abtastfrequenz Kanalanzahl Bittiefe Framedauer Audiodatenrate BAP-Codec-Konfigurations-ID (Tabelle 3.11 der BAP-Spezifikation)
32 kHz 1 16 7,5 ms 64 kbit/s 32_1
32 kHz 1 16 10 ms 64 kbit/s 32_2
24 kHz 1 16 7,5 ms 48 KBit/s 24_1
24 kHz 1 16 10 ms 48 KBit/s 24_2
16 kHz 1 16 7,5 ms 32 kbit/s 16_1
16 kHz 1 16 10 ms 32 kbit/s 16_2
Audiosignalverarbeitungsmodi übertragen

Windows Bluetooth LE-Audio erfordert, dass Audioformate der Übertragung (Render) für den Standardsignalverarbeitungsmodus (AUDIO_SIGNALPROCESSINGMODE_DEFAULT) deklariert werden.

Windows Bluetooth LE Audio erfordert, dass Audioformate für den Standardsignalverarbeitungsmodus (AUDIO_SIGNALPROCESSINGMODE_DEFAULT) deklariert werden.

Die folgende vollständige Liste der erforderlichen unterstützten Formate ist für beide Rollen identisch.

Stereoübertragungsstream für Systemsounds, Musikwiedergabe und Videospielaudio

Signalverarbeitungsmodus: Standard

Abtastfrequenz Kanalanzahl Bittiefe Framedauer Audiodatenrate BAP-Codec-Konfigurations-ID (Tabelle 3.11 der BAP-Spezifikation)
48 kHz 2 16 7,5 ms 96 kbit/s 48_3
48 kHz 2 16 7,5 ms 80 kbit/s 48_1
48 kHz 2 16 10 ms 96 kbit/s 48_4
48 kHz 2 16 10 ms 80 kbit/s 48_2
24 kHz 2 16 7,5 ms 48 KBit/s 24_1
24 kHz 2 16 10 ms 48 KBit/s 24_2
Monoübertragungsstream für Systemsounds, Musikwiedergabe und Videospielaudio

Signalverarbeitungsmodus: Standard

Abtastfrequenz Kanalanzahl Bittiefe Framedauer Audiodatenrate BAP-Codec-Konfigurations-ID (Tabelle 3.11 der BAP-Spezifikation)
48 kHz 1 16 7,5 ms 96 kbit/s 48_3
48 kHz 1 16 7,5 ms 80 kbit/s 48_1
48 kHz 1 16 10 ms 96 kbit/s 48_4
48 kHz 1 16 10 ms 80 kbit/s 48_2
24 kHz 1 16 7,5 ms 48 KBit/s 24_1
24 kHz 1 16 10 ms 48 KBit/s 24_2
16 kHz 1 16 7,5 ms 32 kbit/s 16_1
16 kHz 1 16 10 ms 32 kbit/s 16_2

Definierte Streamkonfigurationen und Topologien

Nur-Renderkonfigurationen für Unicast
Grundlegende Audioprofilkonfiguration 1

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm, das die grundlegende Audioprofilkonfiguration 1 veranschaulicht.

Der PC ist mit einem einzelnen Audiogerät verbunden, das Monostreams unterstützt. Das einzelne Gerät kann ein eigenständiges Gerät oder ein einzelnes verbundenes Mitglied eines koordinierten Satzes sein.

Anwendungsfallbeispiele Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Medienwiedergabe Rendern:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
Aufnahme: Keine
CIS-Anzahl: 1
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Hohe Zuverlässigkeit
Sprachanruf ohne Mikrofon auf Einem Audiogerät Rendern:
Signalverarbeitungsmodus: Kommunikation
Kanalanzahl: 1
Aufnahme: Keine
CIS-Anzahl: 1
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Wiedergabe von Videospielen Rendern:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
Aufnahme: Keine
CIS-Anzahl: 1
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Grundlegende Audioprofilkonfiguration 4

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm zur Veranschaulichung der grundlegenden Audioprofilkonfiguration 4.

Der PC ist an ein einzelnes Audiogerät angeschlossen, das Stereostreams unterstützt. Das Audiogerät kann zwei Audiokanäle auf einem einzigen CIS verarbeiten.

Anwendungsfallbeispiele Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Medienwiedergabe Rendern: Signalverarbeitungsmodus: Standard
Kanalanzahl: 2
Aufnahme: Keine
CIS-Anzahl: 1
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Hohe Zuverlässigkeit Audiokanalzuweisung: Vorne links und vorne rechts
Wiedergabe von Videospielen Signalverarbeitungsmodus: Standard
Kanalanzahl: 2
Aufnahme: Keine
CIS-Anzahl: 1
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Zuordnung des Audiokanals: Vorne links und vorne rechts
Grundlegende Audioprofilkonfiguration 6(i)

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm zur Veranschaulichung der grundlegenden Audioprofilkonfiguration 6 I.

Der PC ist an ein einzelnes Audiogerät angeschlossen, das Stereostreams unterstützt. Das Audiogerät kann nur einen Audiokanal auf jedem der beiden CISs verarbeiten.

Anwendungsfallbeispiele Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Medienwiedergabe Signalverarbeitungsmodus: Standard
Kanalanzahl: 2
Aufnahme: Keine
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Hohe Zuverlässigkeit
Sprachanruf ohne Mikrofon auf Einem Audiogerät Signalverarbeitungsmodus: Kommunikation
Kanalanzahl: 1
Aufnahme: Keine
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Audiokanalzuordnung: Entweder vorne links oder vorne rechts
Wiedergabe von Videospielen Signalverarbeitungsmodus: Standard
Kanalanzahl: 2
Aufnahme: Keine
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Zuordnung des Audiokanals: Vorne links und vorne rechts
Grundlegende Audioprofilkonfiguration 6(ii)

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm zur Veranschaulichung der grundlegenden Audioprofilkonfiguration 6 II.

Der PC ist mit einer koordinierten Gruppe von Audiogeräten verbunden. Der Satz kann zwei Audiokanäle verarbeiten, wobei jedes Mitglied einen einzelnen Kanal verarbeitet.

Anwendungsfallbeispiele Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Medienwiedergabe Signalverarbeitungsmodus: Standard
Kanalanzahl: 2
Aufnahme: Keine
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Hohe Zuverlässigkeit
Sprachanruf ohne Mikrofon auf beiden Geräten Signalverarbeitungsmodus: Kommunikation
Kanalanzahl: 1
Aufnahme: Keine
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Wiedergabe von Videospielen Signalverarbeitungsmodus: Standard
Kanalanzahl: 2
Aufnahme: Keine
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Bidirektionale Unicastkonfigurationen

Bidirektionale Konfigurationen werden verwendet, wenn das Bluetooth LE-Audioprofil erkennt, dass eine Anwendung beabsichtigt, einen Aufnahme- und Renderdatenstrom auf einem Remotegerät oder einer Gruppe von Geräten zu erstellen. Anwendungen steuern die Erfassung und das Rendern von Datenströmen separat. Daher dürfen IHV-Audiotreiber und Bluetooth-Controller nach der Bereitstellung audio über eine einzelne Richtung einer bidirektionalen CIS fließen lassen. Diese Bereitstellung verwendet die HCI-Befehle "Datenpfad konfigurieren" und "LE Setup ISO Data Path".

Grundlegende Audioprofilkonfiguration 3

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm zur Veranschaulichung der grundlegenden Audioprofilkonfiguration 3.

Der PC ist mit einem einzelnen Audiogerät verbunden, das einen bidirektionalen Monostream auf einem einzigen CIS eingerichtet hat.

Anwendungsfall Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Anruf Rendern:
Signalverarbeitungsmodus: Kommunikation
Kanalanzahl: 1
Aufnahme:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
CIS-Anzahl: 1
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Wiedergabe von Videospielen mit Sprachchat Rendern:
Signalverarbeitungsmodus: Kommunikation
Kanalanzahl: 1
Aufnahme:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Grundlegende Audioprofilkonfiguration 8(i)

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm zur Veranschaulichung der grundlegenden Audioprofilkonfiguration 8 I.

Der PC ist mit einem einzelnen Audiogerät verbunden, das Stereo-Renderdatenströme und Mono-Aufnahmedatenströme unterstützt. Das Gerät kann einen Audiokanal auf einem einzelnen CIS für eine bestimmte Richtung verarbeiten.

Anwendungsfall Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Anruf Rendern:
Signalverarbeitungsmodus: Kommunikation
Kanalanzahl: 1 oder 2
Aufnahme:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Wiedergabe von Videospielen mit Sprachchat Rendern:
Signalverarbeitungsmodus: Kommunikation
Kanalanzahl: 2
Aufnahme:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Grundlegende Audioprofilkonfiguration 8(ii)

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm zur Veranschaulichung der grundlegenden Audioprofilkonfiguration 8 II.

Der PC ist mit einer koordinierten Gruppe von Audiogeräten verbunden. Jedes Setmitglied empfängt einen Kanal mit Renderaudio. Ein einzelnes Set-Element verfügt über einen etablierten Aufnahmedatenstrom. Das set-Mitglied mit dem Aufnahmedatenstrom ist das erste Set-Element, das eine Verbindung mit dem PC herstellt, der auch Aufnahmedatenströme unterstützt.

Anwendungsfall Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Anruf Rendern:
Signalverarbeitungsmodus: Kommunikation
Kanalanzahl: 1 oder 2
Aufnahme:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Wiedergabe von Videospielen mit Sprachchat Rendern:
Signalverarbeitungsmodus: Kommunikation
Kanalanzahl: 2
Aufnahme:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Nur Unicast-Erfassungskonfigurationen
Grundlegende Audioprofilkonfiguration 2

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm zur Veranschaulichung der grundlegenden Audioprofilkonfiguration 2.

Der PC ist mit einem einzelnen Audiogerät verbunden, das Mono-Aufnahmedatenströme unterstützt.

Anwendungsfall Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Sprachanruf ohne Lautsprecher auf dem Gerät Erbringen: Nichts
Aufnahme:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
CIS-Anzahl: 1
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Grundlegende Audioprofilkonfiguration 9(i)

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm zur Veranschaulichung der grundlegenden Audioprofilkonfiguration 9 I.

Der PC ist mit einem einzelnen Audiogerät verbunden, das das Senden von Stereo-Audiodaten unterstützt. Das Gerät kann einen Audiokanal auf einem einzigen CIS codieren.

Anwendungsfall Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Mikrofonaufnahme mit mehreren Kanälen Erbringen: Nichts
Aufnahme:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Grundlegende Audioprofilkonfiguration 9(ii)

Der PC ist mit einem einzelnen Audiogerät verbunden, das Mono-Aufnahmedatenströme unterstützt.

Die folgende Audiokonfiguration ist in Tabelle 4.1 der Bluetooth BAP-Spezifikation definiert.

Diagramm mit grundlegender Audioprofilkonfiguration 9(ii) mit einem PC, der mit einem einzelnen Audiogerät verbunden ist.

Der PC ist mit einer Reihe von Audiogeräten verbunden. Jedes Satzmitglied sendet einen Kanal von Audio an den PC.

Anwendungsfall Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Mikrofonaufnahme mit mehreren Kanälen Erbringen: Nichts
Aufnahme:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
CIS-Anzahl: 2
CIG-Anzahl: 1
BAP-QoS-Einstellungen: Niedrige Latenz

Wenn das Remotegerät oder der Gerätesatz bidirektionales Audio unterstützt, ist die Konfiguration für einen Aufnahmedatenstrom identisch mit bidirektional. Diese Konfiguration ermöglicht Übergänge von der Erfassung nur von Szenarien zu bidirektionalen Szenarien, ohne dass die Datenströme neu erstellt werden müssen.

Übertragungsquellenkonfigurationen
Grundlegende Audioprofilkonfiguration 12

Die folgende Audiokonfiguration ist in Tabelle 4.2 der Bluetooth BAP-Spezifikation definiert.

Diagramm mit grundlegender Audioprofilkonfiguration 12 mit PC, der mit einem einzelnen Audiogerät in Mono verbunden ist.

Der PC sendet einen Kanal mit Mono-Audio.

Anwendungsfall Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Systemsounds, Musikwiedergabe Rendern:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
BIS Anzahl: 1
BIG Count: 1
BAP-QoS-Einstellungen: Hohe Zuverlässigkeit
Videospielaudio Rendern:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
BIS Anzahl: 1
BIG Count: 1
BAP-QoS-Einstellungen: Niedrige Latenz
Grundlegende Audioprofilkonfiguration 13

Die folgende Audiokonfiguration ist in Tabelle 4.2 der Bluetooth BAP-Spezifikation definiert.

Diagramm mit grundlegender Audioprofilkonfiguration 13 mit PC, der mit einem einzelnen Audiogerät in Stereo verbunden ist.

Der PC sendet Stereoaudio mit jedem Kanal, der auf seinem eigenen BIS übertragen wird.

Anwendungsfall Windows-Audioeinstellungen Bluetooth Controller-Einstellungen
Systemsounds, Musikwiedergabe Rendern:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 2
BIS Anzahl: 1
BIG Count: 1
BAP-QoS-Einstellungen: Hohe Zuverlässigkeit
Videospielaudio Rendern:
Signalverarbeitungsmodus: Standard
Kanalanzahl: 1
BIS Anzahl: 1
BIG Count: 1
BAP-QoS-Einstellungen: Niedrige Latenz

Datenstrukturen

Microsoft definierte Bluetooth LE Audio-Schnittstelleneigenschaften

Eigenschaften der Stream-Erstellung

Die folgenden Eigenschaften werden zwischen dem herstellerspezifischen Audiotreiberstapel und dem Bluetooth LE-Audioprofil über die ACXOBJECTBAGDDIs gemeinsam genutzt. Diese Eigenschaften informieren Entscheidungen über die Erstellung und Konfiguration von Datenstromendpunkten, wie im Szenario "Stream Creation " gezeigt.

BluetoothLEAudio_CodecFähigkeiten

Der Audiotreiber legt diese Eigenschaft fest, um die Unterstützung für Audiostreamingfunktionen anzugeben, die im Audiotreiber oder Audio-DSP unterstützt werden. Der Eigenschaftswert wird mithilfe des DDI AcxObjectBagAddBlob festgelegt, und das Format des Werts entspricht einem PAC-Eintrag, wie in der PACS-Spezifikation definiert.

Das Windows Bluetooth LE Audio-Profil liest die Eigenschaft vor, um die möglichen Codeckonfigurationen und die zu verwendende Streamkomposition zu ermitteln.

Feld Oktett
Fähigkeitsanzahl 0
Codec-ID[i] 1-6
Länge der codecspezifischen Funktionen[i] 7
Codecspezifische Funktionen 8... n
Metadatenlänge (m) n + 1
Metadaten n+2... m

Feldwerte werden in den Tabellen 3.2 und 3.4 der PACS-Spezifikation definiert.

Bluetooth_DatapathID

Der Audiotreiber legt diese Eigenschaft fest, um die Datenpfad-ID anzugeben, die als Parameter für die Befehle HCI_LE_Setup_ISO_Data_Path und HCI_Configure_Data_Path verwendet wird. Der Eigenschaftswert wird mithilfe des AcxObjectBagAddUI8 DDI festgelegt.

Das Bluetooth LE Audio-Profil liest diese Eigenschaft und verwendet diese Eigenschaft als Parameter in HCI_Configure_Data_Path und HCI_LE_Setup_ISO_Data_Path Befehlen. Diese ID wird für alle isochronen Datenströme angewendet, die für den ACXSTREAM erstellt wurden, der dem Objektbehälter zugeordnet ist. Wenn Sie für jede Datenstromverbindung eine andere Datenpfad-ID zuweisen möchten, verwenden Sie KSPROPERTY_BtLeAudio_DATAPATH_ID in Ihren Audiotreibern.

Feld Oktett
Datenpfad-ID 0

Wenn der Audiotreiber diese Eigenschaft nicht festgelegt hat, verwendet das Betriebssystem den Wert 1 als Parameter für die HCI-Befehle.

Bluetooth_DatapathConfiguration

Der Audiotreiber legt diese Eigenschaft fest, um herstellerspezifische Konfigurationen für den Bluetooth-Controller über den Befehl HCI_Configure_Data_Path bereitzustellen. Er darf nicht größer als 255 Byte sein, was die größte Nutzlast ist, die ein Bluetooth-Controller für einen HCI-Befehl akzeptiert. Der Eigenschaftswert wird mithilfe des AcxObjectBagAddBlob DDI festgelegt. Diese Konfiguration gilt für alle Vom Audiotreiber festgelegten Datenpfad-IDs. Um eine andere Datenpfadkonfiguration für jede Datenpfad-ID zuzuweisen, verwenden Sie KSPROPERTY_BtLeAudio_DATAPATH_CONFIG in Ihren Audiotreibern.

Bluetooth_RequiresHciTransportInD0ForStreaming

Der Audiotreiber legt diese Eigenschaft fest, um anzugeben, dass der Bluetooth-Controller nicht in einen Energiesparzustand übergeht, während ein Audiodatenstrom aktiv ist. Der Eigenschaftswert wird mithilfe des AcxObjectBagAddUI8 DDI festgelegt.

Feld Oktett
ActiveTransportRequired (muss auf 1 festgelegt werden) 0
BluetoothLEAudio_CodecConfiguration

Diese Eigenschaft muss vom Bluetooth LE Audio-Profil mithilfe des DDI AcxObjectBagAddBlob festgelegt werden, nachdem die Codeckonfiguration mit einem Audiogerät konfiguriert wurde. Die Struktur des Werts lautet:

Feld Oktett
Konfigurationsanzahl 0
Streamverbindungshandle[i] 1-2
Codierungsformat[i] 3
Firmen-ID[i] 4-5
Anbieterspezifische Codec-ID[i] 6-7
Codec-spezifische Konfigurationslänge[i] 8
Codecspezifische Konfiguration[i] 9... n

Feldwerte werden aus Tabelle 4.3 der Bluetooth Audio Stream Control Service Specification abgeleitet.

Der herstellerspezifische Audiotreiberstapel sollte diese Eigenschaft lesen, wenn sich der LC3-Codec im ACX-Streamingtreiber oder Audio-DSP befindet.

BluetoothLEAudio_StreamConnectionHandles

Diese Eigenschaft muss vom Bluetooth LE-Audioprofil festgelegt werden, um den Audiotreiber über die Liste der BIS- oder CIS-Handles zu informieren, die für big oder CIG erstellt wurden. Die Reihenfolge der Handles entspricht der vom Bluetooth-Controller zurückgegebenen Reihenfolge mit dem HCI-Befehl LE_Set_CIG_Parameters oder dem HCI-Ereignis LE_Create_BIG_Complete. Die Struktur des Werts lautet:

Feld Größe Oktett
Anzahl der Verbindungshandle 1 0
Verbindungshandle[i] 2 1-n
Bluetooth LE Audio KS-Eigenschaften

KS-Eigenschaften ermöglichen dem IHV ACX-Audiotreiber das Festlegen oder Aktualisieren von Audiodatenstromeinstellungen, nachdem der Datenstrom erstellt wurde. Dieses Szenario eignet sich für Audiotreiber, um Konfigurationseinstellungen basierend auf eigenschaften festzulegen, die von der Bluetooth-Profilschaltung im Create Stream-Verfahren festgelegt wurden.

Definitionen

#define STATIC_KSPROPSETID_BtLeAudio\
    0x1159b79, 0xea6, 0x4923, 0x80, 0xf5, 0x32, 0x58, 0xd1, 0xfd, 0x91, 0x56
DEFINE_GUIDSTRUCT("01159B79-0EA6-4923-80F5-3258D1FD9156", KSPROPSETID_BtLeAudio);
#define KSPROPSETID_BtLeAudio DEFINE_GUIDNAMED(KSPROPSETID_BtLeAudio)

typedef enum {
    KSPROPERTY_BtLeAudio_DATAPATH_ID,
    KSPROPERTY_BtLeAudio_DATAPATH_CONFIG,
} ksproperty_btleaudio;
KSPROPERTY_BtLeAudio_DATAPATH_ID

Mit dieser KSProperty können IHV ACX-Audiotreiber den von Bluetooth_DatapathID festgelegten Wert festlegen oder aktualisieren, nachdem der Datenstromrückruf aufgerufen wurde. Mit dieser Eigenschaft können IHV-Audiotreiber auch eine andere Datenpfad-ID für jeden Codeckonfigurationseintrag in BluetoothLEAudio_CodecConfiguration zuweisen. Der Wert dieser Eigenschaft muss entweder auf einen einzelnen Bytewert festgelegt werden, um die Datenpfad-ID darzustellen, die für alle Codeckonfigurationen verwendet wird, oder n Bytes, wobei n gleich dem in der BluetoothLEAudio_CodecConfiguration-Eigenschaft festgelegten Wert für die Konfigurationsanzahl ist. Wenn der Wert mehrere Datenpfad-IDs enthält, muss die Reihenfolge der IDs für die Codeckonfiguration gemäß der Reihenfolge in der Eigenschaft BluetoothLEAudio_CodecConfiguration verwendet werden.

KSPROPERTY_BtLeAudio_DATAPATH_CONFIG

Diese KSProperty ermöglicht es IHV ACX-Audiotreibern, die Datenpfadkonfiguration wie in Bluetooth_DatapathConfiguration definiert festzulegen oder zu aktualisieren. Die KSProperty muss vom Audiotreiber an das Bluetooth-Profil gesendet werden, bevor der Audiodatenstromrückruf gestartet wird. Diese Eigenschaft kann verwendet werden, um eine einzelne Konfiguration für alle Datenpfade in einer einzigen Richtung festzulegen oder eine bestimmte Datenpfadkonfiguration für jeden Codec-Konfigurationseintrag in BluetoothLEAudio_CodecConfiguration festzulegen. Wenn der Wert mehrere Datenpfadkonfigurationen enthält, muss die Reihenfolge der Konfigurationen für den Codeckonfigurationseintrag gemäß der Reihenfolge in der Eigenschaft BluetoothLEAudio_CodecConfiguration verwendet werden. Die Anzahl der Codeckonfigurationen muss der Anzahl der Datenpfad-IDs entsprechen, die entweder durch KSPROPERTY_BtLeAudio_DATAPATH_ID oder Bluetooth_DatapathID festgelegt werden.

Feld Größe Wert
Konfigurationsanzahl 1 Byte 1 oder Codec-Konfigurationsanzahl in BluetoothLEAudio_CodecConfiguration
Konfigurationsgröße[i] 1 Byte Darf 255 nicht überschreiten
Konfiguration[i] Konfigurationsgröße[i]  

Schnittstellen

Identifikatoren für die Bindung von Audioendpunktvorlagen

Wird von der ACX-Stromkreisfabrik des Audiotreibers verwendet, um festzustellen, wann ein ACX-Stromkreis für ein gekoppeltes Bluetooth-Gerät erstellt wird.

Die folgenden Komponenten-IDs werden zum Erstellen von Bluetooth LE-Audioschaltungen verwendet:

// {5C52FDB5-722A-4AB7-A342-70163B7E9B5C}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_RENDER_COMPONENT_ID,
0x5c52fdb5, 0x722a, 0x4ab7, 0xa3, 0x42, 0x70, 0x16, 0x3b, 0x7e, 0x9b, 0x5c);

// {1DFF2EE3-AE89-441C-BDE3-24F885C55DF8}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_CAPTURE_COMPONENT_ID,
0x1dff2ee3, 0xae89, 0x441c, 0xbd, 0xe3, 0x24, 0xf8, 0x85, 0xc5, 0x5d, 0xf8);

Bluetooth LE Audio-Unterstützungsschnittstelle

Wird vom Audiotreiberstapel verwendet, um anzugeben, dass es für das Streaming von Bluetooth LE Audio verfügbar ist. Windows Bluetooth-Audio-Dienst überwacht diese Schnittstelle auf Dienstebene und wartet, bis sie veröffentlicht wird, bevor die Unterstützung für Bluetooth LE Audio aktiviert wird.

Die folgenden Schnittstellen-IDs werden verwendet, um die Bluetooth LE Audio-Unterstützungsschnittstelle zu veröffentlichen:

// {BA02FA1B-0FD0-4A0F-A748-4FAE2E2D2F67}
DEFINE_GUID(GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE,
0xba02fa1b, 0x0fd0, 0x4a0f, 0xa7, 0x48, 0x4f, 0xae, 0x2e, 0x2d, 0x2f, 0x67);

Allgemeine Sequenzen

Die folgenden Sequenzen werden sowohl für Unicast- als auch für LE-Audioszenarien ausgeführt.

Initialisierung des Audiotreibers

Wenn der IHV ACX Streaming-Treiber geladen wird und er feststellt, dass er Bluetooth LE Audio-Streaming unterstützt, soll er die Unterstützung für die Technologie zeigen, indem er ein ACXFACTORYCIRCUIT-Objekt erstellt und sich für Bluetooth-Vorlagenbindungen mit ACX registriert, unter Verwendung der in Audio Endpoint Template Binding IDs definierten IDs.

Flussdiagramm, das die Initialisierungssequenz des Bluetooth LE-Audiotreibers veranschaulicht.

Unicast-Audiosequenzen

Endpunkterstellung
  1. Wenn ein LE-Audiogerät mit dem System gekoppelt ist, wird das Bluetooth LE-Audioprofil:

    1. Liest die veröffentlichten Audiofunktionen des Remotegeräts.
    2. Ermittelt die unterstützten Funktionen des Controllers, indem die Befehle HCI_Read_Local_Support_Codecs [v2] und HCI_Read_Local_Supported_Codec_Capabilities gesendet werden.
    3. Erstellt einen ACXCIRCUIT mit den unterstützten Formaten, basierend auf den vom Bluetooth-Controller und Remote-Audiogerät unterstützten Codec-Funktionen. Wenn der Controller keine Codecs unterstützt, da sich die Codec-Unterstützung im Audio-DSP oder Audiotreiber befindet, werden die unterstützten Formate auf die vom Remoteaudiogerät unterstützten Formate festgelegt.
  2. Nach dem Erstellen des ACXCIRCUIT fordert ACX die ACX-Schaltkreisfabrik des IHV ACX-Streamingtreibers auf, einen ACXCIRCUIT für die Datenstromverarbeitung zu erstellen.

  3. Wenn eine Anforderung zum Erstellen eines Schaltkreises empfangen wird, wird der IHV ACX-Streamingtreiber:

    1. Erstellt ACXCIRCUIT-, ACXPIN-, ACXOBJECTBAG- und ACXSTREAMBRIDGE-Objekte .
    2. Wenn der lc3- oder herstellerspezifische Codec im Audiotreiber oder DSP gehostet wird, legt der IHV ACX-Streamingtreiber die BluetoothLEAudio_CodecCapabilities Eigenschaft für das ACXOBJECTBAG fest.
    3. Der IHV ACX-Streamingtreiber kann Bluetooth_DatapathID oder Bluetooth_DatapathConfiguration auf der ACXOBJECTBAG festlegen, wenn er zu diesem Zeitpunkt bekannt ist.
  4. Nachdem beide Schaltkreise erstellt wurden, ruft ACX den EvtAcxPinConnected-Rückruf auf dem IHV ACX-Brückenstift auf.

  5. Wenn es sich um evtAcxPinConnected-Rückruf handelt, wird der IHV ACX-Streamingtreiber aufgerufen:

    1. Ruft den Brückenpin der Profilschaltung mit AcxTarget...-APIs ab, um die Formate abzurufen, die von der Profilschaltung unterstützt werden.
    2. Durchläuft die Liste der ACXDATAFORMATs, die von der Profilschaltung festgelegt wurden. Wenn der Bluetooth-Audiocodec im Audiotreiber oder Audio-DSP gehostet wird, aktualisiert der IHV-Audiotreiber seine ACXDATAFORMATs mit den Formaten, die vom Codec und Profilkreis unterstützt werden. Andernfalls werden alle Formate auf den Host-Pin des IHV ACX-Streamingtreibers kopiert.
    3. Legt die aktualisierte Formatliste auf dem Bridge-Pin fest, wenn eine Audio-Engine für Offload-Streaming erstellt wird.
  6. Nachdem die Formate aktualisiert wurden, aktiviert ACX sowohl die Schnittstellen, als auch wird ein Audioendpunkt erstellt.

    Flussdiagramm, das den Erstellungsprozess des Bluetooth LE Audio-Endpunkts darstellt.

Erstellung eines Streams
  1. Wenn eine Anwendung anfordert, einen Audiodatenstrom zu erstellen, ruft ACX die registrierten EvtCircuitCreateStream-Rückrufe für jeden Schaltkreis auf, beginnend mit dem IHV ACX-Streamingtreiber.

  2. Wenn der EvtCircuitCreateStream-Rückruf aufgerufen wird, wird der IHV ACX-Streamingtreiber:

    1. Legt die eigenschaften Bluetooth_DatapathId und Bluetooth_DataPathConfiguration für das ACXOBJECTBAG , das an acXSTREAMBRIDGE angefügt ist, fest oder aktualisiert sie.
    2. Erstellt einen ACXSTREAM mit Rückrufen, die für Datenstromstatusübergänge und RT-Datenstromverarbeitung festgelegt sind.
    3. Erstellt ein Audio-Engine-Element im Stream, wenn die Audiopipeline das Offload-Streaming unterstützt.
    4. Fügt den ACXSTREAM zu seiner Stream-Brücke hinzu. Dadurch wird der EvtCircuitCreateStream-Rückruf des Bluetooth LE Audio-Profils aufgerufen.
  3. Wenn der EvtAcxCircuitCreateStream-Rückruf aufgerufen wird, wird das Bluetooth LE Audio-Profil:

    1. Speichert die Eigenschaften lokal aus dem ACXOBJECTBAG-Satz des IHV ACX-Streamingtreibers für zukünftige Streamübergangsrückrufe.
    2. Führt die Konfigurations-Codec-Operation gemäß der Definition in der BAP-Spezifikation aus. Die Parameter für den Vorgang werden vom ACXDATAFORMAT abgeleitet, das im EvtAcxCircuitCreateStream-Rückruf angegeben ist, und entweder von den anderen Datenstromparametern im ACXOBJECTBAG oder den codec-Funktionen, die vom Bluetooth Controller unterstützt werden.
    3. Ordnet Datenstromressourcen zu, indem der Befehl HCI LE Set CIG Parameters gesendet wird.
    4. Legt die BluetoothLEAudio_StreamConnectionHandles-Eigenschaft mit der Liste der CIS-Verbindungshandles fest, die vom Bluetooth-Controller zurückgegeben werden.
    5. Legt die eigenschaft BluetoothLEAudio_CodecConfiguration für acXOBJECTBAG mit dem Wert fest, der zum Konfigurieren der Remoteaudiogeräte verwendet wird.
  4. Wenn der IHV ACX-Streamingtreiber seine Datenpfad-ID oder Datenpfadkonfiguration basierend auf den vom Profil festgelegten Objektbehälterwerten aktualisieren muss, kann er die KSPROPERTY-Setvorgänge aufrufen, um den vom Profilkreis gespeicherten Wert zu aktualisieren.

    1. Erstellt einen ACXSTREAM mit Rückrufen, die für Datenstromstatusübergänge festgelegt sind.

    Flussdiagramm mit dem Erstellungsprozess des Bluetooth LE-Audiodatenstroms.

Streamstatusübergänge

ACX entscheidet über die Reihenfolge von Zustandsübergängen im Datenstrom basierend auf dem Audiofluss und darauf, ob der Zustand zu einem aktiveren oder weniger aktiven Zustand wechselt.

  • Für Renderstreams, die von einem weniger aktiven Zustand zu einem aktiveren Zustand wechseln, empfängt die Profilschaltung zuerst das Ereignis, gefolgt von der Streamingschaltung.
  • Für Renderdatenströme, die von einem aktiveren Zustand zu einem weniger aktiven Zustand wechseln, empfängt der Streaming-Schaltkreis zuerst das Ereignis, gefolgt von der Profilschaltung. 
  • Für Datenströme, die von einem weniger aktiven in einen aktiveren Zustand wechseln, empfängt der Streamingkreis zuerst das Ereignis, gefolgt von dem Profilkreis. 
  • Für Erfassungsdatenströme, die von einem aktiveren Zustand zu einem weniger aktiven Zustand wechseln, empfängt die Profilschaltung zuerst das Ereignis, gefolgt von der Streamingschaltung.

Vorbereiten des Datenstroms

Wenn der EvtAcxStreamPrepareHardware-Rückruf aufgerufen wird, sendet das Bluetooth LE Audio-Profil den QoS-Vorgang der ASCS-Konfiguration, um einstellungen bei Bedarf mit dem Remotegerät zu synchronisieren. Es ist möglich, dass der QoS-Vorgang der ASCS-Konfiguration bereits abgeschlossen war, als der Rückruf für die andere Richtung eines bidirektionalen Datenstroms aufgerufen wurde.

Flussdiagramm zur Veranschaulichung der Bluetooth LE-Audiodatenstromvorbereitung für eine Profilschaltung.

Wenn der EvtAcxStreamPrepareHardware-Rückruf aufgerufen wird, weist der IHV ACX-Streamingtreiber die erforderlichen Streamingressourcen zu und initialisiert die Audiopipeline, die sich im erworbenen Zustand befindet.

Flussdiagramm, das die Bluetooth LE Audio-Streamvorbereitung für einen Streaming-Schaltkreis darstellt.

Stream starten

Wenn der EvtAcxStreamRun-Rückruf aufgerufen wird, verhält sich das Bluetooth LE Audioprofil so:

  1. Wendet alle Konfigurationsargumente des ACX-Streamingtreibers an, wie unten beschrieben, mithilfe des Befehls HCI_Configure_Data_Path, wenn sie geändert wurden. Der Windows Bluetooth Core Stack speichert den Vendor_Specific_Config Puffer für jedes Data_Path_Direction- und Data_Path_ID-Paar zwischen. Der Befehl HCI_Configure_Data_Path wird nur gesendet, wenn sich die Vendor_Specific_Config für ein Data_Path_Direction- und Data_Path_ID paar ändert.
    1. Data_Path_Direction ist die AudioDirection des Streamingschaltungsrückrufs, der den EvtAcxStreamRun-Rückruf ausgibt.
    2. Die Data_Path_ID wird mit dem zuletzt zugewiesenen Wert aus einer der folgenden Quellen aufgefüllt:
      1. Bluetooth_DatapathID auf der ACXOBJECTBAG, die an die ACXSTREAMBRIDGE angefügt ist, die während des EvtCircuitCreateStream-Rückrufs an das Windows Bluetooth LE Audio-Profil übergeben wurde.
      2. Daten aus KSPROPERTY_BtLeAudio_DATAPATH_ID.
    3. Die Vendor_Specific_Config Daten werden mit dem zuletzt zugewiesenen Wert aus einer der folgenden Quellen aufgefüllt:
      1. Bluetooth_DatapathConfiguration an die ACXSTREAMBRIDGE angeschlossene ACXOBJECTBAG an den Windows Bluetooth LE Audio Profile-Schaltkreis während des EvtCircuitCreateStream-Rückrufs übergeben.
      2. Daten aus KSPROPERTY_BtLeAudio_DATAPATH_CONFIG.
  2. Sendet den ASCS Enable-Vorgang an die Remotegeräte.
  3. Erstellt CISes, wenn sie noch nicht mithilfe des Befehls HCI_LE_Create_CIS erstellt wurden.
  4. Wenn der Datenpfad noch nicht konfiguriert ist, ist das Bluetooth LE-Audioprofil:
    1. Richtet die ISO-Datenpfade mithilfe des Befehls HCI_LE_Setup_ISO_Data_Path ein.
      1. Wenn der IHV ACX-Streamingtreiber die Eigenschaft BluetoothLEAudio_CodecCapabilities festlegt, muss der Wert des felds Codec_ID in HCI_LE_Setup_ISO_Data_Path auf transparent (0x3) festgelegt werden, wie in bluetooth Assigned Numbers definiert. Andernfalls entspricht der Wert der Codec-ID, die im Konfigurationscodec-Vorgang im Datenstromerstellungsverfahren verwendet wird.
  5. Wenn der Audiodatenstrom ein Aufnahmedatenstrom ist, führt das Bluetooth LE-Audioprofil den BAP-Empfänger startbereit aus.

Flussdiagramm, das den Startprozess des Bluetooth LE Audio-Streams für einen Profilkreis zeigt.

Wenn der EvtAcxStreamRun-Rückruf aufgerufen wird, startet der IHV ACX-Streamingtreiber die Verarbeitung eingehender Audiodaten vom Windows-Audiosystem (Rendern) oder vom Bluetooth-Controller (Aufnahme).

Flussdiagramm, das den Startprozess des Bluetooth LE-Audiodatenstroms für einen Streaming-Schaltkreis veranschaulicht.

Stream anhalten

Wenn der EvtAcxStreamPause-Rückruf aktiviert wird, wird das Bluetooth LE Audioprofil:

  1. Führt die Prozedur zum Deaktivieren des BAP-Unicastdatenstroms aus.
  2. Entfernt den ISO-Datenpfad mithilfe des Befehls HCI_LE_Remove_ISO_Data_Path.
  3. Führt das ASCS-Empfängerstop-Bereitverfahren aus, wenn der Audiodatenstrom ein Unicast-Aufnahmedatenstrom ist.
  4. Trennen Sie CISes, wenn für diese CIS keine anderen Datenströme verwendet werden.

Flussdiagramm, das den Anhalteprozess des Bluetooth LE-Audiostreams für einen Profilkreis darstellt.

Wenn der EvtAcxStreamPause-Rückruf aufgerufen wird, hält der IHV ACX-Streamingtreiber seine Audioverarbeitungspipeline an.

Flussdiagramm mit dem Anhalten des Bluetooth LE-Audiodatenstroms für einen Streaming-Schaltkreis.

Freigabe-Fluss

Wenn der EvtAcxStreamReleaseHardware-Rückruf aufgerufen wird, wird das Bluetooth LE-Audioprofil aufgerufen:

  1. Sendet den ASCS Release-Vorgang an das Bluetooth LE-Remotegerät
  2. Entfernt die CIG, wenn alle CISes getrennt sind.

Flussdiagramm zur Veranschaulichung des Freigabeprozesses des Bluetooth LE-Audio-Datenstroms für einen Profilkreislauf.

Wenn der EvtAcxStreamReleaseHardware-Rückruf aufgerufen wird, gibt der IHV ACX-Streamingtreiber seine Audiopipelineressourcen frei.

Flussdiagramm, das den Loslösungsprozess des Bluetooth LE-Audiodatenstroms für einen Streaming-Schaltkreis darstellt.

Endpunkttrennung

Das Windows Bluetooth LE Audio-Profil aktualisiert den Verbindungsstatus eines Endpunkts, wenn das Remote-Unicast-Gerät keine LE-ACL Verbindung mit dem PC aufweist oder über seine PACS verfügbaren Audiokontexte meldet, dass es nicht zum Streaming verfügbar ist. Wenn der Endpunkt getrennt wird, macht der Windows-Audiodienst alle aktiven Datenströme für den Endpunkt ungültig. Dies führt dazu, dass die Stream-Pausen- und Freigabesequenzen ausgelöst werden.

Lautstärke und Stummschaltung

Die IHV ACX-Streamingschaltung sollte nur Lautstärke- und Stummschaltungselemente enthalten, wenn der Streamingtreiber ein Audiomodul benötigt. Bei Verwendung einer Audio-Engine müssen die Konfigurationsflags wie folgt festgelegt werden:

ACX_AUDIOENGINE_CONFIG audioEngineCfg;
ACX_AUDIOENGINE_CONFIG_INIT(&audioEngineCfg);
…

audioEngineCfg.Flags |= AcxAudioEngineConfigVolumeSecondary; // Use this control only if endpoint doesn't have one.

audioEngineCfg.MuteElement = muteElement;

audioEngineCfg.Flags |= AcxAudioEngineConfigMuteSecondary; // Use this control only if endpoint doesn't have one.

audioEngineCfg.PeakMeterElement = peakmeterElement;

audioEngineCfg.Flags |= AcxAudioEngineConfigPeakMeterSecondary; // Use this control only if endpoint doesn't have one.

Dies ist erforderlich, damit Bluetooth LE Audio-Endpunkte die definierten Bluetooth SIG-Lautstärke- und Mikrofonsteuerungsprofile für Lautstärke- und Stummschaltungsänderungen für Unicast-Audioendpunkte verwenden können.

Wenn das Remote-Bluetooth LE-Audiogerät die Lautstärke- oder Mikrofonsteuerungsdienste nicht unterstützt oder der Endpunkt für die Übertragung von Audio erstellt wird, müssen die Lautstärke- und Stummschaltungselemente in der Audio-Engine als Fallback verwendet werden, um die Änderungsanforderungen des Audiosystems zu bearbeiten. Das Windows-Audiosystem behandelt Änderungen an Lautstärke und Stummschaltung. Wenn kein Audiosystem vorhanden ist und das Remotegerät die Lautstärke nicht unterstützt oder Mikrofondienste oder der Audioendpunkt für die Audioübertragung vorgesehen ist.

Entfernen von Endpunkten

Ein Bluetooth LE-Audioendpunkt wird aus dem System entfernt, wenn entweder die Profilschaltung oder der Streaming-Schaltkreis zerstört wird. Die Profilschaltung kann entfernt werden, wenn die Kopplung des Remote-Unicast-Geräts aus Windows entfernt wird oder das Bluetooth-Funkgerät deaktiviert ist.

  1. Wenn das Windows Bluetooth LE-Audioprofil seinen Schaltkreis entfernt, deaktiviert ACX seine Endpunktschnittstellen, um dem Windows-Audiodienst zu signalisieren, dass der Endpunkt entfernt werden soll.
  2. Wenn die Schnittstellen deaktiviert sind, werden vom Windows-Audiodienst alle aktiven Datenströme an den Bluetooth LE-Audioendpunkt ungültig, und dieser Vorgang führt zu einer Unterbrechung des Datenstroms und zum Freigeben von Rückrufen, die auf dem Streaming-Schaltkreis aufgerufen werden.
  3. Um die Entfernung des Endpunkts abzuschließen, macht ACX die IHV ACX-Streamingtreiberschaltung ungültig, was dazu führt, dass die WDF die Bereinigungsrückruffunktion des Schaltkreises aufruft.
  4. Wenn der Bereinigungsrückruf aufgerufen wird, gibt der IHV ACX-Streamingtreiber seinen Schaltkreis frei.

Flussdiagramm mit dem Entfernungsprozess des Bluetooth LE Audio-Endpunkts.

Bluetooth LE und klassische Audio-Koexistenz

Windows stellt sicher, dass für ein gekoppeltes Bluetooth-Audiogerät, das beide Technologien unterstützt, nur klassisches Audio oder LE-Audio aktiv sein kann. Wenn LE-Audio aktiv ist, werden die Sideband-DDIs für A2DP und HFP für das Remotegerät deaktiviert, und die Profilschaltung wird für den LE-Audioendpunkt erstellt. Wenn klassisches Audio aktiv ist, werden die Sideband-DDIs für A2DP und HFP für das Remotegerät aktiviert, und der Profilkreis wird für den LE-Audioendpunkt nicht erstellt.

Energieverwaltung

Bluetooth LE Audio verfügt über keine Energieverwaltungsanforderungen oder Flüsse außerhalb des bereits von WDF definierten Bereichs.

Super-Wideband-Stereo für Sprachszenarien

Das heutige Bluetooth-Audioerlebnis ist praktisch, hat jedoch Einschränkungen, insbesondere im Vergleich zu kabelgebundenen Audiofunktionen. Eine haupteinschränkung bei benutzerorientierten Folgen ist der Drop-to-Mono-Audio, wenn das Mikrofon aktiv ist. Dies blockiert Oberflächen wie räumliches Audio in Teams und anderen VoIP-Apps daran, zu funktionieren, und es beeinträchtigt stark Spielerfahrungen, die Sprachchats umfassen.

Bluetooth LE Audio schließt die Lücke mit verbesserter Audiotreue und reduzierter Latenz, indem unterstützung für die Stereowiedergabe hinzugefügt wird, während das Mikrofon verwendet wird.

Render-/Aufnahmeformatpaare

Eine IHV-Lösung kündigt ihre Unterstützung für das Stereo-Rendern mit Mono-Aufnahme an, indem eine Liste von Render-/Aufnahmeformatpaaren bereitgestellt wird, die jeweils aus einem Stereo-Renderformat und einem Mono-Aufnahmeformat bestehen, das gleichzeitig für bidirektionales Streaming verwendet werden kann. Ein Stereorenderungsformat (oder Mono-Aufnahme) wird als Paar eines Sampling_Frequency definiert (z. B. 16/24/32/48 kHz) und ein Audio_Channel_Count (z. B. 1/2 ch), das einem bestimmten Audiocodec zugeordnet ist, der nicht auf LC3 beschränkt ist.

Angenommen, eine IHV-Lösung unterstützt sowohl das Stereo-Rendern mit 16kHz-Monoaufnahme als auch das 48kHz-Stereo-Rendern mit 24kHz oder 32kHz Monoaufnahme. Die entsprechenden Render-/Aufnahmeformatpaare sehen wie folgt aus:

Entry Renderformat Aufnahmeformat
1 Render(16 kHz, 2 ch) Capture(16 kHz, 1 ch)
2 Render(48 kHz, 2 ch) Capture(24 kHz, 1 ch)
3 Render(48 kHz, 2 ch) Capture(32 kHz, 1 ch)

Tabelle 3: Beispielpaare für Render-/Aufnahmeformate

Da ein koordiniertes Setelement jederzeit beitreten oder aufheben kann, muss eine IHV-Lösung das Mono-Rendern mit Mono-Aufnahme in den gleichen jeweiligen Samplingfrequenzen für jeden Eintrag in den Formatpaaren unterstützen. Dies bedeutet, dass aufgrund des Beispiels in Tabelle 3 auch alle unten aufgeführten Formatpaare implizit unterstützt werden müssen, obwohl sie nicht explizit deklariert sind:

Entry Renderformat Aufnahmeformat
1 Render(16 kHz, 1 ch) Capture(16 kHz, 1 ch)
2 Render(48 kHz, 1 ch) Capture(24 kHz, 1 ch)
3 Render(48 kHz, 1 ch) Capture(32 kHz, 1 ch)

Tabelle 4: Implizite Render-/Aufnahmeformatpaare für Tabelle 3

Der Hauptunterschied zwischen Tabelle 3 und Tabelle 4 besteht darin, dass die Audio_Channel_Count für jedes Renderformat in letzterem auf ein Format festgelegt ist (für "Mono rendern"); Alles andere bleibt gleich.

Obligatorische Render-/Aufnahmeformatpaare

Tabelle 5 definiert die Liste der Audioformate, die alle IHV-Lösungen unterstützen sollen:

Entry (Render_format, Capture_format)
1 { Render(48 kHz, 2 ch), Capture(32 kHz,1 ch) }
2 { Render(32 kHz, 2 ch), Capture(32 kHz,1 ch) }
3 { Render(24 kHz, 2 ch), Capture(24 kHz,1 ch) }
4 { Render(16 kHz, 2 ch), Capture(16 kHz,1 ch) }

Tabelle 5 Obligatorische Render-/Aufnahmeformatpaare

Ankündigung von Funktionen

Je nachdem, ob der Bluetooth-Controller den beteiligten Audiocodec unterstützt (Standard für LC3), gibt eine IHV-Lösung die Liste der Render-/Aufnahmeformatpaare an, die auf unterschiedliche Weise unterstützt werden. Dies gilt insbesondere in folgenden Fällen:

  • Wenn sich der Codec im Bluetooth-Controller befindet, müssen sowohl der Controller als auch der IHV ACX-Streamingtreiber die Listen von Formatpaaren unabhängig bewerben. Wenn die beiden Listen miteinander nicht einverstanden sind, überschneidet sich Windows und behält die gemeinsamen Teile bei.

  • Wenn sich der Codec nicht im Bluetooth-Controller befindet (z. B. im Audio-DSP), ist nur der IHV ACX-Streamingtreiber erforderlich, um die Liste der Formatpaare anzukündigen. Bluetooth-Controller

Da die Codec_Capability[i] in der Antwort für eine HCI_Read_Local_Supported_Codec_Capabilities keine Metadaten unterstützt, muss der Bluetooth-Controller eine Familie von Microsoft-spezifischen Codec-IDs (siehe Tabelle 7) unterstützen, sodass Windows z. B. eine Liste der Render-/Aufnahmeformatpaare abfragen kann, die nicht einfach über die vorhandene HCI-Schnittstelle vermittelt werden können.

Parameter Größe (Oktetten) Description
Codec_ID 5 Oktett 0: 0xFF (Anbieterspezifisch)

Oktett 1 bis 2: 0x0006 (Microsoft)

Oktett 3 bis 4: Vom Anbieter definierte Codec-ID

Wenn das wichtigste Bit des Oktetts 4 auf Null (0) festgelegt ist, enthält das Oktett 3 ein SIG-genehmigtes Codierungsformat (von 0x00 bis 0x07 zum 31. Mai 2024), mit Ausnahme von 0xFF.

Wenn das wichtigste Bit des Oktetts 4 auf ein (1) festgelegt ist, enthält das Oktett 3 ein Codierungsformat, das noch definiert und für die zukünftige Verwendung von Windows reserviert wird.

Tabelle 7 Microsoft-spezifische Codec-ID

Die Bereiche dieser microsoftspezifischen Codec-IDs sind auf folgendes beschränkt:

  • HCI_Read_Local_Supported_Codecs [v2]
  • HCI_Read_Local_Supported_Codec_Capabilities

Im Vertrag verwendet Windows keine dieser microsoftspezifischen Codec-IDs für andere Arten von HCI-Befehlen.

HCI_Read_Local_Supported_Codecs [v2]

Der Verantwortliche stellt seine Unterstützung für die Microsoft-spezifische Codec-ID über Vendor_Specific_Codec_ID und Vendor_Specific_Codec_Transport an:

Feld Description
Vendor_Specific_Codec_ID[k] Oktetten 0 bis 1: Firmen-ID (0x0006)
Weitere Informationen finden Sie unter Oktett 1 bis 2 in Tabelle 7.

Oktetten 2 bis 3: Vom Anbieter definierte Codec-ID (z. B. 0x0006 für LC3)
Weitere Informationen finden Sie unter Oktett 3 bis 4 in Tabelle 7.
Vendor_Specific_Codec_Transport[k] LE_CIS (0x02) muss unterstützt werden.

Tabelle 8 HCI_Read_Local_Supported_Codec [v2] Antwortwert

HCI_Read_Local_Supported_Codec_Capabilities

Um alle Windows-spezifischen Codec-Funktionen abzufragen, einschließlich der Liste der Render-/Aufnahmeformatpaare, ruft Windows HCI_Read_Local_Supported_Codec_Capabilities mit den folgenden Argumenten auf:

Parameter Größe (Oktetten) Description
Codec_ID (Microsoft-spezifische Codec-ID) 5 Oktett 0: 0xFF (Anbieterspezifisch)

Oktett 1 bis 2: Firmen-ID (0x0006)
Weitere Informationen finden Sie unter Oktett 1 bis 2 in Tabelle 8.

Oktett 3 bis 4: Vom Anbieter definierte Codec-ID (z. B. 0x0006 für LC3)
Weitere Informationen finden Sie unter Oktett 3 bis 4 in Tabelle 8.
Logical_Transport_Type 1 0x2 (LE CIS)
Richtung 1 0x00 (z. B. Host to Controller)

Tabelle 9 HCI_Read_Local_Supported_Codec_Capabilities Befehlsargumente

Nach Erhalt eines solchen Befehls gibt der Controller alle Windows-spezifischen Funktionen für den codec zurück, der von der vom Anbieter definierten Codec-ID angegeben wurde. Wenn beispielsweise die vom Anbieter definierte Codec-ID auf 0x0006 festgelegt ist, gibt der Controller alle lc3-bezogenen Funktionen zurück, die von Windows benötigt werden.

Die Antwort für den Befehl verwaltet die gleiche Struktur der obersten Ebene wie die durch bluetooth Core-Spezifikation definierte:

Parameter Größe (Oktetten) Description
Der Status 1 0x00 (Erfolg); 0x01 0xFF (Fehlercode)
Num_Codec_Capabilities 1 Die Gesamtzahl der zurückgegebenen Funktionen.
Codec_Capability_Length[i] 1 Länge des Felds Codec_Capability[i]
Codec_Capability [i] Variiert Codec_Capability_Length[i] Oktetts von codecspezifischen Funktionsdaten.

Tabelle 10 HCI_Read_Local_Supported_Codec_Capabilities Antwortstruktur

Die Nutzlast von Codec_Capability[i] unterscheidet sich jedoch von der von der SIG definierten und auf Windows zugeschnittenen.

Derzeit ist die einzige von Windows definierte Codec-Funktion Bidirectional_Multichannel_Streaming, die unten beschrieben wird.

Bidirectional_Multichannel_Streaming

Durch Werbung Bidirectional_Multichannel_Streaming bestätigt der Controller, dass er gleichzeitiges m-Channel-Rendern mit n-Kanal-Aufnahme unterstützt, wobei m ≥ 1, n ≥ 1 und m + n> 2. (Stereo-Rendern mit Mono-Aufnahme ist effektiv eine Bidirectional_Multichannel_Streaming mit m = 2 und n = 1.)

In dieser Tabelle wird das Format für Bidirectional_Multichannel_Streaming beschrieben:

Parameter Größe (Oktetten) Bits Description
Typ 1 0x00 (Bidirectional_Multichannel_Streaming)
Channel_Counts 1 Bit 0 bis 4: (m – 1), wobei m die Anzahl der Renderkanäle ist (Bei Stereo-Rendern mit Mono-Aufnahme sollte dies den Wert 2 – 1 = 1 aufweisen.)
Channel_Counts 1 Bit 5 bis 7: (n – 1), wobei n die Anzahl der Aufnahmekanäle ist (Bei Stereo-Rendern mit Mono-Aufnahme sollte dies den Wert 1 – 1 = 0 aufweisen.)
Render_Sampling_Frequencies 1 Bit 0: 16 kHz
Bit 1: 24 kHz
Bit 2: 32 kHz
Bit 3: 48 kHz
Bit 4: RFU
Bit 5: RFU
Bit 6: RFU
Bit 7: RFU
Alle Samplingfrequenzen in dieser Liste haben die gleiche Kanalanzahl wie die von Bit 0-4 von Channel_Count angegeben.

Alle RFU-Bits sind reserviert und müssen auf Null festgelegt werden.
Capture_Sampling_Frequencies_-List[i], wobei 0 ≤ i ≤ 7 i + 1 Bit 0: 16 kHz
Bit 1: 24 kHz
Bit 2: 32 kHz
Bit 3: 48 kHz
Bit 4: RFU
Bit 5: RFU
Bit 6: RFU
Bit 7: RFU
Alle Samplingfrequenzen in dieser Liste haben die gleiche Kanalanzahl wie die von Bit 5-7 von Channel_Count angegeben.

Jede Capture_Sampling_Frequencies_List Instanz ist ein Oktett groß, und es können bis zu acht solche Instanzen vorhanden sein (wenn alle Bits in Render_Sampling_Frequencies auf eins festgelegt sind).

Alle RFU-Bits sind reserviert und müssen auf Null festgelegt werden.

Tabelle 11 Bidirectional_Multichannel_Streaming Format (Maximale Länge: 11 Bytes)

Channel_Counts

Die Auswahl der Bitanzahl für render/capture ist beliebig – fünf Bits werden für das Rendern zugewiesen (um alle SIG-definierten Audiospeicherorte abzudecken) und drei Bits für die Aufnahme (um die HCI-Nutzlastgröße zu minimieren).

Beispielsweise ist die Channel_Counts für Tabelle 3 0b0000'0001, da die Anzahl der Render-/Aufnahmekanäle, z. B. m und n, 2 bzw. 1 sind:

  Capture Render
Bit 7 6 5 4 3 2 1 0
Wert 0 0 0 0 0 0 0 1

Tabelle 12 Channel_Counts für Tabelle 3

Standardmäßig müssen alle Funktionen mit demselben Paar von Microsoft-spezifischer Codec-ID und Channel_Counts zusammen gruppiert und durch einen einzelnen Bidirectional_Multichannel_Streaming Datensatz dargestellt werden.

Render_Sampling_Frequencies

Das feld Render_Sampling_Frequencies gibt alle Renderfrequenzen an, die im Kontext der zugeordneten Bidirectional_Multichannel_Streaming Struktur verwendet werden können.

Beispielsweise ist die Render_Sampling_Frequencies für Tabelle 3 0b000'1001, was bedeutet, dass sowohl 16kHz als auch 48kHz als Samplingfrequenz für das Rendern von zwei Kanälen verwendet werden können:

Khz RFU RFU RFU RFU 48 32 24 16
Bit 7 6 5 4 3 2 1 0
Wert 0 0 0 0 1 0 0 1

Tabelle 13 Render_Sampling_Frequencies für Tabelle 3

Capture_Sampling_Frequencies_List[i]

Für jedes "Eins"-Bit in Render_Sampling_Frequencies, beginnend von der geringsten Bedeutung bis zum wichtigsten, muss der Controller eine eindeutige Bitmaske (Capture_Sampling_Frequencies_List[i]) bereitstellen, die alle Aufnahmefrequenzen angibt, die mit der häufigkeit kompatibel sind, die durch dieses Renderbit dargestellt wird. Der Controller darf in Render_Sampling_Frequencies keine Capture_Sampling_Frequencies Bitmaske für ein "Null"-Bit bereitstellen.

Die Aufnahmebitmasken für Tabelle 3 sehen z. B. wie folgt aus:

// The order matters!
{
    // Capture_Sampling_Frequencies_List[0] for 16kHz dual-channel rendering.
    0b0000'0001, // 16 kHz single-channel capture

    // Do not create a dummy Capture_Sampling_Frequencies_List entry, for example, 0b0000'0000,
    // for 24kHz dual-channel rendering, which is not supported at all.

    // Do not create a dummy Capture_Sampling_Frequencies_List entry, for example, 0b0000'0000,
    // for 32kHz dual-channel rendering, which is not supported at all.

    // Capture_Sampling_Frequencies_List[1] for 48kHz dual-channel rendering.
    0b0000'0110 // Either 24 or 32 kHz single-channel capture
}

Dies gilt insbesondere in folgenden Fällen:

Render_-Sampling_-Frequencies Ich Capture_-Sampling_-Frequenzen[i] Description
0b0000'1001
   ⇤ Bestellung ↤
0 0b0000'0001 Das erste signifikante "One"-Bit (Bit 0) in Render_Sampling_Frequencies entspricht 16 kHz.

Aktivieren Sie Bit 0 von Capture_Sampling_Frequencies_List[0], um anzugeben, dass die Aufnahme von 16 kHz mit dieser Renderfrequenz gekoppelt werden kann.
0b0000'1 001
   ⇤ Bestellung ↤
1 0b0000'0110 Das zweite am wenigsten signifikante "Eins"-Bit (Bit 3) in Render_Sampling_Frequencies entspricht 48 kHz.

Aktivieren Sie Bit 1 und 2 von Capture_Sampling_Frequencies_List[1], um anzugeben, dass 24 kHz und 32 kHz Aufnahme mit dieser Renderfrequenz gekoppelt werden können.

Tabelle 14 Beispiel für die Erstellung eines Capture_Sampling_Frequencies_List[i] für eine Render_Sampling_Frequencies

IHV ACX Streaming-Treiber

Zur Unterstützung des Stereorenderings mit Mono-Aufnahme legt ein IHV ACX-Streamingtreiber die Geräteeigenschaft BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities fest, die die in 3.11.2 beschriebenen Render-/Aufnahmeformatpaare auf eine Instanz der Geräteschnittstellenklasse GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE darstellt.

Die Eigenschaft sollte unmittelbar nach dem Erstellen der Geräteschnittstellenklasseninstanz verfügbar gemacht werden, und der Wert der Eigenschaft bleibt während der gesamten Lebensdauer der Geräteschnittstellenklasseninstanz konstant.

Der Eigenschaftsschlüssel von BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities wird wie folgt definiert:

DEFINE_DEVPROPKEY(DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities,
    0xd27ba3a4, 0x1bfe, 0x4374, 0x88, 0x7d, 0xe8, 0xb3, 0xa6, 0xac, 0xe, 0xe9, 2); // DEVPROP_TYPE_BINARY (BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY[])

Der dem Schlüssel zugeordnete Eigenschaftswerttyp DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities wird wie folgt definiert:

typedef struct _BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY
{
    BTH_LE_AUDIO_CODEC_ID CodecId;
    BOOL IsCodecPresent;
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CHANNEL_COUNT RenderChannelCount;
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CHANNEL_COUNT CaptureChannelCount;
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY RenderSamplingFrequencies;
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY CaptureSamplingFrequenciesList[
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_BIT_LENGTH
    ];
} BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY;

Where:

typedef struct _BTH_LE_AUDIO_CODEC_ID
{
    UINT8 CodingFormat;
    UINT16 CompanyId;
    UINT16 VendorCodecId;
} BTH_LE_AUDIO_CODEC_ID;

typedef UINT8 BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CHANNEL_COUNT;

typedef enum _BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY :
    UINT8 // Bit flags
{
    // 16 kHz
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_16000HZ = 0x1,

    // 24 kHz
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_24000HZ = 0x2,

    // 32 kHz
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_32000HZ = 0x4,

    // 48 kHz
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_48000HZ = 0x8,

    // A dummy value for indicating a sampling frequency is "not applicable" in the
    // respective context.
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_NONE = 0,

    // All valid sampling frequencies combined.
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_ALL =
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_16000HZ |
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_24000HZ |
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_32000HZ |
        BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_48000HZ,
} BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY;

DEFINE_ENUM_FLAG_OPERATORS(BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY);

#define BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_BIT_LENGTH \
    (sizeof(BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY) * 8)

Die BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY-Struktur folgt ähnlichen Regeln wie in Bidirectional_Multichannel_Streaming beschrieben, mit ausnahme der folgenden:

  • Der ACX-Streamingtreiber ist erforderlich, um ein zusätzliches Flag (IsCodecPresent) festzulegen, um anzugeben, ob der interessante Codec konzeptionell Teil des ACX-Streamingtreibers ist. Wenn sich der Codec beispielsweise im Audio-DSP befindet, sollte IsCodecPresent auf TRUE festgelegt werden. Wenn sich der Codec im Bluetooth-Controller befindet, sollte das Flag auf FALSE festgelegt werden.

  • Bei m-Channel-Rendern mit n-Kanal-Aufnahme sind die Werte für RenderChannelCount und CaptureChannelCount m bzw. n. Mit anderen Worten: RenderChannelCount und CaptureChannelCount geben die reale Anzahl von Render- und Aufnahmekanälen an.

  • Angesichts eines Indexes gibt es eine 1:1-Zuordnung zwischen dem i-th-wichtigen Bit von RenderSamplingFrequencies und dem i-th-Eintrag von CaptureSamplingFrequenciesList. Wenn das i-th-Bit von RenderSamplingFrequencies null ist, legen Sie CaptureSamplingFrequenciesList[i] auf Null fest.

Der folgende Beispielcode zeigt, wie sie die GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE Geräteschnittstelle erstellen und die BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities-Geräteschnittstelleneigenschaft festlegen:

PAGED_CODE_SEG
NTSTATUS
AdvertiseBluetoothLEAudioSupport(
    WDFDEVICE Device
    )
{
    // Create a device interface with the class,
    // GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE, for the specified WDF device.
    DECLARE_CONST_UNICODE_STRING(
        bluetoothLEAudioSupportInterface, L"BluetoothLEAudioSupport");
    RETURN_NTSTATUS_IF_FAILED(WdfDeviceCreateDeviceInterface(
        Device,
        &GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE,
        (PUNICODE_STRING)&bluetoothLEAudioSupportInterface));

#pragma region associate BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities with GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE.
    // Advertise bidirectional multichannel streaming support by setting the device
    // interface property, 
    // BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities,
    // to the newly created device interface.

    // See Table 7 "Microsoft-specific codec ID" in Microsoft Bluetooth LE Audio
    // IHV Specification for reference.
    constexpr BTH_LE_AUDIO_CODEC_ID microsoftLC3CodecId
    {
        0xff, // Vendor-specific
        0x6,  // Microsoft
        0x6,  // LC3
    };

    constexpr BTH_LE_AUDIO_CODEC_ID microsoftCVSDCodecId
    {
        0xff, // Vendor-specific
        0x6,  // Microsoft
        0x2,  // CVSD
    };

    // For readability purpose only
    constexpr auto SamplingFrequency_None = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_NONE;
    constexpr auto SamplingFrequency_16000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_16000HZ;
    constexpr auto SamplingFrequency_24000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_24000HZ;
    constexpr auto SamplingFrequency_32000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_32000HZ;
    constexpr auto SamplingFrequency_48000Hz = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_48000HZ;
    constexpr auto SamplingFrequency_All = BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_SAMPLING_FREQUENCY_ALL;

    // Bidirectional multichannel streaming capabilities
    BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY capabilities[]
    {
        // List of formats supported for 2-channel render with 1-channel capture using
        // the LC3 codec:
        //
        //      Render           Capture
        //   (Freq, #Chan)    (Freq, #Chan)
        //   =============    =============
        //    (16kHz, 2) <---> (16kHz, 1)
        //    ----------       ----------
        //    (24kHz, 2) <---> (16kHz, 1)
        //    (24kHz, 2) <---> (24kHz, 1)
        //    ----------       ----------
        //    (32kHz, 2) <---> (16kHz, 1)
        //    (32kHz, 2) <---> (24kHz, 1)
        //    (32kHz, 2) <---> (32kHz, 1)
        //    ----------       ----------
        //    (48kHz, 2) <---> (16kHz, 1)
        //    (48kHz, 2) <---> (24kHz, 1)
        //    (48kHz, 2) <---> (32kHz, 1)
        //    (48kHz, 2) <---> (48kHz, 1)
        //
        {
            // CodecId
            microsoftLC3CodecId,
            // IsCodecPresent,
            FALSE, // The LC3 codec is in the Bluetooth Controller.
            // RenderChannelCount
            2,
            // CaptureChannelCount
            1,
            // RenderSamplingFrequencies
            SamplingFrequency_All,
            // CaptureSamplingFrequencies: List of 1-channel capture sampling
            // frequencies compatible with 16kHz, 2-channel render
            SamplingFrequency_16000Hz,
            // CaptureSamplingFrequencies: List of 1-channel capture sampling
            // frequencies compatible with 24kHz, 2-channel render
            SamplingFrequency_16000Hz | SamplingFrequency_24000Hz,
            // CaptureSamplingFrequencies: List of 1-channel capture sampling
            // frequencies compatible with 32kHz, 2-channel render
            SamplingFrequency_16000Hz |
                SamplingFrequency_24000Hz |
                SamplingFrequency_32000Hz,
            // CaptureSamplingFrequencies: List of 1-channel capture sampling
            // frequencies compatible with 48kHz, 2-channel render
            SamplingFrequency_All,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
        },
        // List of formats supported for 4-channel render with 2-channel capture using
        // the CVSD codec:
        //
        //      Render           Capture
        //   (Freq, #Chan)    (Freq, #Chan)
        //   =============    =============
        //    (16kHz, 4) <---> (16kHz, 2)
        //    ----------       ----------
        //    (32kHz, 4) <---> (16kHz, 2)
        //    (32kHz, 4) <---> (32kHz, 2)
        //
        {
            // CodecId
            microsoftCVSDCodecId,
            // IsCodecPresent,
            TRUE, // The CVSD codec is in the audio DSP.
            // RenderChannelCount
            4,
            // CaptureChannelCount
            2,
            // RenderSamplingFrequencies
            SamplingFrequency_16000Hz | SamplingFrequency_32000Hz,
            // CaptureSamplingFrequencies: List of 2-channel capture sampling
            // frequencies compatible with 16kHz, 4-channel render
            SamplingFrequency_16000Hz,
            // CaptureSamplingFrequencies: List of 2-channel capture sampling
            // frequencies compatible with 24kHz, 4-channel render
            SamplingFrequency_None, // N/A
            // CaptureSamplingFrequencies: List of 2-channel capture sampling
            // frequencies compatible with 32kHz, 4-channel render
            SamplingFrequency_16000Hz | SamplingFrequency_32000Hz,
            // CaptureSamplingFrequencies: List of 2-channel capture sampling
            // frequencies compatible with 48kHz, 4-channel render
            SamplingFrequency_None, // N/A
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
            // CaptureSamplingFrequencies: RFU
            SamplingFrequency_None,
        }
    };

    // Call IoSetDeviceInterfacePropertyData to associate the capabilities associated
    // with the DEVPKEY.
    WDFSTRING wdfSymbolicLinkName;
    RETURN_NTSTATUS_IF_FAILED(WdfStringCreate(
        nullptr, WDF_NO_OBJECT_ATTRIBUTES, &wdfSymbolicLinkName));
    auto deleteWdfStringOnExt = scope_exit([wdfSymbolicLinkName]() -> void
    {
        WdfObjectDelete(wdfSymbolicLinkName);
    });

    RETURN_NTSTATUS_IF_FAILED(WdfDeviceRetrieveDeviceInterfaceString(
        Device,
        &GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE,
        &bluetoothLEAudioSupportInterface,
        wdfSymbolicLinkName));
    
    UNICODE_STRING symbolicLinkName;
    WdfStringGetUnicodeString(wdfSymbolicLinkName, &symbolicLinkName);

    RETURN_NTSTATUS_IF_FAILED(IoSetDeviceInterfacePropertyData(
        &symbolicLinkName,
        &DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities,
        LOCALE_NEUTRAL,
        PLUGPLAY_PROPERTY_PERSISTENT,
        DEVPROP_TYPE_BINARY,
        sizeof(capabilities), capabilities));
#pragma endregion

    return STATUS_SUCCESS;
}