次の方法で共有


Bluetooth 低エネルギー (LE) オーディオ

この記事では、Windows 11 バージョン 22H2 (KB5026446) で導入された Bluetooth LE Audio の概要について説明します。

イントロダクション

Bluetooth LE Audio を使用すると、等時性トランスポートを介して、Bluetooth LE デバイスにユニキャストまたはブロードキャストオーディオをストリーミングできます。 Bluetooth コア仕様のバージョン 5.3 以降では、ホスト プラットフォームが Bluetooth コントローラーとの間で等時性データを送受信するための標準定義ホスト コントローラー インターフェイス (HCI) はありません。 このドキュメントでは、Windows Bluetooth ベンダー固有のオーディオ パス (VSAP) を定義して、プラットフォームがベンダー固有のソリューションを使用して LE オーディオ ストリーミングBluetoothできるようにします。 VSAP ソフトウェア インターフェイスでは、Windows オーディオ クラス拡張機能 (ACX) と、このドキュメントで定義されているその他のインターフェイス プロパティを使用します。

用語と前提条件

このドキュメントでは、この表で定義されている用語に加えて、Windows オーディオ クラス拡張で定義されている用語も参照します。

任期 定義
LE オーディオ Bluetooth LE Audio の略語
クラシック オーディオ ハンズフリー プロファイル (HFP) と高度なオーディオ配布プロファイル (A2DP) を使用するBluetoothオーディオ ストリーミング
オーディオ デバイス 単一のリモート Bluetooth LE Audio デバイス、または Windows の観点から単一のオーディオ エンドポイントを構成する一連のBluetooth LE Audio デバイス。
BAP 基本オーディオ プロファイルでは、デバイスが低エネルギー (LE) 通信を使用してオーディオBluetooth配布および使用する方法を定義します。
TMAP テレフォニーおよびメディア オーディオ プロファイルは、下位レベルのオーディオ サービスとプロファイルの相互運用可能な構成を指定します。
ASCS Audio Stream Control Service は、LE Audio デバイスをBluetoothしてユニキャスト オーディオ ストリームを構成および確立するための標準的な方法を定義します。
PACS 発行済みオーディオ機能サービスは、Bluetooth LE Audio デバイスがサポートしているオーディオコーデック機能を報告するための標準的な方法を定義します。
CIS Connected Isochronous Streams トランスポートは、Bluetooth LE デバイス間でユニキャスト オーディオ データを送受信するために使用されます。
BIS ブロードキャスト 等時ストリーム トランスポートは、コネクションレス オーディオ データ転送に使用されます。
ACX オーディオ クラス拡張機能の略です。これは、Windows で LE オーディオBluetoothサポートするためにすべてのオーディオ ドライバーに必要なドライバー モデルです。
ストリーミング回線 ベンダー固有のオーディオ ドライバー スタックによって作成された 1 つ以上の ACXCIRCUIT オブジェクトのストリーミング パス。
プロファイル回路 Windows 上の Bluetooth LE オーディオ プロファイル実装によって作成された ACXCIRCUIT オブジェクト。 この ACXCIRCUIT はストリーミング回線ではありません。

この記事では、以前に定義した用語と、 Bluetooth Core 仕様で定義されている次の HCI コマンドについて理解していることを前提としています。

  • ローカル コントローラー コマンド
    • 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
  • ユニキャスト ストリーミング コマンド
    • HCI_LE_Set_CIG_Parameters
    • HCI_LE_Create_CIS
    • HCI_LE_Remove_CIG
  • ブロードキャスト ストリーミング コマンド
    • 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 は、オーディオドライバーが ACX フレームワークを使用する必要があります。 Bluetooth LE Audio に ACX を採用すると、次のようないくつかの利点があります。

  • 今後の Windows 向けに推奨されるオーディオ ドライバー モデルをサポートします。
  • ドライバー間の専用 DDI を必要とせずに、マルチ スタック オーディオ ソリューションに対する ACX のネイティブ サポートを使用します。
  • オーディオ システムから Bluetooth スタックに要求を中継するために IHV オーディオ ドライバーは必要ありません。 代わりに、ACX はプロファイル回線を介してBluetooth スタックに直接要求を送信できます。

アーキテクチャ

定義

次のコンポーネントは、さまざまな VSAP アーキテクチャバリアントに関連しています。

Windows ACX フレームワーク

このコンポーネントは、マルチスタック オーディオ エンドポイントのサポートを有効にします。 Bluetooth LE Audio の場合、オーディオ エンドポイントを構成するソフトウェア コンポーネントは、ベンダー固有のオーディオ ドライバー スタックと Windows Bluetooth LE Audio プロファイルです。

ベンダー固有のオーディオ ドライバー スタック

このベンダー固有のコンポーネントは、ベンダー定義のオーディオ インターフェイスを介して、Bluetooth コントローラーとの間Bluetooth LE オーディオ データの送受信を担当します。 受信および送信オーディオ データを管理するための ACX ストリーミング ドライバーで構成されます。 マルチ回線 ACX オーディオ エンドポイントの必要な部分である場合は、さらに ACX ドライバーが含まれる場合があります。 このコンポーネントは、このドキュメントでは IHV ACX ストリーミング ドライバーとも呼ばれます。

Windows Bluetooth LE Audio プロファイル

このコンポーネントには、Basic Audio Profile (BAP)、Volume Control Profile、および Microphone Control Profile の実装が含まれています。 これは、各Bluetooth LE Audio デバイスまたは Windows とペアリングされたデバイスのセットに対して、コントロール ACXCIRCUIT を作成する役割を担います。 また、リモート デバイスとBluetooth コントローラーからオーディオ形式を報告し、等時性チャネルとグループの状態を管理します。

Windows Bluetooth コア スタック

このコンポーネントは、Windows Bluetooth LE Audio Profile がサポートされているコーデック機能をローカル Bluetooth コントローラーから照会し、等時性チャネルとグループの状態を管理できるようにするインターフェイスを提供します。

LC3 コーデック

このサブコンポーネントは、圧縮された LC3 オーディオと PCM オーディオの間で変換されます。 エンコードとデコードの両方の機能をサポートする必要があります。 LC3 コーデックは、ベンダー固有のオーディオ ドライバー (VSAP) スタックの一部としてソフトウェアに実装できます。 または、オーディオ DSP または Bluetooth コントローラーの一部としてハードウェアに実装することもできます。 この図では、BLUETOOTH SIG でサポートされている標準コーデックであるため、LC3 が名前で示されています。 Windows でサポートされる将来のコーデックとベンダー固有のコーデックも、同様の方法でアーキテクチャに組み込まれる可能性があります。

アーキテクチャバリアント

Bluetooth LE Audio VSAP アーキテクチャでは、ストリーミングのさまざまなバリエーションがサポートされています。

  1. オーディオ オフロードなしのサイドバンド Bluetooth LE オーディオ ストリーミング
  2. オーディオ オフロードによるサイドバンド Bluetooth LE オーディオ ストリーミング
  3. ベンダー固有のインバンドBluetooth LEオーディオストリーミング

次の図では、シェーディングされたコンポーネントは IHV によって提供され、非シェーディング コンポーネントは OS によって提供されます。

オーディオ オフロードなしのサイドバンド Bluetooth LE オーディオ アーキテクチャ

サイドバンド アーキテクチャでは、ベンダー固有のオーディオ インターフェイスを使用して、オーディオ ドライバー スタックがBluetooth コントローラーにオーディオ データを送受信できるようにします。 このデータ パスは、ユニキャスト クライアントとリモート ユニキャスト サーバー間のメッセージのシグナリングなど、他のBluetooth データに使用される HCI データ パスとは別です。 次の図は、LC3 コーデックが Bluetooth コントローラでホストされているサイドバンド アーキテクチャをモデル化しています。 ソフトウェアのエンコードとデコードのために、ベンダー固有のオーディオ ドライバー スタックの一部として LC3 コーデックをホストすることも有効です。 その場合、Bluetooth コントローラーに送信されるオーディオは、PCM オーディオではなく LC3 オーディオ フレームとして書式設定されます。

次の図は、Bluetooth コントローラ内にLC3コーデックを搭載した、LE Audioアーキテクチャのサイドバンドを示しています。

Bluetooth コントローラに配置された LC3 コーデックを使用した、サイドバンド Bluetooth LE Audio アーキテクチャの図。

次の図は、Bluetooth LE Audio アーキテクチャにおいて、オーディオドライバースタック内の LC3 コーデックを使用した側帯を示しています。

オーディオ ドライバー スタックに配置された LC3 コーデックを使用した、サイドバンド Bluetooth LE Audio アーキテクチャの図。

オーディオ オフロードを備えたサイドバンド Bluetooth LE オーディオ アーキテクチャ

