オーディオ サイドバンド A2DP オフロード
このトピックでは、Windows 11 ビルド 10.0.22000 以降で 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 が GUID_SIDEBANDAUDIO_A2DP_SUPPORT_INTERFACE
{2BC51EE4-07AF-49CF-B04B-FB3F1C26AADC} に設定されたデバイス インターフェイスを公開する必要があります。 このデバイス インターフェイスは、オーディオ ドライバーの PnP 起動時までに存在する必要があります。
サイドバンドデータ構造
オーディオ ドライバーによって使用される一部のデータ構造と定数は、 sidebandaudio.h ヘッダーで定義されていることに注意してください。
オーディオ サイドバンド A2DP オフロードには、次のデータ構造が使用されます。
デバイス記述子 - SIDEBANDAUDIO_DEVICE_DESCRIPTOR
要素 | 説明 |
---|---|
NumberOfEndpoints | 接続されたデバイス上のエンドポイントの数を示します |
接続されたデバイスは、複数のオーディオ エンドポイント (スピーカー、マイクなど) を含む複合デバイスである場合があります。 オーディオ ドライバーは、各エンドポイントを反復処理し、詳細を取得して、各エンドポイントの KS フィルターを構築できます。
エンドポイント記述子 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR
SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR は次のように定義されます。
要素 | 説明 |
---|---|
CbSize | エンドポイント記述子の合計サイズ。 これには文字列を格納するためのバッファが含まれます。 |
ContainerId | エンドポイントの GUID。 複数のエンドポイントに共通の GUID がある場合、それらのエンドポイントが同じ物理コンテナー内に含まれていることを示します。 OS は、さまざまなシナリオに対してこのようなエンドポイントを簡単に関連付けることができます。 |
カテゴリ | KSPIN_DESCRIPTOR. 各エンドポイントのフォーム ファクターを示すカテゴリ。 |
方向 | Capture またはレンダリングのデータフローの方向を示します。 |
Capabilities | (下表参照) |
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 や SoundWire などのより機能豊富で複雑なバスになることもあります。 この機能の設計では、オーディオ転送に特別な要件は課されません。 ただし、Bluetooth コーデックがオーディオ DSP に実装されている場合、Bluetooth コントローラは、オーディオ トランスポートを介して送信されるデータからエンコードされたフレームを抽出し、これらのフレームを AVDTP メディア パケットにパッケージ化して送信できる必要があります。
オーディオ トランスポートのセットアップと構成 (ある場合) は、ベンダー固有のタスクと見なされます。 これは、この機能のコンポーネント間で渡されるベンダー固有のオーディオ インターフェイス パラメータによって容易になります。 ベンダー固有のパラメータは、オーディオ ドライバー ベンダーと Bluetooth コントローラーおよび/またはトランスポート ドライバー ベンダーによって共通に定義されます。 パラメータは、オーディオ デバイスと Bluetooth コントローラによって、オーディオ DSP と Bluetooth コントローラ間のオーディオ転送を構成するために使用されます。
たとえば、複数の物理接続または論理接続がある場合、このデータにはトランスポート ID、PCM インターフェイスの信号の使用の構成、またはトランスポート全体のオーディオ データの形式が含まれることがあります。
オーディオ ドライバーは、GUID と整数を使用してデータを識別する SIOP を使用して、ベンダー固有のオーディオ インターフェイス パラメーターを設定および取得します。 ただし、より自然な Bluetooth HCI コマンド セットを維持するために、Microsoft 定義の HCI コマンドは、次の構造を使用してベンダー固有のオーディオ インターフェイス パラメーターを渡します。
オーディオインターフェースパラメータ
フィールド | 八重奏 |
---|---|
ベンダー ID | 0..3 |
ベンダー固有のパラメータID | 4..5 |
ベンダー固有の値の長さ = (n-9) | 6 |
ベンダー固有の値 | 7.. n |
ベンダー ID は、Bluetooth Assigned Numbers: https://www.bluetooth.com/specifications/assigned-numbers/company-identifiersで定義されています。
A2DP ドライバーは、オーディオ ドライバーにとってより自然なデータ構造であるベンダー SIOP と、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 を定義できます。
コーデック (コーデック-SIOP)
オーディオ ドライバーは、この SIOP を使用して、サポートされている A2DP コーデック (存在する場合) のリストを表現します。 この SIOP の SIDEBANDAUDIO_IO_PARAM_HEADER フィールドは次のように設定されます。
フィールド | 値 |
---|---|
ParamsSet | 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 フィールドは次のように設定されます。
フィールド | 値 |
---|---|
ParamsSet | 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 Adaptive コーデックがアクティブな場合にのみ使用されます。 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 Adaptive コーデックがアクティブな場合にのみ使用されます。 aptX の詳細については、 Qualcomm aptX Adaptive Audioを参照してください。
このトピックの残りの部分では、このパラメータは mtu-size-SIOP と呼ばれます。
ベンダー定義のSIOPの使用
オーディオ ドライバーはベンダー定義の SIOP を設定する場合があります。
サイドバンド インターフェイスを開いた後、IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR の前に設定されるベンダー SIOP
A2DP ドライバーは、SIOP 値をシステム構成ベンダー SIOP のコレクションに保存します。 A2DP ドライバーは、 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2 を処理しながら、このコレクションを Bluetooth コントローラーに送信します (HCI_VS_MSFT_Avdtp_Capabilities_Configuration を使用)。 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 ドライバーは、 IOCTL_SBAUD_STREAM_OPENを処理しながら、このコレクションを Bluetooth コントローラーに送信します (HCI_VS_MSFT_Avdtp_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_STOP を超える最初の遷移 (通常は KSSTATE_ACQUIRE へ) で、 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_Functions
オーディオ サイドバンド A2DP オフロードは、AVDTP オフロード コマンドのサポートを示すために、 Supported_features 戻りパラメータに別のビットを定義することにより、 HCI_VS_MSFT_Read_Supported_Features コマンドを強化します。 このビットがセットされて返されると、このセクションの残りのコマンドがサポートされます。
コマンドと戻りパラメータの説明については、 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 ホスト コントローラ インターフェイス (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 コントローラー機能の交差または結合が必要な場合、オーディオ ドライバーは、コーデック SIOP (標準表現で十分な場合) またはベンダー SIOP のいずれかを通じてその機能を示すことができます。 A2DP ドライバーは SIOP を Bluetooth コントローラーに渡し、Bluetooth コントローラーは機能を交差させて、HCI_VS_MSFT_Avdtp_Capabilities_Configuration からサポートされているコーデックの結果セットを返します。
関連項目
Microsoftが定義したBluetooth HCI拡張機能
オーディオ ドライバーの Bluetooth バイパス ガイドライン