次の方法で共有


ACX マルチ回線構成

このトピックでは、ACX マルチ回線構成について説明します。 ACX の一般的な概要と ACX 用語の一覧については、 ACX オーディオ クラス拡張機能の概要を参照してください。

ACX オブジェクトの概要で説明されているように、AcxCircuit は、ユーザーが認識するオーディオ デバイス (スピーカー、マイクなど) への部分的または完全なオーディオ パスを表します。 AcxCircuit には、少なくとも 1 つの入力ピンと 1 つの出力ピン (ACXPIN) があり、1 つ以上の AcxElements のようなオブジェクトを集約できます。 一般的な情報については、 ACX 回線を参照してください。

ACX 回路構成

ACX は、完全なオーディオ パスを形成するまで回線を結合します。 ACX では、オーディオ バインディングを使用してオーディオ回線を接続します。 同時に、各 ACX 回線は KS フィルターに変換され、これらの KS フィルターは、ユーザー モード サービスとして実行されるオーディオ エンドポイント ビルダー (AEB) によって検出されます。 AEB は、検出された KS フィルター グラフをスキャンし、完全なオーディオ パスを検出したときに、下線付きのオーディオ インフラストラクチャを表すソフトウェア オーディオ エンドポイントを作成します。

次の図は、複合オーディオ エンドポイントを構成する回線を検出、ビルド、および監視するために ACX によって使用される ACX オブジェクトを示しています。

ACXCIRCUITTEMPLATE、ACXCOMPOSITEMANAGER、ACXMANAGER、ACXCIRCUITFACTORY、および ACXCIRCUIT を使用した ACX ターゲット アーキテクチャを示す図。

Von Bedeutung

青色で示されている型のみがパブリックであることに注意してください。ACXCIRCUITTEMPLATE、ACXCOMPOSITETEMPLATE (図示せず)、ACXMANAGER、ACXCIRCUITFACTORY、および ACXCIRCUIT。 バイオレットで表示されるすべての型は内部であり、ここでは説明のみを目的として一覧表示されます。 内部型は、同じままであること、または ACX の異なるリリースで使用できる保証されておらず、直接呼び出したり使用したりしてはなりません。