オーディオ オフロードを備えたサイドバンド アーキテクチャには、Bluetooth LE オーディオ ストリーミング ソリューションと省電力の利点を提供するオーディオ DSP ハードウェア コンポーネントが含まれています。 次の図は、Bluetooth コントローラーの LC3 コーデックとオーディオ DSP のコーデックを使用したアーキテクチャの例です。

次の図は、Bluetooth コントローラーにLC3コーデックを備えたオーディオオフロードアーキテクチャを持つLE Audioのサイドバンドを示しています。

Bluetooth コントローラの LC3 コーデックを備えた、オーディオ オフロード アーキテクチャを備えたサイドバンド Bluetooth LE Audio の図。

次の図は、オーディオ DSP Bluetooth LC3 コーデックを使用したオーディオ オフロード アーキテクチャを備えた LE Audio のサイドバンドを示しています。

オーディオ DSP の LC3 コーデックを備えた、オーディオ オフロード アーキテクチャを備えたサイドバンド Bluetooth LE Audio の図。

ベンダー固有のインバンドBluetooth LEオーディオアーキテクチャ

VSAP インバンド アーキテクチャを使用すると、カスタム パイプラインは、ベンダー固有のオーディオ ドライバー スタックから Bluetooth コントローラーの HCI にBluetooth LE Audio データを送受信できます。 このアーキテクチャには、"IHV ISO マージ コンポーネント" という新しいコンポーネントが含まれています。このコンポーネントは、ISO データのフロー制御を管理します。 また、HCI コマンドを送信する必要がある場合は、Windows Bluetooth Core Stack と HCI コマンド フロー制御を共有する必要があります。

次の図は、ベンダー固有のインバンドBluetooth LEオーディオアーキテクチャを示しています。

ベンダー固有のインバンドBluetooth LEオーディオアーキテクチャの図。

詳細な設計

オーディオ形式の要件

KSAUDIO_PACKETSIZE_CONSTRAINTS2

KSAUDIO_PACKETSIZE_CONSTRAINTS2 プロパティをサポートするには、IHV ACX オーディオ ドライバーが必要です。 このプロパティをサポートすると、Bluetooth LE オーディオ デバイスをウィンドウに追加してから、オーディオ デバイスをストリーミング用のアプリケーションで使用できるようになるまでの時間が短縮されます。

オーディオ フレームの継続時間

Bluetooth LE Audio プロファイルを使用すると、実装では、フレーム期間が 7.5 ミリ秒または 10 ミリ秒のオーディオ ストリーミングをサポートできます。 Windows では、両方のフレーム期間をサポートするために、IHV によって提供されるコーデックが必要です。 この要件により、Bluetooth LE Audio アクセサリ デバイスとの相互運用性と、システムに接続されている他のBluetooth LE デバイスとの品質の共存が保証されます。

信号処理モードの定義

Bluetooth LE Audio では、さまざまなユーザー シナリオをサポートするために、さまざまなストリーミング形式がサポートされています。 BAP および TMAP の仕様では、認定でサポートされる必須の形式が定義されています。 Windows では 、オーディオ信号処理モード を適用して、システムが実行しているシナリオに使用する形式を関連付けます。 Bluetooth LE Audio をサポートするオーディオ ドライバーは、次の表の信号処理モードとフォーマットのサポートを示す必要があります。 さらに、Bluetooth LE Audio は生の信号処理モードをサポートしていないため、オーディオ ドライバーはこのモードでサポートされている形式をアドバタイズしません。

ユニキャスト レンダリング ストリームのオーディオ形式と信号処理モード

BLUETOOTH LE Audio では、次の信号処理モードでユニキャスト レンダリング オーディオ形式を宣言する必要があります。

  • 既定値 (AUDIO_SIGNALPROCESSINGMODE_DEFAULT)
    • このモードは、音楽の再生、通知、ビデオ ゲームオーディオなどの一方向のレンダリング シナリオに使用されます。
  • 通信 (AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS)
    • このモードは、音声通話などの双方向シナリオで使用されます。

次の表は、各ユース ケースと信号処理モードの対称形式の一覧です。 非対称形式のサポートは、 音声シナリオのスーパーワイドバンド ステレオで定義されています。

オーディオ形式は、最も優先されるものから最も優先順位が低いものまでの順に並べられています。

ステレオ デバイスまたは調整された一連のデバイスに接続されている場合のシステム サウンド、音楽再生、およびビデオ ゲーム オーディオ

信号処理モード: デフォルト

サンプリング周波数 チャネル数 ビット深度 フレームの期間 オーディオ データ レート BAP コーデック構成 ID (BAP 仕様の表 3.11)
48 kHz 2 16 7.5 ミリ秒 96 kbps 48_3
48 kHz 2 16 7.5 ミリ秒 80 kbps 48_1
48 kHz 2 16 10 ミリ秒 96 kbps 48_4
48 kHz 2 16 10 ミリ秒 80 kbps 48_2
32 kHz (キロヘルツ) 2 16 7.5 ミリ秒 64 kbps 32_1
32 kHz (キロヘルツ) 2 16 10 ミリ秒 64 kbps 32_2
24 kHz 2 16 7.5 ミリ秒 48 kbps 24_1
24 kHz 2 16 10 ミリ秒 48 kbps 24_2
連携されたセットの単一メンバー(片方のイヤホンまたは補聴器)に接続されている場合には、システム音、音楽再生、ビデオゲームの音声が影響を受けます。

信号処理モード: デフォルト

サンプリング周波数 チャネル数 ビット深度 フレームの期間 オーディオ データ レート BAP コーデック構成 ID (BAP 仕様の表 3.11)
48 kHz 1 16 7.5 ミリ秒 96 kbps 48_3
48 kHz 1 16 7.5 ミリ秒 80 kbps 48_1
48 kHz 1 16 10 ミリ秒 96 kbps 48_4
48 kHz 1 16 10 ミリ秒 80 kbps 48_2
32 kHz (キロヘルツ) 1 16 7.5 ミリ秒 64 kbps 32_1
32 kHz (キロヘルツ) 1 16 10 ミリ秒 64 kbps 32_2
24 kHz 1 16 7.5 ミリ秒 48 kbps 24_1
24 kHz 1 16 10 ミリ秒 48 kbps 24_2
16 kHz 1 16 7.5 ミリ秒 32 kbps 16_1
16 kHz 1 16 10 ミリ秒 32 kbps 16_2
ボイス チャットを使用してボイス レコーダー、VOIP 通話、またはビデオ ゲーム オーディオをレンダリングする

信号処理モード: 通信

サンプリング周波数 チャネル数 ビット深度 フレームの期間 オーディオ データ レート BAP コーデック構成 ID (BAP 仕様の表 3.11)
32 kHz (キロヘルツ) 1 16 7.5 ミリ秒 64 kbps 32_1
32 kHz (キロヘルツ) 1 16 10 ミリ秒 64 kbps 32_2
24 kHz 1 16 7.5 ミリ秒 48 kbps 24_1
24 kHz 1 16 10 ミリ秒 48 kbps 24_2
16 kHz 1 16 7.5 ミリ秒 32 kbps 16_1
16 kHz 1 16 10 ミリ秒 32 kbps 16_2
ユニキャスト キャプチャ ストリームのオーディオ形式と信号処理モード

LE Audio Bluetooth、デフォルト(AUDIO_SIGNALPROCESSINGMODE_DEFAULT)信号処理モードでユニキャストキャプチャオーディオフォーマットを宣言する必要があります。 サポートされているキャプチャ形式の一覧を次の表に示します。

オーディオ形式は、最も優先されるものから最も優先順位が低いものまでの順に並べられています。

ボイス チャットを使用してボイス レコーダー、VOIP 通話、またはビデオ ゲーム オーディオをキャプチャする

信号処理モード: デフォルト

サンプリング周波数 チャネル数 ビット深度 フレームの期間 オーディオ データ レート BAP コーデック構成 ID (BAP 仕様の表 3.11)
32 kHz (キロヘルツ) 1 16 7.5 ミリ秒 64 kbps 32_1
32 kHz (キロヘルツ) 1 16 10 ミリ秒 64 kbps 32_2
24 kHz 1 16 7.5 ミリ秒 48 kbps 24_1
24 kHz 1 16 10 ミリ秒 48 kbps 24_2
16 kHz 1 16 7.5 ミリ秒 32 kbps 16_1
16 kHz 1 16 10 ミリ秒 32 kbps 16_2
ブロードキャスト オーディオ信号処理モード

Windows Bluetooth LE オーディオでは、既定 (AUDIO_SIGNALPROCESSINGMODE_DEFAULT) 信号処理モードでブロードキャスト ソース (レンダリング) オーディオ形式を宣言する必要があります。

