このトピックでは、Windows 11 以降のビルド 10.0.22000 for Bluetoothで使用できるオーディオ サイドバンド A2DP オフロードについて説明します。
オーディオサイドバンドA2DPオフロードの主な目標は、例えば音楽再生中に電力消費量を削減することです。
このドキュメントでは、既存の HF サイドバンド ソリューションに関する知識を前提としています。 Bluetoothオーディオ ドライバーのバイパス ガイドラインと、このトピックの「A2DP Bluetooth仕様」も参照してください。
サイドバンド アーキテクチャの設計
オーディオサイドバンドA2DPオフロードは、内蔵(内蔵)スピーカーまたは接続されたアナログヘッドフォンを介してリニアオーディオコンテンツの再生中に消費電力を削減するための既存の実証済み設計に基づいています。 簡単に言うと、これらの設計では、ベンダー固有のオーディオ ドライバーを介して、大量のオーディオ データ (1 秒の順序で) をオーディオ DSP にバーストします。 メイン プロセッサとその他のほとんどの回路は低電力状態になり、オーディオ DSP は内蔵スピーカーを介してバーストされたオーディオ データをストリーミングします。 オーディオ データがほぼ使い果たされると、DSP はオーディオ ドライバーに割り込みを発生させ、オーディオ ドライバーを介して DSP により多くのオーディオ データをバーストするように OS に通知します。
次の図の薄い灰色のコンポーネントは、IHV によって提供されています。
オーディオ サイドバンド A2DP オフロードは、同じオーディオ DSP が Bluetooth コントローラーに直接接続されている、Bluetooth SCO オーディオ パスの共通設計にも基づいています。
多くの場合、この接続は I2S または PCM インターフェイスですが、 SLIMbus などのより複雑で複雑なバスになる場合もあります。 Microsoft では、このアーキテクチャを サイドバンド オーディオと見なします。これは、オーディオが通常のコントローラー インターフェイス ("HCI" ) ではなく代替パスを介してBluetooth (または他の) コントローラーに転送されるという事実を反映しています。 この場合、オーディオ ドライバーは OS からオーディオ DSP にオーディオ データを転送し、オーディオ DSP はハードウェア バス コントローラーへのサイドバンド接続を介してデータを転送し、コントローラーは接続されたデバイスにオーディオ データを送信します。 (双方向オーディオの場合、逆方向も発生します)。より多くのコンポーネントが関与する一方で、これは通常のコントローラインタフェースよりも利点がある可能性があります。 一部のユース ケース (主に携帯電話の呼び出し) では、エンド ツー エンドのオーディオ信号パス全体がファームウェアによって処理され、メイン プロセッサからオフロードされます。 また、ホスト ソフトウェアとの間でのリアルタイム/等時性オーディオ データ転送のためのより優れたインターフェイスを提供することもできます。 このサイドバンド接続の場合、Microsoft は、この物理的な設計を持つオーディオ エンドポイントをサポートするためにオーディオ ドライバーによって使用されるサイドバンド DDI を定義します。
コンポーネント
IHV オーディオ ドライバー (オーディオ DSP ドライバー)
このドライバーは、統合オーディオ エンドポイント、携帯ネットワーク オーディオ、および HFP/SCO サイドバンド/オフロードを制御します。 この機能では、ドライバーも A2DP オフロードをサポートする必要があります。 ドライバーの責任は、HFP/SCO の責任と似ています。
IHV Bluetooth トランスポート ドライバーとコントローラー
A2DP オフロードは、BLUETOOTH SIG 標準では定義されていません。 この機能により、Microsoft が定義した Bluetooth HCI コマンドが強化され、追加されます。 この機能をサポートするために、IHV のBluetooth コント ローラーまたは IHV ドライバーは、これらのコマンドをサポートする必要があります。
A2DP プロファイル ドライバー
このドライバーは Windows によって提供されます。 その関数には、次のものが含まれます。
- A2DP および AVDTP 仕様を実装します
- IHV オーディオ ドライバーが要求を検出、開き、送信するための PnP デバイス インターフェイス インスタンス (A2DP サイドバンド インターフェイス) を公開します
- このドキュメントで定義されているサイドバンド IOCTL 要求をサポートします
- A2DP オフロード用の Microsoft 定義Bluetooth HCI コマンドを送信します
IHV オーディオ ドライバー (オーディオ DSP ドライバー) の要件
システム上のオーディオ ドライバーが A2DP サイドバンド ストリーミング用に構成されている場合は、クラス GUID が {2BC51EE4-07AF-49CF-B04B-FB3F1C26AADC} に GUID_SIDEBANDAUDIO_A2DP_SUPPORT_INTERFACE 設定されたデバイス インターフェイスを公開します。 このデバイス インターフェイスは、オーディオ ドライバーの PnP スタートアップより後に存在する必要があります。
サイドバンド データ構造
オーディオ ドライバーで使用される一部のデータ構造と定数は 、sidebandaudio.h ヘッダーで定義されていることに注意してください。
オーディオ サイドバンド A2DP オフロードには、次のデータ構造が使用されます。
デバイス記述子 - SIDEBANDAUDIO_DEVICE_DESCRIPTOR
| 要素 | 説明 |
|---|---|
| NumberOfEndpoints | 接続されているデバイス上のエンドポイントの数を示します |
接続されたデバイスは、複数のオーディオ エンドポイント (スピーカー、マイクなど) を含む複合デバイスにすることができます。 オーディオ ドライバーは、各エンドポイントを反復処理し、各エンドポイントの KS フィルターを構築するための詳細を取得できます。
エンドポイント記述子 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR
SIDEBANDAUDIO_ENDPOINT_DESCRIPTORは次のように定義されます。
| 要素 | 説明 |
|---|---|
| CbSize | エンドポイント記述子の合計サイズ。 これには、文字列を格納するためのバッファーが含まれます。 |
| ContainerId | エンドポイントの GUID。 複数のエンドポイントの共通 GUID は、これらのエンドポイントが同じ物理コンテナー内に含まれていることを示します。 OS は、さまざまなシナリオでこのようなエンドポイントを簡単に関連付けることができます。 |
| カテゴリ | KSPIN_DESCRIPTOR。 各エンドポイントのフォーム ファクターを示すカテゴリ。 |
| 方向 | キャプチャまたはレンダリング データ フローの方向を示します。 |
| 機能 | (下の表を参照) |
| FriendlyName | エンドポイント KS フィルター インターフェイスのDEVPKEY_DeviceInterface_FriendlyNameに適用するエンドポイントのフレンドリ名。 |
| VolumePropertyValuesSize | 各チャネルのボリュームステップと範囲を記述するKSPROPERTY_DESCRIPTION構造のサイズ。 |
| SidetoneVolumePropertyValueSize | サイドトーンの各チャンネルのボリュームステップと範囲を記述するKSPROPERTY_DESCRIPTION構造のサイズ。 |
エンドポイント記述子 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR - 機能
機能は次のように定義されます。
| 要素 | 説明 |
|---|---|
| 数量 | エンドポイントはボリューム制御をサポートします |
| Mute | エンドポイントはミュート コントロールをサポートしています |
| サイドトーン | エンドポイントはサイドトーン 制御をサポートします |
| フィードバック | エンドポイントに関連するフィードバック チャネルがある |
SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR2
A2DP サイドバンドは、既存のSIDEBANDAUDIO_ENDPOINT_DESCRIPTOR構造の更新バージョンを使用して、エンドポイント識別のために Windows オーディオ システムに必要な詳細情報 ( SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR2) を提供します。
// Number of device properties that shall be added to the audio filter factory interface.
ULONG FilterInterfacePropertyCount;
DEVPROPERTY* FilterInterfaceProperties;
オーディオ ドライバーは、新しいIOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2要求を使用してこのデータ構造 を 取得します。 要求が完了すると、オーディオ ドライバーは、トポロジ オーディオ フィルター インターフェイスにこれらのデバイスのプロパティを追加します。
オーディオ インターフェイスのパラメーター
オーディオ デバイスとBluetooth コントローラー間のオーディオ トランスポートの選択と設計は、ベンダー固有です。 このオーディオトランスポートは、多くの場合、 I2S またはPCMインターフェイスですが、 SLIMbus や 潜在的にサウンドワイヤーなどのより豊富で複雑なバスになる場合もあります。 この機能設計では、オーディオ トランスポートに特定の要件はありません。 ただし、Bluetooth コーデックがオーディオ DSP に実装されている場合、Bluetooth コントローラーは、オーディオ トランスポート全体で送信されるデータからエンコードされたフレームを抽出して、これらのフレームを AVDTP メディア パケットにパッケージ化して伝送できる必要があります。
オーディオ トランスポートのセットアップと構成 (ある場合) は、ベンダー固有のタスクと見なされます。 これは、この機能のコンポーネント間で渡されるベンダー固有のオーディオ インターフェイス パラメーターによって容易になります。 ベンダー固有のパラメーターは、オーディオ ドライバー ベンダーとBluetooth コントローラーやトランスポート ドライバー ベンダーによって一般的に定義されます。 パラメーターは、オーディオ DSP と Bluetooth コントローラー間のオーディオ トランスポートを構成するために、オーディオ デバイスとBluetooth コントローラーによって使用されます。
たとえば、このデータには、物理的または論理的な複数の接続がある場合、PCMインターフェースの信号使用を設定する場合、またはトランスポート全体でのオーディオデータの形式に関する情報が含まれる可能性があります。
オーディオ ドライバーは、GUID と整数を使用してデータを識別する SIOP を使用して、ベンダー固有のオーディオ インターフェイス パラメーターを設定および取得します。 ただし、より自然なBluetooth HCI コマンド セットを維持するために、Microsoft が定義した HCI コマンドは、次の構造を使用してベンダー固有のオーディオ インターフェイス パラメーターを渡します。
オーディオ インターフェイス パラメーター
| フィールド | オクテット |
|---|---|
| ベンダー識別子 | 0..3 |
| ベンダー固有のパラメーター ID | 4..5 |
| ベンダー固有値の長さ = (n-9) | 6 |
| ベンダー固有の値 | 7.. n |
ベンダー ID は、Bluetooth割り当て番号: https://www.bluetooth.com/specifications/assigned-numbers/company-identifiersで定義されています。
A2DP ドライバーは、オーディオ ドライバーのより自然なデータ構造である vendor-SIOPs と、Bluetooth HCI にとってより自然なオーディオ インターフェイス パラメーターの間で直接変換を実行します。 ベンダー SIOP GUID は、基本 GUID と 4 文字のBluetoothベンダー ID から構築されます。 ベンダー ID (GUID 全体ではなく) のみが、Bluetooth HCI を通過します。
基本 GUID は SIDEBANDAUDIO_PARAMS_SET_A2DP。
Microsoft が定義した A2DP SIOP
Microsoft では、コーデック情報を提供する A2DP 用に 2 つの SIOP を定義しています。 ベンダーは、実装をサポートするために追加の SIOP を定義できます。
コーデック (codecs-SIOP)
オーディオ ドライバーは、この SIOP を使用して、サポートされている A2DP コーデック (ある場合) の一覧を表します。 この SIOP のSIDEBANDAUDIO_IO_PARAM_HEADERフィールドは次のように設定されます。
| フィールド | 価値 |
|---|---|
| パラメータセット | SIDEBANDAUDIO_PARAMS_SET_A2DP ({8FE0297F-3AE6-4384-ACE3-87589E571B9C}) |
| TypeId | SIDEBANDAUDIO_PARAM_A2DP_CODECS (1) |
| サイズ | このヘッダーに続くコーデック機能リストの合計サイズ |
このヘッダーの後に続くデータは、上記のコーデック機能情報で説明したように、一連の (可変サイズの) コーデック機能構造です。
このトピックの残りの部分では、このパラメーターを codecs-SIOP と呼びます。
構成済みコーデック (configured-codec-SIOP)
オーディオ ドライバーは、この SIOP を使用して、現在構成されている A2DP コーデックを取得できます。 この SIOP の SIDEBANDAUDIO_IO_PARAM_HEADER フィールドは次のように設定されます。
| フィールド | 価値 |
|---|---|
| ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP ({8FE0297F-3AE6-4384-ACE3-87589E571B9C}) |
| TypeId | SIDEANDAUDIO_PARAM_A2DP_CONFIGURED_CODEC (2) |
| サイズ | このヘッダーに続くコーデック機能の合計サイズ |
このヘッダーに続くデータは、上記のコーデック機能情報で説明したように、単一の (可変サイズの) コーデック機能構造です。
この SIOP は更新可能です。つまり、オーディオ ドライバーは IOCTL_SBAUD_GET_SIOP_UPDATE 要求を使用して、構成されたコーデックの変更を常に把握する必要があります。
このトピックの残りの部分では、このパラメーターを configured-codec-SIOP と呼びます。
コーデックアクティブ待機時間モード (codec-latency-mode-SIOP)
オーディオ ドライバーは、この SIOP を使用して、現在構成されている A2DP コーデックのアクティブな待機時間モードを取得できます。 この SIOP の SIDEBANDAUDIO_IO_PARAM_HEADER フィールドは次のように設定されます。
| フィールド | 価値 |
|---|---|
| パラメータセット | SIDEBANDAUDIO_PARAMS_SET_A2DP |
| TypeId | SIDEBANDAUDIO_PARAM_A2DP_CODEC_LATENCY_MODE |
| サイズ | 1 バイト |
このヘッダーの後のデータは、符号なし 8 ビット整数として解釈される 1 バイトです。
SIDEBANDAUDIO_CODEC_MODE_HIGH_QUALITY値は、現在構成されているコーデックが高品質モードで動作していることを示し、SIDEBANDAUDIO_CODEC_MODE_LOW_LATENCY値はコーデックが低遅延モードで動作していることを示します。
この SIOP は更新可能です。つまり、オーディオ ドライバーは IOCTL_SBAUD_GET_SIOP_UPDATE 要求を使用して、待機時間モードの変更を常に把握する必要があります。
現時点では、この SIOP は aptX アダプティブ コーデックがアクティブな場合にのみ使用されます。 aptX の詳細については、「 Qualcomm aptX Adaptive Audio」を参照してください。
このトピックの残りの部分では、このパラメーターを codec-latency-mode-SIOP と呼びます。
コーデック L2CAP MTU サイズ (mtu-size-SIOP)
オーディオ ドライバーは、この SIOP を使用して、現在の L2CAP MTU サイズ (バイト単位) を取得できます。 この SIOP の SIDEBANDAUDIO_IO_PARAM_HEADER フィールドは次のように設定されます。
| フィールド | 価値 |
|---|---|
| ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP |
| TypeId | SIDEBANDAUDIO_PARAM_A2DP_CODEC_MTU_SIZE |
| サイズ | 2 バイト |
このヘッダーの後のデータは、符号なし 16 ビット整数として解釈される 2 バイトです。 この SIOP は更新可能です。つまり、オーディオ ドライバーは IOCTL_SBAUD_GET_SIOP_UPDATE 要求を使用して、MTU サイズの変更を常に把握する必要があります。
現時点では、この SIOP は aptX アダプティブ コーデックがアクティブな場合にのみ使用されます。 aptX の詳細については、「 Qualcomm aptX Adaptive Audio」を参照してください。
このトピックの残りの部分では、このパラメーターを mtu-size-SIOP と呼びます。
ベンダー定義 SIOP の使用
オーディオ ドライバーは、ベンダー定義の SIOP を設定できます。
サイドバンド インターフェイスを開いてから、IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTORコマンドを実行する前に設定されたVendor-SIOP。
A2DP ドライバーは、システム構成ベンダー SIOP のコレクションに SIOP 値を保存します。 A2DP ドライバーは、このコレクションを (HCI_VS_MSFT_Avdtp_Capabilities_Configuration を使用して) Bluetooth コントローラーに送信し、 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2を処理します。 Bluetooth コントローラーによって返されるすべてのオーディオ インターフェイス パラメーターも、 システム構成ベンダー SIOP のコレクションに格納されます。 オーディオ ドライバーは、IOCTL の完了後にいつでもこれらの値を取得できます。
IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2を取得した後、ベンダーのSIOPが設定される
A2DP ドライバーは、IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2後にオーディオ ドライバーによって送信されたすべての SIOP に失敗します。
IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR後およびIOCTL_SBAUD_STREAM_OPEN前に設定されたベンダー SIOP
A2DP ドライバーは、 ストリーム構成ベンダー SIOP のコレクションに SIOP 値を保存します。 A2DP ドライバーは、このコレクションを (HCI_VS_MSFT_Avdtp_Openを使用して) Bluetooth コントローラーに送信し、 IOCTL_SBAUD_STREAM_OPENを処理します。 Bluetooth コントローラーによって返されるすべてのオーディオ インターフェイス パラメーターは、ストリーム構成ベンダー SIOP のコレクションにも格納されます。 オーディオ ドライバーは、IOCTL の完了後にいつでもこれらの値を取得できます。
A2DP ドライバーは、 IOCTL_SBAUD_STREAM_CLOSEを処理するときにストリーム構成ベンダー SIOP のコレクションをクリアします。 (システム構成ベンダー SIOP のコレクションはクリアされません)。
A2DP サイドバンド インターフェイス
A2DP サイドバンドは、汎用のIOCTL_SBAUD_* 要求を使用します。 IOCTL の完全な一覧については、 sidebandaudio.h ヘッダーを参照してください。 このセクションでは、A2DP に固有の情報を提供します。
PnP インターフェイス クラス
インターフェースクラスは、A2DPサイドバンドBluetoothオーディオ用のGUID_DEVINTERFACE_A2DP_SIDEBAND_AUDIOです。
KS ピンの状態遷移に使用される IOCTL
オーディオ ドライバーは、特定の KS ピン状態遷移でこれらの要求を送信します。
- (通常はKSSTATE_ACQUIREに) KSSTATE_STOP上の最初の遷移では、IOCTL_SBAUD_STREAM_OPENを送信します。
- KSSTATE_RUNに移行する場合は、IOCTL_SBAUD_STREAM_STARTを送信します。
- KSSTATE_RUNの下の遷移時に、IOCTL_SBAUD_STREAM_SUSPENDを送信します。
- KS ピンの閉鎖時に、IOCTL_SBAUD_STREAM_CLOSE送信します。
A2DP オフロード用の Microsoft 定義Bluetooth HCI 拡張機能
現在 定義されている拡張機能については、Microsoft が定義した Bluetooth HCI 拡張機能を参照してください。
HCI_VS_MSFT_Read_Supported_Features
オーディオサイドバンド A2DP オフロードは、HCI_VS_MSFT_Read_Supported_Features コマンドを強化し、Supported_features の戻りパラメーターに別のビットを定義して AVDTP オフロードコマンドのサポートを示します。 このビットが設定されると、このセクションの残りのコマンドがサポートされます。
コマンドおよび戻り値パラメーターの説明については、 HCI_VS_MSFT_Read_Supported_Featuresを参照してください。
Supported_features (8 オクテット) の値については、HCI_VS_MSFT_Read_Supported_Featuresも参照してください。 追加の値は、コントローラーが AVDTP オフロードと、 Microsoft が定義した AVDTP Bluetooth HCI イベントで説明されている HCI_VS_MSFT_Avdtp_* コマンドをサポートしていることを示すために使用されます。
オーディオ関連の Microsoft が定義した Bluetooth HCI 拡張機能
Bluetooth Host-Controller インターフェイス (HCI) は、ホストとBluetooth無線コントローラー間のすべての相互作用を指定します。 Bluetooth仕様では、ベンダーが定義した HCI コマンドとイベントを使用して、ホストとコントローラー間の標準化されていない対話を可能にします。 Microsoft では、Windows で使用されるベンダー固有の HCI コマンドとイベントを定義しています。 次の Microsoft では、オーディオ サイドバンド オフロードに使用される HCI コマンドを定義しています。
次の AVDTP HCI コマンドについては、Bluetoothトピック「 Microsoft が定義した AVDTP Bluetooth HCI イベント」で説明されています。
HCI_VS_MSFT_Avdtp_Capabilities_Configuration
サブコマンドオペコード値: 7
オーディオ トランスポート インターフェイスを構成し、コーデック情報ブロックの一覧であるBluetooth コントローラーのコーデック機能を返します。 各コーデック情報ブロックは、サポートされている 1 つのコーデックを記述します。 詳細については、 HCI_VS_MSFT_Avdtp_Capabilities_Configurationを参照してください。
HCI_VS_MSFT_Avdtp_Open
サブコマンドオペコード値: 8
コントローラー内の AVDTP オフロード リソースを割り当てて構成します。 詳細については、「HCI_VS_MSFT_Avdtp__Open」 を参照してください。
HCI_VS_MSFT_Avdtp_Start
サブコマンドオペコード値: 9
このコマンドは、オーディオ トランスポートから送信された AVDTP メディア パケットへのオーディオ ストリーミングを開始します。 詳細については、「 HCI_VS_MSFT_Avdtp_Start」を参照してください。
HCI_VS_MSFT_Avdtp_Suspend
サブコマンドオペコード値: 0xA
HCI_VS_MSFT_Avdtp_Startによって開始されたストリーミング アクティビティを停止します。 詳細については、 HCI_VS_MSFT_Avdtp_Suspendを参照してください。
HCI_VS_MSFT_Avdtp_Close
サブコマンドオペコード値: 0xB
HCI_VS_MSFT_Avdtp_Openによって割り当てられた AVDTP オフロード リソースを解放します。 詳細については、「 HCI_VS_MSFT_Avdtp_Close」を参照してください。
オーディオDSPまたはBluetoothコントローラーにおけるBluetooth向けコーデック
この実装は、オーディオ DSP または Bluetooth コントローラーでホストされているBluetoothコーデックに対応します。 codecs-SIOP は、オーディオ ドライバーがサポートされているコーデックの一覧を示すメカニズムを提供します。 同様に、 HCI_VS_MS_Avdtp_Capabilities_Configuration コマンドを使用すると、Bluetooth コントローラーはサポートされているコーデックの一覧を返すことができます。 A2DP ドライバーと Bluetooth コントローラーの少なくとも 1 つは、サポートされているコーデックの一覧を返す必要があります。
A2DP ドライバーは、オーディオ ドライバーとBluetooth コントローラーの両方でサポートされている A2DP コーデックのリストを確実に交差またはマージできません。 両方が A2DP でサポートされているコーデックを返す場合、Windows では、Bluetooth トランスポート ドライバーによって返されたリストのみが使用されます。
IHV ソリューションでオーディオ DSP と Bluetooth コントローラー機能のコーデック関連機能の交差またはマージが必要な場合、オーディオ ドライバーは codecs-SIOP (標準表現で十分な場合) またはベンダー SIOP を介してその機能を示すことができます。 A2DP ドライバーは、BLUETOOTH コントローラーに SIOP を渡します。これにより、機能が交差し、サポートされているコーデックの結果のセット がHCI_VS_MSFT_Avdtp_Capabilities_Configurationから返されます。
こちらも参照ください
Microsoft が定義した Bluetooth HCI 拡張機能
オーディオ ドライバーのBluetooth バイパス ガイドライン