ACX マネージャーは、ACX ドライバーがそれらを ACX マネージャーに登録するときに、ドライバー初期化時に回線テンプレートを解析します。 ACX ドライバーは、ACXCIRCUTTEMPLATES (#1) を使用して複合テンプレート/バインドを登録します。

ACX マネージャーは、回線テンプレートを受け取ると、これがインスタンス テンプレートかジェネリック クラス テンプレートか確認します。

インスタンス テンプレートの場合、ACX はジェネリック クラス テンプレート用に ACXCOMPOSITEMANAGER (#4) を作成し、ACX は ACXCOMPOSITEFACTORY (#2) を作成します。これは、複合の "コア" 回線を検出したときに ACXCOMPOSITEMANAGER 項目 (#3) を作成します。 コア回線は、複合オーディオ エンドポイントに ID を付与する回線です。

ACXCOMPOSITEMANAGER は、下線複合オーディオ エンドポイントを表す ACXCOMPOSITE (#5) を順番に作成します。 複合マネージャーは、複合が作成または初期化された後に発生する可能性がある任意の回線セグメントを監視する役割を担います。

ACXCOMPOSITE は、複合の一部である回線ごとに ACXCIRCUITMANAGER (#6) を作成します。 ACXCIRCUITMANAGER は、1 つの回線 (#7) を作成、監視、および制御する役割を担います。

回線に "オンデマンド" というタグを付ける場合があります。このような場合、ACXCIRCUITMANAGER はその回路ファクトリを検索し、複合用の新しい回線を要求します (#8)。 ACXCIRCUITFACTORY は、要求として ACXCIRCUIT を作成します (#9)。

すべての ACXCIRCUIT が検出され、アクティブになると、ACXCOMPOSITE もアクティブになり、回線の "オーディオ" インターフェイスをオンにするように ACXCIRCUITMANAGERS に指示します。

次のシーケンス図は、2 つの ACX 回線 (回線 A と B) を連結して完全なオーディオ パスを作成する方法を示しています。これは、ソフトウェア オーディオ デバイスを使用するオーディオ エンドポイント ビルダー (AEB) によって表されます。

ドライバー A、ドライバー B、ACX インターフェイス B、回線マネージャー A と B、ACX コンポジット、および ACX マネージャーというラベルが付いた列を含む図。列間のフロー矢印を含む呼び出しシーケンスを示します。

マルチ回線形式ネゴシエーション

このセクションでは、オーディオ エンドポイントが 2 つ以上の回線によって構成されている場合に発生するフォーマット ネゴシエーションについて説明します。 ACX 回線に関する一般的な情報については、 ACX マルチ スタック クロス ドライバー通信を参照してください。

ダウンレベル ブリッジ ピン

ダウンレベル ブリッジ ピンは、物理オーディオ デバイスから直接または間接的にデータを送信 (レンダリング) または受信 (キャプチャ) するピンです。 このタイプのピンには、ACXMODEFORMATLIST が関連付けられていることもあれば、関連付けられていないこともあります。 これらのブリッジ ピンには、'AcxPinQualifierBridgeB' または 'AcxPinQualifierBridgeDevice' 型があります。 ACXMODEFORMATLIST の詳細については、 acxdataformat.h ヘッダーを参照してください。

ストリーミング ピン、2 つの回線、デバイス間のレンダリングとキャプチャのデータ フローを示す図。

この図と記事では、アップレベルとダウンレベルを使用してフローの方向を記述します。上または下のストリーム フローの方向は、ピンがデータを送信 (レンダリング) しているか、データを受信しているか (キャプチャ) に依存するためです。

ACXMODEFORMATLIST を使用しないダウンレベル ブリッジ ピン

ドライバーは、ダウンレベルピンでモード形式のリストを公開しないことを選択できます。 モード形式リストがダウンレベル ブリッジ ピンで使用できない場合、ユーザー (サウンド コントロール パネル経由) またはその他のソフトウェア エンティティは、このピンと関連ストリームのオーディオ形式を直接制御または指定できません。 これらの一覧が必要ないシナリオを次に示します。

  • DSP 回路、CODEC 回線、またはオーディオ デバイスに直接接続できるストリーミング専用回線。 これらの回路は、データを変更せずにポイント A からポイント B に移動するだけです。 これらの回線では、受信/送信ストリームのデータ サンプル レートは変更されません。 この場合、モード形式のリストはアップレベル ピンに関連付けられます。

  • 受信/送信サンプル レートを変更する要素のない単一ストリーム回線。 その例として、USB オーディオ デバイス回線があります。 このシナリオでは、モード形式のリストがアップレベル ピンに関連付けられます。

データ形式リストが存在しないということは、このピンから送信されるストリームのデータ形式が、接続された回線のアップレベル ピンのいずれかのデータ形式と互換性があることを意味します。

ACXMODEFORMATLIST を使用したダウンレベル ブリッジ ピン

ドライバーは、ダウンレベル ピンでモード形式のリストを公開することを選択できます。 モード形式のリストがダウンレベル ブリッジ ピンで使用できる場合、ユーザー (サウンド コントロール パネル経由) またはその他のソフトウェア エンティティは、このピンと関連するストリームのオーディオ形式を直接制御または指定できます。

これらのモード形式リストが使用される有効なシナリオを次に示します。

  • DSP回路 - 通常、このタイプの回路は異なるサンプルレートで実行される複数のストリームをサポートし、これらのストリームは内部的に共通のサンプルレートに変換され、データが次の回路に移動する前に混合されます。 データ形式リストは、最終的な (この回路の) サンプル レートを制御/指定します。

データフォーマットリストが存在する場合、これらのデータフォーマットは、次の回路のピンのアップレベルピン内のデータフォーマットサンプルと一致する必要があります。 モードは一致する必要はありません。以下のセクションで、モードの説明を参照してください。

ダウンレベル形式リストは、結果のストリームの形式をユーザー/上位層が制御する機会を与えます。この場合、リストの既定値は、このピンの形式を変更するために明示的なアクションが実行されるまで使用されるサンプル レートです。

書式リストの詳細については、 acxdataformat.h ヘッダーを参照してください。

アップレベル ブリッジ ピン

アップレベル ブリッジ ピンは、ソフトウェア モジュールから直接または間接的にデータを受信 (レンダリング) またはデータを送信 (キャプチャ) するピンです。 このタイプのピンには、ACXMODEFORMATLIST が関連付けられている必要があります。 これらのブリッジ ピンには、"AcxPinQualifierBridgeA" 型があります。

ここでも示した前の図を使用して、ストリーミング ピン、2 つの回線、デバイス間のデータ フローのレンダリングとキャプチャを示すこともできます。

ストリーミング ピン、2 つの回線、デバイス間のレンダリングとキャプチャのデータ フローを示す図。矢印は、右側に移動するレンダリング データ フローを示し、右側にキャプチャします。

ACXMODEFORMATLIST を使用せずにアップグレードされた [Bridge] ピン

モード形式リストのないアップレベル ピンは有効な組み合わせではないため、エンドポイントが正しく構成されていません。 エンドポイントは、ユーザーの観点からは表示されません。

ACXMODEFORMQATLIST を使用して[ブリッジ]ピンをアップレベルする

アップレベル ピンには、常に 1 つ以上の ACXMODEFORMATLIST が必要です。 mode-format-lists では、モードに使用できるすべてのサンプル レートとその既定のサンプル レートを指定します。 モードによって、サンプル レートのセットが異なる場合があります。 既定のサンプル レートは、そのモードで推奨されるサンプル レートです。

モードと回路

単一ストリーム回路またはマルチストリーム回路のアップレベル ピンは、1 つ以上のモードフォーマットリストをサポートできます。 単一ストリーム回線では一度に 1 つのモードがアクティブになりますが、マルチストリーム回線では、異なるモードを使用して複数のストリームを同時に実行できます。

モードマッピング

このセクションでは、標準モードについて簡単に説明し、"mode" マッピングが使用される理由について説明します。

RAW モード: ストリーム/回線はストリームに影響を与えません (場合によっては、音量、ミュート、スピーカー保護などの安全上の制約を除く)。

DEFAULT モード: ストリーム/回線は、いくつかの既定の効果を実行します。

<mode_name> mode: ストリーム/回線は、選択した <mode_name> モードに固有の効果を適用します。

生または既定のモードをサポートするには、ストリーミング ピンが必須です。 ストリーミングピンが他の<mode_name> modesをサポートすることはオプションです。

複合エンドポイントでは、アップレベル回線が複数のモードをサポートし、ダウンレベル回線で RAW または DEFAULT のみをサポートできる場合があります。

2 回線エンドポイントの例:

  • アップレベル回路のダウンレベル ピンは、モードと関連する形式 m1{f1,f2} と m2{f3,f4} をサポートしています。つまり、m1 を使用する場合は、ピンのストリームの形式が f1 または f2、または m2 が使用されている場合は f3 または f4 の形式になります。 これは、アップレベル回線が単一のストリーム回線であることを前提としています。

  • ダウンレベル回線のアップレベル ピンは、default-mode{f1,f2,f3} をサポートしています。

この場合、ストリームのモードは、同じサンプル レートを維持しながら、 <mode_name> モードから既定のモードに変換されます。

m1/f1 から default/f1 >

m1/f2 から default/f2 >

m2/f3 から > default/f3

無効なエントリ: m2/f4 から > なし

モード マッピングは、ACX を使用してドライバーによって実行されます。 上の表では、最後のエントリは無効です。アップレベル回線のダウンレベル ピンは、サポートされている形式のオプションとして m2/f4 を削除する必要があります。 これは逆に起こった可能性があることに注意してください。つまり、ダウンレベル回路のアップレベルピンはf4とf5もサポートしている可能性があります。 この場合、default-f4 はサポートされていましたが、default-f5 はサポートされていませんでした。 そのような場合、下位回路の上位ピンが、自らのリストに m?/f5 をオプションとして含めない責任があります。 以降のセクションでは、このプロセスについて説明します。

フォーマット交渉

ACX は、複合デバイスを構成する回線のオーディオ インターフェイスを有効にする前に、回線がオーディオ データのモード/形式をネゴシエートできることを確認します。 ACX は、複合のすべての回線で複合初期化コールバックを呼び出すことによって、この回線通知を実行します。 シーケンスは、ダウンレベル (デバイス側) からアップレベル (システム側) までです。 回線には、このフェーズ中に形式を更新する機会があります。

デバイス形式のコントロール パネルの表示

現在のサウンド コントロール パネルのロジックでは、デバイスの形式の一覧が次のように表示されます。

  • オーディオ デバイスがオーディオ エンジン要素をサポートしている場合、コントロール パネルに表示されるデータ形式の一覧は、デバイスのデータ形式リスト、つまり、ダウンレベル ピン (オーディオ エンジン要素の出力ピンに接続されている) に接続されているデータ形式リストです。
  • オーディオ デバイスがオーディオ エンジン要素をサポートしていない場合、コントロール パネルに表示されるデータ形式の一覧は、ストリーミング ピンのデータ形式リスト、つまり、アップレベル ピンに攻撃されたデータ形式リストです。

複数回線の自動ダウンレベル ストリーム作成

ACX は、ダウンレベル ブリッジ ピンに関連付けられている ACXSTREAMBRIDGE オブジェクトを使用して、作成ストリーム要求をリモート回線に自動的に伝達します。

クライアント アプリがストリームを作成すると、その要求は最初にストリーミング ピンによって受信されます。 ACX は、回線作成時に指定されたコールバックを介して、ストリーミングピンを担当するドライバーにストリーム作成要求を通知します。 コールバックでは、ドライバーはストリームを表す ACXSTREAM オブジェクトを作成し、コントロールを ACX に返します。 ACX は、コントロールを受信すると、この作成要求を次の (ダウンレベル) 回線に転送する必要があるかどうかを確認します。 必要に応じて、ドライバーは作成ストリーム コールバックから戻る前に、作成要求を次の (ダウンレベル) 回線に転送できます。 後者のオプションを使用すると、ダウンレベル回線が作成要求を処理する機会を得た後に、ドライバーがポスト操作を実行できます。

ACX では、ストリームの作成に次の既定のロジックが使用されます。

  • ダウンレベルブリッジピンがない場合は、すべて完了です。
  • ドライバーが既に ACXSTREAMBRIDGE にストリームを手動で関連付けられている場合は、すべて完了します。
  • ダウンレベル ブリッジ ピンに指定した MODE の ACXSTREAMBRIDGE がない場合は、要求を失敗させます。
  • ACX は、取得した ACXSTREAMBRIDGE で作成されたドライバーの新しいストリームを追加します。

ACXSTREAMBRIDGE は、マルチイン/シングルアウトとして機能します。インストリームがある限り、ACXSTREAMBRIDGE はアウトストリームが存在し続けます。 アウトストリームは、最後のインストリームが削除された場合にのみ削除されます。 ACXSTREAMBRIDGE は、リモート回線に使用するモードと形式を決定するときに、ダウンレベル ブリッジ ピンに関連付けられている ACXDATAFORMATLIST を使用します。

ACXSTREAMBRIDGE は、出力ストリームのモードとデータ形式を選択するために次のロジックを使用します。

  • アウトストリームの MODE が指定されていない場合は、"既定" 形式の一覧があるかどうかを確認します。

  • アウトストリームの MODE が指定されておらず、'default' 形式リストが存在しない場合は、'raw' 形式リストがあるかどうかを確認します。

  • MODE がNULL_GUID場合は、最初のインストリームの MODE に関連付けられたフォーマット・リストがあるかどうかを確認します。

  • MODE が指定されている場合は、この MODE のフォーマット・リストがあるかどうかを確認してください。

  • 書式リストが見つかった場合は、書式リストから既定の形式を取得します。

  • 形式が見つからない場合、ACXSTREAMBRIDGE は最初のインストリームの形式を使用します。

  • ACXSTREAMBRIDGE は、次のように、取得した MODE とデータ形式を使用して ACXTARGETSTREAM を使用してストリーム作成要求を構築します。

    • MODE が指定されている場合は、その MODE が使用されます。
    • MODE がNULL_GUIDされた場合は、最初のインストリームの MODE が使用されます。
    • それ以外の場合はモードは使用されません。

ACX は、最後のインストリームが削除されたときにターゲット ストリームを削除または閉じる処理を行います。

ACXSTREAMCIRCUIT のもう 1 つのジョブは、ストリーミング チェーンに沿ってストリーム状態を自動的に伝達することです。

ドライバーは、 AcxCircuitInitDisableDefaultStreamBridgeHandling を呼び出すか、ACXSTREAM オブジェクトを ACXSTREAMBRIDGE に手動で関連付けてから ACX に制御を返すことで、既定の回線のリモート ストリーム ブリッジ作成をオフにすることができます。 後者の場合、ドライバーが 'create-stream' EVT_ACX_CIRCUIT_CREATE_STREAMコールバック関数から戻る前に、リモート ストリームが作成されます。

ホスト/オフロード/ループバック/kws などの複数のキャプチャ/レンダリング ピンを使用する回線の場合、つまり、オーディオ エンジン要素がサポートされている場合、ドライバーは、インモードを指定せずにストリーム ブリッジを作成し、作成ストリーム コールバックを処理するときに受信 ACXSTREAM オブジェクトをストリーム ブリッジに手動で追加する必要があります。

ストリーム ブリッジの作成の詳細については、次を参照してください。

ダウンレベル ストリームへの複数回線の自動ストリーム状態伝達

ACXSTREAMBRIDGE は、ストリーム状態要求をダウンレベルでリモート回線に自動的に伝達します。 ストリームの状態が変わると、ACXSTREAMBRIDGE はアウトストリームの混合状態を計算し、ACXTARGETSTREAM を使用して新しい "stream-state" 要求をリモート ストリームに送信します。

ACXSTREAM と ACXSTREAMBRIDGE は、次のロジックを使用します。

  • 次のシナリオで、まずアップレベル ストリームの状態を変更します。

    • Stop->Run からレンダリングして実行する
    • Run->Stopに移行しながらキャプチャする
    • その他 && Run-Stop から移動中
  • 次のシナリオで、アップレベル ストリームの状態を最後に変更します。

    • Run->Stop からレンダリングする
    • Stop->Run からキャプチャして移動する
    • その他および停止->実行からの移動

ドライバーには、構成設定を使用してこの順序を逆にするオプションがあります。

ドライバー/回線/ストリームは、ストリームの実行から停止への切り替えを常に成功させる必要があります。 一方、ドライバーが停止状態から走行状態に移行することに失敗しても許可されます。

こちらも参照ください

ACX 回路

ACX オーディオ クラス拡張機能の概要

ACX マルチ スタックのクロス ドライバー通信

ACX オブジェクトの概要