Windows Bluetooth LE Audio では、Default(AUDIO_SIGNALPROCESSINGMODE_DEFAULT) 信号処理モードでブロードキャスト シンク (キャプチャ) オーディオ形式を宣言する必要があります。

次のサポートされている必要な形式の完全な一覧は、両方のロールで同じです。

システム サウンド、音楽再生、およびビデオ ゲーム オーディオ用のステレオ ブロードキャスト ストリーム

信号処理モード: デフォルト

サンプリング周波数 チャネル数 ビット深度 フレームの期間 オーディオ データ レート BAP コーデック構成 ID (BAP 仕様の表 3.11)
48 kHz 2 16 7.5 ミリ秒 96 kbps 48_3
48 kHz 2 16 7.5 ミリ秒 80 kbps 48_1
48 kHz 2 16 10 ミリ秒 96 kbps 48_4
48 kHz 2 16 10 ミリ秒 80 kbps 48_2
24 kHz 2 16 7.5 ミリ秒 48 kbps 24_1
24 kHz 2 16 10 ミリ秒 48 kbps 24_2
システム サウンド、音楽再生、およびビデオ ゲーム オーディオ用の Mono ブロードキャスト ストリーム

信号処理モード: デフォルト

サンプリング周波数 チャネル数 ビット深度 フレームの期間 オーディオ データ レート BAP コーデック構成 ID (BAP 仕様の表 3.11)
48 kHz 1 16 7.5 ミリ秒 96 kbps 48_3
48 kHz 1 16 7.5 ミリ秒 80 kbps 48_1
48 kHz 1 16 10 ミリ秒 96 kbps 48_4
48 kHz 1 16 10 ミリ秒 80 kbps 48_2
24 kHz 1 16 7.5 ミリ秒 48 kbps 24_1
24 kHz 1 16 10 ミリ秒 48 kbps 24_2
16 kHz 1 16 7.5 ミリ秒 32 kbps 16_1
16 kHz 1 16 10 ミリ秒 32 kbps 16_2

定義済みのストリーム構成とトポロジ

ユニキャスト レンダリングのみの構成
基本的なオーディオ プロファイル構成 1

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

基本的なオーディオ プロファイル構成 1 を示す図。

PC は、モノラル ストリームをサポートする単一のオーディオ デバイスに接続されています。 1 つのデバイスは、スタンドアロン デバイスか、または連携セットの 1 つの接続されたメンバーである可能性があります。

ユースケース例 Windows オーディオ設定 Bluetooth コントローラーの設定
メディア再生 レンダリング:
信号処理モード:デフォルト
チャネル数: 1
キャプチャ: なし
CIS カウント: 1
CIG カウント: 1
BAP QoS 設定: 高い信頼性
オーディオ デバイスでマイクを使用しない音声通話 レンダリング:
信号処理モード:通信
チャネル数: 1
キャプチャ: なし
CIS カウント: 1
CIG カウント: 1
BAP QoS 設定: 低待機時間
ビデオ ゲームの再生 レンダリング:
信号処理モード:デフォルト
チャネル数: 1
キャプチャ: なし
CIS カウント: 1
CIG カウント: 1
BAP QoS 設定: 低待機時間
基本的なオーディオ プロファイルの構成 4

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

基本的なオーディオ プロファイル構成 4 を示す図。

PC は、ステレオ ストリームをサポートする単一のオーディオ デバイスに接続されています。 オーディオ デバイスは、1 つの CIS で 2 つのオーディオ チャネルを処理できます。

ユースケース例 Windows オーディオ設定 Bluetooth コントローラーの設定
メディア再生 レンダリング: 信号処理モード: 既定値
チャネル数: 2
キャプチャ: なし
CIS カウント: 1
CIG カウント: 1
BAP QoS 設定: 高信頼性のオーディオチャンネル割り当て: フロント左、フロント右
ビデオ ゲームの再生 信号処理モード:デフォルト
チャネル数: 2
キャプチャ: なし
CIS カウント: 1
CIG カウント: 1
BAP QoS 設定: 低待機時間
オーディオ チャネルの割り当て: フロント左右
基本的なオーディオ プロファイル構成 6(i)

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

基本的なオーディオプロファイル構成6Iを示す図。

PC は、ステレオ ストリームをサポートする単一のオーディオ デバイスに接続されています。 オーディオ デバイスは、2 つの CIS のそれぞれで 1 つのオーディオ チャネルのみを処理できます。

ユースケース例 Windows オーディオ設定 Bluetooth コントローラーの設定
メディア再生 信号処理モード:デフォルト
チャネル数: 2
キャプチャ: なし
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 高い信頼性
オーディオ デバイスでマイクを使用しない音声通話 信号処理モード:通信
チャネル数: 1
キャプチャ: なし
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
オーディオ チャネルの割り当て: フロント左またはフロント右
ビデオ ゲームの再生 信号処理モード:デフォルト
チャネル数: 2
キャプチャ: なし
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
オーディオ チャネルの割り当て: フロント左右
基本的なオーディオ プロファイルの構成 6(ii)

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

基本的なオーディオプロファイル構成6 IIを示す図。

PC は、調整されたオーディオ デバイスのセットに接続されています。 このセットは、各メンバーが 1 つのチャネルを処理する 2 つのオーディオ チャネルを処理できます。

ユースケース例 Windows オーディオ設定 Bluetooth コントローラーの設定
メディア再生 信号処理モード:デフォルト
チャネル数: 2
キャプチャ: なし
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 高い信頼性
いずれのデバイスでもマイクのない音声通話 信号処理モード:通信
チャネル数: 1
キャプチャ: なし
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
ビデオ ゲームの再生 信号処理モード:デフォルト
チャネル数: 2
キャプチャ: なし
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
ユニキャスト双方向構成

双方向構成は、Bluetooth LE Audio プロファイルが、アプリケーションがリモート デバイスまたは一連のデバイスにキャプチャ ストリームとレンダリング ストリームの両方を作成することを検出するときに使用されます。 アプリケーションは、キャプチャ ストリームとレンダリング ストリームを個別に制御します。 したがって、IHV オーディオ ドライバーとBluetooth コント ローラーは、プロビジョニング後に双方向 CIS の単一の方向にオーディオを流すことを許可する必要があります。 このプロビジョニングでは、HCI コマンドの [データ パスの構成] と [LE Setup ISO Data Path] を使用します。

基本的なオーディオ プロファイルの構成 3

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

基本的なオーディオ プロファイル構成 3 を示す図。

PC は、1 つの CIS で確立された双方向モノラル ストリームを使用して、単一のオーディオ デバイスに接続されます。

使用事例 Windows オーディオ設定 Bluetooth コントローラーの設定
音声通話 レンダ:
信号処理モード:通信
チャネル数: 1
捕獲:
信号処理モード:デフォルト
チャネル数: 1
CIS カウント: 1
CIG カウント: 1
BAP QoS 設定: 低待機時間
ボイス チャットを使用したビデオ ゲームの再生 レンダ:
信号処理モード:通信
チャネル数: 1
捕獲:
信号処理モード:デフォルト
チャネル数: 1
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
基本的なオーディオ プロファイル構成 8(i)

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

基本的なオーディオプロファイル構成8Iを示す図。

PC は、ステレオ レンダリング ストリームとモノラル キャプチャ ストリームをサポートする単一のオーディオ デバイスに接続されています。 デバイスは、特定の方向に対して 1 つの CIS でオーディオの 1 つのチャネルを処理できます。

使用事例 Windows オーディオ設定 Bluetooth コントローラーの設定
音声通話 レンダ:
信号処理モード:通信
チャネル数: 1 または 2
捕獲:
信号処理モード:デフォルト
チャネル数: 1
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
ボイス チャットを使用したビデオ ゲームの再生 レンダ:
信号処理モード:通信
チャネル数: 2
捕獲:
信号処理モード:デフォルト
チャネル数: 1
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
基本的なオーディオ プロファイル構成 8(ii)

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

基本的なオーディオプロファイル構成8 IIを示す図。

PC は、調整されたオーディオ デバイスのセットに接続されています。 各セット メンバーは、レンダー オーディオの 1 つのチャネルを受け取ります。 1 つのセット メンバーに確立されたキャプチャ ストリームがあります。 キャプチャ ストリームを持つセット メンバーは、キャプチャ ストリームもサポートする PC に接続する最初のセット メンバーです。

使用事例 Windows オーディオ設定 Bluetooth コントローラーの設定
音声通話 レンダ:
信号処理モード:通信
チャネル数: 1 または 2
捕獲:
信号処理モード:デフォルト
チャネル数: 1
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
ボイス チャットを使用したビデオ ゲームの再生 レンダ:
信号処理モード:通信
チャネル数: 2
捕獲:
信号処理モード:デフォルト
チャネル数: 1
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
ユニキャスト キャプチャのみの構成
基本的なオーディオ プロファイル構成 2

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

基本的なオーディオ プロファイル構成 2 を示す図。

PC は、モノラル キャプチャ ストリームをサポートする単一のオーディオ デバイスに接続されています。

使用事例 Windows オーディオ設定 Bluetooth コントローラーの設定
デバイスに話者がいない音声通話 レンダ: 何一つ
捕獲:
信号処理モード:デフォルト
チャネル数: 1
CIS カウント: 1
CIG カウント: 1
BAP QoS 設定: 低待機時間
基本的なオーディオ プロファイル構成 9(i)

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

基本的なオーディオプロファイル構成9Iを示す図。

PC は、ステレオ オーディオ データの送信をサポートする単一のオーディオ デバイスに接続されています。 デバイスは、1 つの CIS でオーディオの 1 つのチャネルをエンコードできます。

使用事例 Windows オーディオ設定 Bluetooth コントローラーの設定
マルチチャンネルマイクキャプチャ レンダ: 何一つ
捕獲:
信号処理モード:デフォルト
チャネル数: 1
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間
基本的なオーディオ プロファイル構成 9(ii)

PC は、モノラル キャプチャ ストリームをサポートする単一のオーディオ デバイスに接続されています。

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.1 で定義されています

PC を 1 つのオーディオ デバイスに接続した基本的なオーディオ プロファイル構成 9(ii) を示す図。

PC は一連のオーディオ デバイスに接続されています。 各セット メンバーは、オーディオの 1 つのチャネルを PC に送信します。

使用事例 Windows オーディオ設定 Bluetooth コントローラーの設定
マルチチャンネルマイクキャプチャ レンダ: 何一つ
捕獲:
信号処理モード:デフォルト
チャネル数: 1
CIS カウント: 2
CIG カウント: 1
BAP QoS 設定: 低待機時間

リモート デバイスまたはデバイス セットが双方向オーディオをサポートしている場合、キャプチャのみのストリームの構成は双方向の場合と同じです。 この構成により、キャプチャのみのシナリオから双方向シナリオに移行できます。ストリームを再作成する必要はありません。

ブロードキャスト ソースの構成
基本的なオーディオ プロファイル構成 12

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.2 で定義されています

PC がモノラルの単一のオーディオ デバイスに接続された基本的なオーディオ プロファイル構成 12 を示す図。

PC はモノラル オーディオの 1 つのチャネルをブロードキャストしています。

使用事例 Windows オーディオ設定 Bluetooth コントローラーの設定
システムサウンド、音楽再生 レンダ:
信号処理モード:デフォルト
チャネル数: 1
BIS カウント: 1
BIG Count: 1
BAP QoS 設定: 高い信頼性
ビデオ ゲームオーディオ レンダ:
信号処理モード:デフォルト
チャネル数: 1
BIS カウント: 1
BIG Count: 1
BAP QoS 設定: 低待機時間
基本的なオーディオ プロファイルの構成 13

次のオーディオ構成は、Bluetooth BAP 仕様の表 4.2 で定義されています

PC がステレオで 1 つのオーディオ デバイスに接続された基本的なオーディオ プロファイル構成 13 を示す図。

PC は、各チャネルが独自の BIS で送信されるステレオ オーディオをブロードキャストしています。

使用事例 Windows オーディオ設定 Bluetooth コントローラーの設定
システムサウンド、音楽再生 レンダ:
信号処理モード:デフォルト
チャネル数: 2
BIS カウント: 1
BIG Count: 1
BAP QoS 設定: 高い信頼性
ビデオ ゲームオーディオ レンダ:
信号処理モード:デフォルト
チャネル数: 1
BIS カウント: 1
BIG Count: 1
BAP QoS 設定: 低待機時間

データ構造

MICROSOFT で定義された Bluetooth LE Audio インターフェイスのプロパティ

ストリーム作成プロパティ

次のプロパティは、ベンダー固有のオーディオ ドライバー スタックと ACXOBJECTBAGDDI を介して Bluetooth LE Audio Profile の間で共有されます。 これらのプロパティは、ストリームの作成シナリオに示すように、ストリーム エンドポイントの 作成 と構成に関する決定を通知します。

Bluetooth LE オーディオ コーデック能力

オーディオ ドライバーは、オーディオ ドライバーまたはオーディオ DSP でサポートされているオーディオ ストリーミング機能のサポートを示すように、このプロパティを設定します。 プロパティ値は DDI AcxObjectBagAddBlob を使用して設定され、値の形式は PACS 仕様で定義されている PAC レコードと同じです。

Windows Bluetooth LE Audio プロファイルは、プロパティを読み取って、使用できるコーデック構成とストリーム構成を決定します。

フィールド オクテット
処理能力数 0
コーデック ID[i] 1-6
コーデック固有の機能の長さ[i] 7
コーデック固有の機能 8... n
メタデータの長さ (m) n + 1
メタデータ n+2...m

フィールド値は、PACS 仕様の表 3.2 および表 3.4 で定義されています。

Bluetooth_DatapathID

オーディオ ドライバーは、コマンドのHCI_LE_Setup_ISO_Data_PathとHCI_Configure_Data_Pathのパラメーターとして使用されるデータ パス ID を示すように、このプロパティを設定します。 プロパティ値は 、AcxObjectBagAddUI8 DDI を使用して設定されます。

Bluetooth LE Audio プロファイルは、このプロパティを読み取って使用し、HCI_Configure_Data_PathコマンドとHCI_LE_Setup_ISO_Data_Path コマンドのパラメーターとして使用します。 この ID は、オブジェクト バッグに関連付けられている ACXSTREAM に対して作成されたすべての等時性ストリームに適用されます。 ストリーム接続ごとに異なるデータ パス ID を割り当てるには、オーディオ ドライバーで KSPROPERTY_BtLeAudio_DATAPATH_ID を使用します。

フィールド オクテット
データ パス ID 0

オーディオ ドライバーでこのプロパティが設定されていない場合、OS は HCI コマンドのパラメーターとして値 1 を使用します。

Bluetooth_DatapathConfiguration

オーディオ ドライバーは、HCI_Configure_Data_Path コマンドを使用して、Bluetooth コント ローラーにベンダー固有の構成を提供するには、このプロパティを設定します。 255 バイトを超えてはなりません。これは、Bluetooth コントローラーが HCI コマンドに対して受け入れる最大のペイロードです。 プロパティ値は 、AcxObjectBagAddBlob DDI を使用して設定されます。 この構成は、オーディオ ドライバーによって設定されたすべてのデータ パス ID に適用されます。 データパス ID ごとに異なるデータ パス構成を割り当てるには、オーディオ ドライバーで KSPROPERTY_BtLeAudio_DATAPATH_CONFIG を使用します。

Bluetooth_RequiresHciTransportInD0ForStreaming

オーディオ ドライバーは、オーディオ ストリームがアクティブな間、Bluetooth コントローラーが低電力状態に遷移しないことを示すように、このプロパティを設定します。 プロパティ値は 、AcxObjectBagAddUI8 DDI を使用して設定されます。

フィールド オクテット
ActiveTransportRequired (1 に設定する必要があります) 0
BluetoothLEAudio コーデック構成

このプロパティは、コーデック構成がオーディオ デバイスで構成された後、DDI AcxObjectBagAddBlob を使用して、Bluetooth LE Audio プロファイルによって設定されます。 値の構造は次のとおりです。

フィールド オクテット
構成数 0
ストリーム接続ハンドル[i] 1-2
コーディング形式[i] 3
会社 ID[i] 4-5
ベンダー固有のコーデック ID[i] 6-7
コーデック固有の構成長[i]
コーデック固有の構成[i] 9... n

フィールド値は、 Bluetooth Audio Stream Control Service 仕様の表 4.3 から派生しています。

LC3 コーデックが ACX ストリーミング ドライバーまたはオーディオ DSP にある場合は、ベンダー固有のオーディオ ドライバー スタックでこのプロパティを読み取る必要があります。

BluetoothLEAudio_StreamConnectionHandles

このプロパティは、BIG または CIG 用に作成された BIS または CIS ハンドルの一覧をオーディオ ドライバーに通知するために、Bluetooth LE オーディオ プロファイルによって設定されます。 ハンドルの順序は、Bluetooth コントローラーから HCI コマンド LE_Set_CIG_Parametersまたは HCI イベント LE_Create_BIG_Completeに返される順序と一致します。 値の構造は次のとおりです。

フィールド サイズ オクテット
接続ハンドルの数 1 0
接続ハンドル[i] 2 1-n
BLUETOOTH LE Audio KS プロパティ

KS プロパティを使用すると、ストリームの作成後に IHV ACX オーディオ ドライバーでオーディオ ストリームの設定を設定または更新できます。 このシナリオは、オーディオ ドライバーがストリームの作成手順でBluetooth プロファイル回線によって設定されたプロパティに基づいて構成設定を設定するのに役立ちます。

定義

#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

この KSProperty を使用すると、ストリームの作成コールバックが呼び出された後、IHV ACX オーディオ ドライバーは、Bluetooth_DatapathID によって設定された値を設定または更新できます。 また、このプロパティを使用すると、IHV オーディオ ドライバーは、BluetoothLEAudio_CodecConfigurationのコーデック構成エントリごとに異なるデータ パス ID を割り当てることができます。 このプロパティの値は、すべてのコーデック構成に使用されるデータ パス ID を表す 1 バイトの値に設定するか、n バイト (n は BluetoothLEAudio_CodecConfiguration プロパティで設定された構成カウント値と等しい) に設定する必要があります。 値に複数のデータ パス ID が含まれている場合、ID の順序は、プロパティ BluetoothLEAudio_CodecConfigurationの順序に応じてコーデック構成に使用されます。

KSPROPERTY_BtLeAudio_DATAPATH_CONFIG

この KSProperty を使用すると、IHV ACX オーディオ ドライバーは、Bluetooth_DatapathConfiguration で定義されているデータ パス構成を設定または更新できます。 KSProperty は、オーディオ ストリームの開始コールバックが呼び出される前に、オーディオ ドライバーによってBluetooth プロファイルに送信されます。 このプロパティは、すべてのデータ パスに対して単一の構成を 1 方向に設定したり、BluetoothLEAudio_CodecConfigurationに設定された各コーデック構成エントリに特定のデータ パス構成を設定したりするために使用できます。 値に複数のデータ パス構成が含まれている場合、構成の順序は、プロパティ BluetoothLEAudio_CodecConfigurationの順序に基づいてコーデック構成エントリに使用されます。 コーデック構成の数は、KSPROPERTY_BtLeAudio_DATAPATH_IDまたは Bluetooth_DatapathID によって設定されたデータ パス ID の数と等しい必要があります。

フィールド サイズ 価値
構成数 1 バイト BluetoothLEAudio_CodecConfigurationで設定された 1 またはコーデック設定数
構成サイズ[i] 1 バイト 255 を超えてはならない。
Configuration[i] 構成サイズ[i]  

インターフェイス

オーディオ エンドポイント テンプレートのバインド ID

ペアリングされたBluetooth デバイスの ACX 回線がいつ作成されているかを知るために、オーディオ ドライバーの ACX 回線ファクトリによって使用されます。

LE オーディオ回路Bluetooth作成するには、次のコンポーネント ID を使用します。

// {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 サポート インターフェイス

オーディオ ドライバー スタックが、LE Audio Bluetoothストリーミングで使用可能であることを示すために使用されます。 Windows Bluetooth Audio サービスレベルでこのインターフェイスを監視し、公開されるまで待機してから、Bluetooth LE Audio サポートを有効にします。

Bluetooth LE Audio サポート インターフェイスを公開するには、次のインターフェイス ID を使用します。

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

一般的なシーケンス

ユニキャストとブロードキャストの両方の LE オーディオ シナリオに対して、次のシーケンスが実行されます。

オーディオ ドライバーの初期化

IHV ACX ストリーミング ドライバーが読み込み、LE オーディオ ストリーミングBluetoothサポートしていると判断した場合は、 ACXFACTORYCIRCUIT オブジェクトを作成し、 オーディオ エンドポイント テンプレート バインド ID で定義されている ID を使用して ACX でBluetoothテンプレート バインドを登録することによって、テクノロジのサポートを示す必要があります。

Bluetooth LE Audioドライバの初期化シーケンスを示すフローチャート。

ユニキャスト オーディオ シーケンス

エンドポイントの作成
  1. LE Audio デバイスがシステムとペアリングされている場合、Bluetooth LE Audio Profile:

    1. リモート デバイスの公開されたオーディオ機能を読み取ります。
    2. HCI_Read_Local_Support_Codecs [v2] および HCI_Read_Local_Supported_Codec_Capabilities コマンドを送信して、コントローラーでサポートされている機能を検出します。
    3. Bluetooth コントローラーとリモート オーディオ デバイスでサポートされているコーデック機能に基づいて、サポートされている形式が設定された ACXCIRCUIT を作成します。 コーデックのサポートがオーディオ DSP またはオーディオ ドライバーにあるため、コントローラーがコーデックをサポートしていない場合、サポートされる形式はリモート オーディオ デバイスでサポートされている形式に設定されます。
  2. ACXCIRCUIT が作成されると、ACX は、ストリーム処理用の ACXCIRCUIT を作成するために、IHV ACX ストリーミング ドライバーの ACX 回線ファクトリを要求します。

  3. 回線を作成する要求を受信すると、IHV ACX ストリーミング ドライバー。

    1. ACXCIRCUITACXPINACXOBJECTBAGおよび ACXSTREAMBRIDGE オブジェクトを作成します。
    2. LC3 またはベンダー固有のコーデックがオーディオ ドライバーまたは DSP でホストされている場合、IHV ACX ストリーミング ドライバーは ACXOBJECTBAGBluetoothLEAudio_CodecCapabilitiesプロパティを設定します。
    3. IHV ACX ストリーミング ドライバーは、ACXOBJECTBAG Bluetooth_DatapathID または Bluetooth_DatapathConfiguration (現時点でわかっている場合) を設定できます。
  4. 両方の回線が作成されると、ACX は IHV ACX ドライバーのブリッジ ピンで EvtAcxPinConnected コールバックを呼び出します。

  5. EvtAcxPinConnected コールバックが呼び出されると、IHV ACX ストリーミング ドライバーが呼び出されます。

    1. AcxTarget を使用してプロファイル回線のブリッジ ピンを取得 します。.. プロファイル回線でサポートされている形式を取得する API。
    2. プロファイル回線によって設定された ACXDATAFORMATの一覧を反復処理します。 Bluetooth オーディオ コーデックがオーディオ ドライバーまたはオーディオ DSP でホストされている場合、IHV オーディオ ドライバーは、コーデックとプロファイル回線でサポートされている形式で ACXDATAFORMATを更新します。 それ以外の場合、すべての形式が IHV ACX ストリーミング ドライバーのホスト ピンにコピーされます。
    3. オフロード ストリーミング用にオーディオ エンジンが作成された場合に、ブリッジ ピンの更新された形式の一覧を設定します。
  6. フォーマットが更新されると、ACX は両方のインターフェイスを有効にし、オーディオ エンドポイントが作成されます。

    BLUETOOTH LE Audio エンドポイントの作成プロセスを示すフローチャート。

ストリームの作成
  1. アプリケーションがオーディオ ストリームの作成を要求すると、ACX は、IHV ACX ストリーミング ドライバーから始まる、各回線に対して登録済みの EvtCircuitCreateStream コールバックを呼び出します。

  2. EvtCircuitCreateStream コールバックが呼び出されると、IHV ACX ストリーミング ドライバーは次のようになります。

    1. ACXSTREAMBRIDGE にアタッチされている ACXOBJECTBAG の Bluetooth_DatapathId プロパティと Bluetooth_DataPathConfiguration プロパティを設定または更新します。
    2. ストリーム状態遷移と RT ストリーム処理のコールバックが設定された ACXSTREAM を作成します。
    3. オーディオ パイプラインがオフロード ストリーミングをサポートしている場合は、ストリームにオーディオ エンジン要素を作成します。
    4. ACXSTREAM をストリーム ブリッジに追加します。 これにより、Bluetooth LE Audio プロファイルの EvtCircuitCreateStream コールバックが 呼び出されます。
  3. その EvtAcxCircuitCreateStream コールバックが呼び出されると、Bluetooth LE Audio プロファイル。

    1. 将来のストリーム遷移コールバックのために、IHV ACX ストリーミング ドライバーによって設定された ACXOBJECTBAG からローカルにプロパティを保存します。
    2. BAP 仕様で定義されている構成コーデック操作を実行します。 操作のパラメーターは、EvtAcxCircuitCreateStream コールバックで指定された ACXDATAFORMAT、ACXOBJECTBAG の他のストリーム パラメーター、またはBluetooth コントローラーでサポートされているコーデック機能から派生します。
    3. HCI LE Set CIG Parameters コマンドを送信してストリーム リソースを割り当てます。
    4. Bluetooth コントローラーによって返される CIS 接続ハンドルの一覧を使用して、BluetoothLEAudio_StreamConnectionHandles プロパティを設定します。
    5. ACXOBJECTBAGBluetoothLEAudio_CodecConfiguration プロパティに、リモート オーディオ デバイスの構成に使用する値を設定します。
  4. IHV ACX ストリーミング ドライバーが、プロファイルによって設定されたオブジェクト バッグの値に基づいてデータ パス ID またはデータ パスの構成を更新する必要がある場合は、KSPROPERTY セット操作を呼び出して、プロファイル回線によって格納されている値を更新できます。

    1. ストリーム状態遷移のコールバックが設定された ACXSTREAM を作成します。

    BLUETOOTH LE オーディオ ストリーム作成プロセスを示すフローチャート。

ストリーム状態の遷移

ACX は、オーディオ フローに基づいてストリーム状態遷移の回線順序を決定し、状態がよりアクティブまたは少ないアクティブな状態に遷移しているかどうかを決定します。

  • レンダー ストリームがアクティブでない状態からよりアクティブな状態に向かう場合、プロファイル回線は最初にイベントを受け取り、次にストリーミング回線を受け取ります。
  • レンダー ストリームがよりアクティブな状態からアクティブでない状態に向かう場合、ストリーミング回線は最初にイベントを受信し、次にプロファイル回線を受け取ります。 
  • キャプチャ ストリームがアクティブでない状態からよりアクティブな状態に移動する場合、ストリーミング回線は最初にイベントを受信し、次にプロファイル回線を受信します。 
  • キャプチャ ストリームがよりアクティブな状態からアクティブでない状態に移動する場合、プロファイル回線は最初にイベントを受信し、次にストリーミング回線を受信します。

ストリームを準備する

EvtAcxStreamPrepareHardware コールバックが呼び出されると、Bluetooth LE Audio プロファイルは ASCS 構成 QoS 操作を送信して、必要に応じて設定をリモート デバイスと同期します。 双方向ストリームの他の方向に対してコールバックが呼び出されたときに、ASCS 構成 QoS 操作が既に完了している可能性があります。

プロファイル回路のBLUETOOTH LEオーディオストリーム準備を示すフローチャート。

EvtAcxStreamPrepareHardware コールバックが呼び出されると、IHV ACX ストリーミング ドライバーは必要なストリーミング リソースを割り当て、取得された状態になるオーディオ パイプラインを初期化します。

ストリーミング回路のBluetooth LE オーディオ ストリームの準備を示すフローチャート。

ストリームの開始

EvtAcxStreamRun コールバックが呼び出されると、Bluetooth LE Audio プロファイルは次のようになります。

  1. 以下で説明するように、ACX ストリーミング ドライバーの構成引数が変更されている場合は、HCI_Configure_Data_Path コマンドを使用して適用します。 Windows Bluetooth Core Stack は、各Data_Path_DirectionとData_Path_IDのペアのVendor_Specific_Config バッファーをキャッシュします。 HCI_Configure_Data_Path コマンドは、Data_Path_DirectionとData_Path_IDのペアのVendor_Specific_Configが変更された場合にのみ送信されます。
    1. Data_Path_Directionは、EvtAcxStreamRun コールバックを発行するストリーミング回線コールバックの AudioDirection です。
    2. Data_Path_IDには、次のいずれかのソースから最近割り当てられた値が設定されます。
      1. EvtCircuitCreateStream コールバック中に Windows Bluetooth LE Audio Profile に渡された ACXSTREAMBRIDGE にアタッチされた ACXOBJECTBAG の Bluetooth_DatapathID。
      2. KSPROPERTY_BtLeAudio_DATAPATH_IDからのデータ。
    3. Vendor_Specific_Config データには、次のいずれかのソースから最近割り当てられた値が設定されます。
      1. Bluetooth_DatapathConfiguration on the ACXOBJECTBAG attached to the ACXSTREAMBRIDGE passed to the Windows Bluetooth LE Audio Profile circuit during the EvtCircuitCreateStream callback.
      2. KSPROPERTY_BtLeAudio_DATAPATH_CONFIGからのデータ。
  2. ASCS Enable 操作をリモート デバイスに送信します。
  3. HCI_LE_Create_CIS コマンドを使用して CIS をまだ作成していない場合は、CIS を作成します。
  4. データ パスがまだ構成されていない場合は、Bluetooth LE オーディオ プロファイル。
    1. HCI_LE_Setup_ISO_Data_Path コマンドを使用して ISO データ パスを確立します
      1. IHV ACX ストリーミング ドライバーがプロパティ BluetoothLEAudio_CodecCapabilitiesを設定する場合、HCI_LE_Setup_ISO_Data_PathのCodec_ID フィールドの値は、Bluetooth割り当てられた番号で定義されている透明 (0x3) に設定する必要があります。 それ以外の場合、値は、ストリーム作成手順の構成コーデック操作で使用されるコーデック ID と同じである必要があります。
  5. オーディオ ストリームがキャプチャ ストリームの場合、Bluetooth LE オーディオ プロファイルは BAP レシーバーの起動準備操作を実行します。

プロファイル回路のBluetooth LE オーディオ ストリーム開始プロセスを示すフローチャート。

EvtAcxStreamRun コールバックが呼び出されると、IHV ACX ストリーミング ドライバーは、Windows オーディオ システム (レンダリング) またはBluetooth コントローラー (キャプチャ) からの受信オーディオ データの処理を開始します。

ストリーミング回路のBLUETOOTH LEオーディオストリーム開始処理を示すフローチャート。

ストリームの一時停止

EvtAcxStreamPause コールバックが呼び出されると、Bluetooth LE Audio プロファイルは次のようになります。

  1. BAP ユニキャスト ストリーム無効化手順を実行します。
  2. HCI_LE_Remove_ISO_Data_Path コマンドを使用して ISO データ パスを削除します。
  3. オーディオ ストリームがユニキャスト キャプチャ ストリームの場合は、ASCS レシーバーの停止準備手順を実行します。
  4. その CIS で他のストリームが使用されていない場合は、CISes を切断します。

プロファイル回路のBluetooth LE オーディオ ストリームの一時停止プロセスを示すフローチャート。

EvtAcxStreamPause コールバックが呼び出されると、IHV ACX ストリーミング ドライバーはオーディオ処理パイプラインを一時停止します。

ストリーミング回路のBluetooth LE オーディオ ストリームの一時停止プロセスを示すフローチャート。

リリース ストリーム

EvtAcxStreamReleaseHardware コールバックが呼び出されると、Bluetooth LE Audio Profile:

  1. リモート Bluetooth LE Audio デバイスに ASCS リリース操作を送信します
  2. すべての CIS が切断されている場合は、CIG を削除します。

プロファイル回路のBLUETOOTH LEオーディオストリーム解放処理を示すフローチャート。

EvtAcxStreamReleaseHardware コールバックが呼び出されると、IHV ACX ストリーミング ドライバーはオーディオ パイプライン リソースを解放します。

ストリーミング回路のBluetooth LE オーディオ ストリーム解放プロセスを示すフローチャート。

エンドポイントの切断

Windows Bluetooth LE Audio プロファイルは、リモート ユニキャスト デバイスが PC への LE-ACL 接続を持っていない場合、または PACS で使用可能なオーディオ コンテキストを介してストリーミングに使用できないことを報告している場合に、エンドポイントの接続状態を更新します。 エンドポイントが切断されると、Windows オーディオ サービスによってエンドポイントへのアクティブなストリームが無効になります。 これにより、ストリームの一時停止と解放シーケンスが発生します。

音量とミュート

IHV ACX ストリーミング回線には、ストリーミング ドライバーにオーディオ エンジンが必要な場合にのみ、ボリューム要素とミュート要素を含める必要があります。 オーディオ エンジンを使用する場合は、次のように構成フラグを設定する必要があります。

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.

この設定は、Bluetooth LE Audio エンドポイントが、Bluetooth SIG で定義されたボリュームおよびマイク制御プロファイルを使用して、ユニキャストオーディオエンドポイントのボリュームやミュートの変更を行うために必要です。

リモート Bluetooth LE Audio デバイスがボリュームまたはマイク制御サービスをサポートしていない場合、またはエンドポイントがブロードキャスト オーディオ用に作成されている場合、オーディオ エンジンのボリューム要素とミュート要素は、オーディオ システムからの変更要求を処理するためのフォールバックとして機能します。 Windows オーディオ システムは、音量とミュートの変更を処理します。 オーディオ エンジンがなく、リモート デバイスがボリュームをサポートしていない場合、またはマイク サービスまたはオーディオ エンドポイントがブロードキャスト オーディオ用である場合。

エンドポイントの削除

プロファイル回路またはストリーミング回路が破棄されると、Bluetooth LE オーディオ エンドポイントがシステムから削除されます。 プロファイル回線は、リモート ユニキャスト デバイスのペアリングが Windows から削除された場合、または Bluetooth 無線が無効になっている場合に削除できます。

  1. Windows Bluetooth LE オーディオ プロファイルが回線を削除すると、ACX はエンドポイント インターフェイスを無効にして、エンドポイントを削除する必要があることを Windows オーディオ サービスに通知します。
  2. インターフェイスが無効になっている場合、Windows オーディオ サービスは、Bluetooth LE オーディオ エンドポイントへのアクティブなストリームを無効にします。この操作により、ストリームの一時停止と解放のコールバックがストリーミング回線で呼び出されます。
  3. エンドポイントの削除を完了するために、ACX は IHV ACX ストリーミング ドライバーの回線を無効にします。その結果、WDF は回線のクリーンアップ コールバックを呼び出します。
  4. クリーンアップ コールバックが呼び出されると、IHV ACX ストリーミング ドライバーは、その回線を解放します。

BLUETOOTH LE Audio エンドポイントの削除プロセスを示すフローチャート。

Bluetooth LE とクラシック オーディオの共存

Windows では、両方のテクノロジをサポートするペアリングされたBluetoothオーディオ デバイスに対して、クラシック オーディオまたは LE オーディオのみがアクティブであることを確認する必要があります。 LE オーディオがアクティブな場合、リモート デバイスの A2DP および HFP のサイドバンド DDI が無効になり、LE オーディオ エンドポイントのプロファイル回線が作成されます。 クラシック オーディオがアクティブな場合、リモート デバイスの A2DP と HFP のサイドバンド DDI が有効になり、LE オーディオ エンドポイント用にプロファイル回線が作成されません。

電源管理

Bluetooth LE Audio には、電源管理の要件や WDF で既に定義されているもの以外のフローはありません。

音声シナリオ向けのスーパーワイドバンド ステレオ

今日のBluetoothオーディオ エクスペリエンスは便利ですが、有線オーディオ エクスペリエンスと比較すると特に制限があります。 ユーザーが直面する結果を伴う重要な制限の 1 つは、マイクがアクティブなときは常にモノラル オーディオへのドロップです。 これにより、Teams や他の VoIP アプリの空間オーディオなどのエクスペリエンスが機能しなくなります。これにより、ボイス チャットを含むゲーム エクスペリエンスが大幅に低下します。

Bluetooth LE Audio は、マイクの使用中にステレオ再生のサポートを追加することで、オーディオの忠実性を向上させ、待機時間を短縮することでギャップを埋めます。

レンダリング/キャプチャ形式のペア

IHV ソリューションは、レンダリング/キャプチャ形式のペアの一覧を提供することで、モノラル キャプチャを使用したステレオ レンダリングのサポートをアドバタイズします。各ペアは、双方向ストリーミングに同時に使用できるステレオ レンダリング形式とモノラル キャプチャ形式で構成されます。 ステレオ レンダリング (またはモノラル キャプチャ) 形式は、特定のオーディオ コーデックに関連付けられたSampling_Frequency (16/24/32/48 kHz など) とAudio_Channel_Count (1/2 ch など) のペアとして定義されます。これは LC3 に限定されません。

たとえば、IHV ソリューションで 16kHz モノラル キャプチャを使用した 16kHz ステレオ レンダリングと、24kHz または 32kHz モノラル キャプチャを使用した 48kHz ステレオ レンダリングの両方をサポートするとします。 対応するレンダー/キャプチャ形式のペアは次のようになります。

エントリ レンダリング形式 キャプチャ形式
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)

表 3: レンダリングとキャプチャの形式のペアのサンプル

調整されたセット メンバーはいつでも結合または不整合になる可能性があるため、IHV ソリューションでは、フォーマット ペア内の各エントリに対して、同じサンプリング周波数でモノラル キャプチャを使用したモノラル レンダリングをサポートする必要があります。 これは、表 3 の例では、明示的に宣言されていない場合でも、以下のすべての書式ペアも暗黙的にサポートされる必要があることを意味します。

エントリ レンダリング形式 キャプチャ形式
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)

表 4: 表 3 の暗黙的なレンダリング/キャプチャ形式のペア

表 3 と表 4 の主な違いは、後者の各レンダリング形式のAudio_Channel_Countが 1 に設定されていることです ("mono render" の場合)。それ以外はすべて同じままです。

必須のレンダリング/キャプチャ形式のペア

表 5 では、すべての IHV ソリューションがサポートするオーディオ形式の一覧を定義します。

エントリ (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) }

表 5 必須のレンダリング/キャプチャ形式のペア

機能の提供情報

Bluetooth コントローラーが関連するオーディオ コーデック (既定では LC3) をサポートしているかどうかに応じて、IHV ソリューションは、サポートするレンダー/キャプチャ形式のペアの一覧をさまざまな方法でアドバタイズします。 具体的な内容は次のとおりです。

  • コーデックが Bluetooth コントローラーにある場合、コントローラーと IHV ACX ストリーミング ドライバーの両方が、フォーマット ペアのリストを個別にアドバタイズする必要があります。 2 つのリストが互いに一致しない場合、Windows は交差し、共通部分を保持します。

  • コーデックがBluetooth コントローラーにない場合 (オーディオ DSP など)、フォーマット ペアの一覧をアドバタイズするために必要なのは IHV ACX ストリーミング ドライバーだけです。 Bluetooth コントローラー

HCI_Read_Local_Supported_Codec_Capabilitiesの応答の Codec_Capability[i] はメタデータをサポートしていないため、Bluetooth コントローラーは、Microsoft 固有のコーデック ID のファミリ (表 7 を参照) をサポートする必要があります。これにより、Windows は、既存の HCI インターフェイスを介して簡単に伝達できないレンダリング/キャプチャ形式ペアの一覧など、より多くのコーデック機能を照会できます。

パラメーター サイズ (オクテット) Description
Codec_ID 5 オクテット 0: 0xFF (ベンダー固有)

オクテット 1 から 2: 0x0006 (Microsoft)

オクテット 3 から 4: ベンダー定義のコーデック ID

オクテット 4 の最上位ビットがゼロ (0) に設定されている場合、オクテット 3 には、0XFFを除き、SIG で承認されたコーディング形式 (2024 年 5 月 31 日の時点で0x00から0x07まで) が含まれます。

オクテット 4 の最上位ビットが 1 に設定されている場合、オクテット 3 には、まだ定義されておらず、将来使用するために Windows によって予約されているコーディング形式が含まれます。

表 7 Microsoft 固有のコーデック ID

これらの Microsoft 固有のコーデック ID のスコープは、次に制限されます。

  • HCI_Read_Local_Supported_Codecs [v2]
  • HCI_Read_Local_Supported_Codec_Capabilities

契約により、Windows は、他の種類の HCI コマンドに対して、これらの Microsoft 固有のコーデック ID を使用しないものとします。

HCI_Read_Local_Supported_Codecs [v2]

コントローラーは、Vendor_Specific_Codec_IDおよびVendor_Specific_Codec_Transportを介して、Microsoft 固有のコーデック ID のサポートをアドバタイズする必要があります。

フィールド Description
Vendor_Specific_Codec_ID[k] オクテット 0 から 1: 会社 ID (0x0006)
詳細については、表 7 の オクテット 1 から 2 を 参照してください。

オクテット 2 から 3: ベンダー定義のコーデック ID (LC3 の0x0006など)
詳細については、表 7 の オクテット 3 から 4 を 参照してください。
Vendor_Specific_Codec_Transport[k] LE_CIS (0x02) がサポートされている必要があります。

表 8 HCI_Read_Local_Supported_Codec [v2] 応答値

HCI_Read_Local_Supported_Codec_Capabilities

レンダリング/キャプチャ形式のペアの一覧を含め、Windows 固有のすべてのコーデック機能のクエリを実行するには、次の引数を指定してHCI_Read_Local_Supported_Codec_Capabilitiesします。

パラメーター サイズ (オクテット) Description
Codec_ID (Microsoft 固有のコーデック ID) 5 オクテット 0: 0xFF (ベンダー固有)

オクテット 1 から 2: 会社 ID (0x0006)
詳細については、表 8 の オクテット 1 から 2 を 参照してください。

オクテット 3 から 4: ベンダー定義のコーデック ID (LC3 の0x0006など)
詳細については、表 8 の オクテット 3 から 4 を 参照してください。
Logical_Transport_Type 1 0x2 (LE CIS)
通信方向 1 0x00 (ホストからコントローラーへの入力など)

表 9 HCI_Read_Local_Supported_Codec_Capabilitiesコマンド引数

このようなコマンドを受信すると、コントローラーはベンダー定義のコーデック ID で指定されたコーデックのすべての Windows 固有の機能を返す必要があります。 たとえば、ベンダー定義のコーデック ID が 0x0006 に設定されている場合、コントローラーは Windows で必要なすべての LC3 関連機能を返す必要があります。

コマンドの応答は、Bluetooth Core Specification で定義されているのと同じ最上位レベルの構造を維持します。

パラメーター サイズ (オクテット) Description
ステータス 1 0x00 (成功);0xFFへの0x01 (エラー コード)
Num_Codec_Capabilities 1 返される機能の合計数。
Codec_Capability_Length[i] 1 Codec_Capability[i] フィールドの長さ。
Codec_Capability [i] 場合により異なる Codec_Capability_Length[i] コーデック固有の機能データのオクテット。

表 10 HCI_Read_Local_Supported_Codec_Capabilities応答の構造

ただし、 Codec_Capability[i] の ペイロードは SIG で定義されているペイロードとは異なり、Windows 用に調整されています。

現在、Windows で定義されている唯一のコーデック機能はBidirectional_Multichannel_Streamingであり、以下で説明します。

Bidirectional_Multichannel_Streaming

Bidirectional_Multichannel_Streamingをアドバタイズすることで、コントローラーは、m ≥ 1、n ≥ 1、および m + n> 2 の n チャネル キャプチャによる同時 m チャネル レンダリングをサポートすることを確認します。 (モノラル キャプチャを使用したステレオ レンダリングは、実質的に m = 2 および n = 1 のBidirectional_Multichannel_Streamingです)。

次の表では、Bidirectional_Multichannel_Streamingの形式について説明します。

パラメーター サイズ (オクテット) ビット Description
タイプ 1 0x00 (Bidirectional_Multichannel_Streaming)
Channel_Counts 1 ビット 0 から 4: (m – 1)、ここで m はレンダー チャネルの数です (モノラル キャプチャを使用したステレオ レンダリングの場合、この値は 2 – 1 = 1 である必要があります)。
Channel_Counts 1 ビット 5 から 7: (n – 1)、ここで n はキャプチャ チャネルの数です (モノラル キャプチャを使用したステレオ レンダリングの場合、値は 1 ~ 1 = 0 である必要があります)。
Render_Sampling_Frequencies 1 ビット 0: 16 kHz
ビット 1: 24 kHz
ビット 2: 32 kHz
ビット 3: 48 kHz
ビット 4: RFU
ビット 5: RFU
ビット 6: RFU
ビット 7: RFU
このリスト内のすべてのサンプリング周波数は、Channel_Countのビット 0 から 4 で指定されたチャンネル数と同じです。

すべての RFU ビットは予約済みであり、0 に設定する必要があります。
Capture_Sampling_Frequencies_-List[i], where 0 ≤ i ≤ 7 i + 1 ビット 0: 16 kHz
ビット 1: 24 kHz
ビット 2: 32 kHz
ビット 3: 48 kHz
ビット 4: RFU
ビット 5: RFU
ビット 6: RFU
ビット 7: RFU
このリスト内のすべてのサンプリング周波数は、Channel_Countのビット 5 から 7 で指定されたチャンネル数と同じです。

各Capture_Sampling_Frequencies_Listインスタンスのサイズは 1 オクテットであり、そのようなインスタンスは最大 8 個まで存在できます (Render_Sampling_Frequencies内のすべてのビットが 1 に設定されている場合)。

すべての RFU ビットは予約済みであり、0 に設定する必要があります。

表 11 Bidirectional_Multichannel_Streaming形式 (最大長: 11 バイト)

Channel_Counts

レンダリング/キャプチャのビット数の選択は任意です。5 ビットがレンダリング用に割り当てられ (SIG で定義されたすべてのオーディオ位置をカバーするため)、キャプチャ用に 3 ビット (HCI ペイロード サイズを最小限に抑えるために) 割り当てられます。

たとえば、表 3 の Channel_Counts は 0b0000'0001 です。レンダリング/キャプチャ チャネルの数 ( mn など) はそれぞれ 2 と 1 であるためです。

  Capture Render
ビット 7 6 5 4 3 2 1 0
価値 0 0 0 0 0 0 0 1

表 12 表 3 のChannel_Counts

設計上、Microsoft 固有のコーデック ID と Channel_Counts の同じペアを持つすべての機能をグループ化し、1 つのBidirectional_Multichannel_Streaming レコードで表す必要があります。

Render_Sampling_Frequencies

Render_Sampling_Frequencies フィールドは、関連付けられたBidirectional_Multichannel_Streaming構造体のコンテキストで使用できるすべてのレンダリング頻度を指定します。

たとえば、表 3 の Render_Sampling_Frequencies は 0b0000'1001 です。つまり、16kHz と 48kHz の両方を 2 チャネル レンダーのサンプリング周波数として使用できます。

kHz RFU RFU RFU RFU 48 32 二十四 16
ビット 7 6 5 4 3 2 1 0
価値 0 0 0 0 1 0 0 1

表 13 表 3 のRender_Sampling_Frequencies

Capture_Sampling_Frequencies_List[i]

Render_Sampling_Frequenciesの "1" ビットごとに、最下位ビットから最上位ビットまで、コントローラーは一意のビット マスク (Capture_Sampling_Frequencies_List[i]) を提供し、そのレンダー ビットで表される周波数と互換性のあるすべてのキャプチャ周波数を指定します。 コントローラーは、 Render_Sampling_Frequenciesの " ゼロ" ビットに対してCapture_Sampling_Frequencies ビット マスク 提供しないものとします。

たとえば、表 3 のキャプチャ ビット マスクは次のようになります。

// 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
}

具体的な内容は次のとおりです。

Render_-Sampling_-Frequencies Capture_-Sampling_周波数[i] Description
0b0000'1001
   ⇤ order ↤
0 0b0000'0001 Render_Sampling_Frequenciesの最初の最下位 "1" ビット (ビット 0) は、16 kHz に対応します。

Capture_Sampling_Frequencies_List[0] のビット 0 を有効にして、16 kHz キャプチャをそのレンダー周波数とペアリングできることを示します。
0b0000'1 001
   ⇤ order ↤
1 0b0000'0110 Render_Sampling_Frequenciesの 2 番目に下位の "1" ビット (ビット 3) は、48 kHz に対応します。

Capture_Sampling_Frequencies_List[1] のビット 1 と 2 を有効にして、24 kHz および 32 kHz のキャプチャをそのレンダリング周波数とペアリングできることを示します。

表 14 Render_Sampling_FrequenciesのCapture_Sampling_Frequencies_List[i] を作成する例

IHV ACX ストリーミング ドライバー

モノラル キャプチャを使用したステレオ レンダリングをサポートするために、IHV ACX ストリーミング ドライバーは、3.11.2 で説明されているレンダー/キャプチャ形式のペアを表す BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities というデバイス プロパティを、デバイス インターフェイス クラスのインスタンス (GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE) に設定します。

このプロパティは、デバイス インターフェイス クラス インスタンスが作成された直後に使用でき、デバイス インターフェイス クラス インスタンスの有効期間中、プロパティの値は一定のままになります。

BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities のプロパティ キーは、次のように定義されます。

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[])

キー (DEVPKEY_BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities) に関連付けられているプロパティ値の型は、次のように定義されます。

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)

BTH_LE_AUDIO_BIDIRECTIONAL_MULTICHANNEL_STREAMING_CAPABILITY構造体は、Bidirectional_Multichannel_Streamingで説明されているのと同様の規則に従います。ただし、次の点が異なります。

  • ACX ストリーミング ドライバーは、目的のコーデックが概念的に ACX ストリーミング ドライバーの一部であるかどうかを示すために、追加のフラグ IsCodecPresent を設定する必要があります。 たとえば、コーデックがオーディオ DSP 内にある場合は、IsCodecPresent を TRUE に設定する必要があります。 コーデックがBluetooth コントローラー内にある場合は、フラグを FALSE に設定する必要があります。

  • n チャネル キャプチャを使用した m チャネル レンダーの場合、RenderChannelCount と CaptureChannelCount の値はそれぞれ m と n です。 つまり、RenderChannelCount と CaptureChannelCount は、レンダリング チャネルとキャプチャ チャネルの実際の数を示します。

  • インデックス i を指定すると、i 番目に重要な RenderSamplingFrequencies ビットと CaptureSamplingFrequenciesList の i 番目のエントリの間に 1 対 1 のマッピングがあります。 RenderSamplingFrequencies の i ビットが 0 の場合は、CaptureSamplingFrequenciesList[i] を 0 に設定します。

次のサンプル コードは、GUID_BLUETOOTH_LEAUDIO_SUPPORT_INTERFACE デバイス インターフェイスを作成し、BluetoothLEAudioBidirectionalMultichannelStreamingCapabilities デバイス インターフェイス プロパティを設定する方法を示しています。

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;
}