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、ACXCOMPOSITETEMPLATE (表示なし)、ACXMANAGER、ACXCIRCUITFACTORY、および ACXCIRCUIT) のみがパブリックであることに注意してください。 紫で表示されるすべての型は内部であり、ここでは説明のみを目的として一覧表示されています。 内部型は、同じままであること、または ACX の異なるリリースで利用できることは保証されておらず、直接呼び出したり使用したりしてはなりません。
ACX マネージャーは、ACX ドライバーがそれらを ACX マネージャーに登録する際に、ドライバー初期化時に回線テンプレートを解析します。 ACX ドライバーは、ACXCIRCUTTEMPLATES (#1) を使用して複合テンプレート/バインドを登録します。
ACX マネージャーは、回線テンプレートを受け取ると、これがインスタンス テンプレートであるか、またはジェネリック クラス テンプレートであるかをチェックします。
インスタンス テンプレートの場合、ACX はジェネリック クラス テンプレートの場合、ACXCOMPOSITEMANAGER (#4) を作成します。ACX は、ACXCOMPOSITEFACTORY (#2) を作成します。この ACXCOMPOSITEFACTORY は、複合の "コア" 回線を検出すると、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) によって表されます。
マルチ回線形式のネゴシエーション
このセクションでは、オーディオ エンドポイントが 2 つ以上の回路で構成されている場合に行われる形式ネゴシエーションについて説明します。 ACX 回路に関する一般的な情報については、「ACX マルチ スタック クロス ドライバー通信」を参照してください。
ダウンレベル ブリッジ ピン
ダウンレベル ブリッジ ピンは、物理オーディオ デバイスから直接または間接的にデータを送信 (レンダリング) または受信 (キャプチャ) するピンです。 このタイプのピンには、ACXMODEFORMATLIST が関連付けられている場合と関連付けられていない場合があります。 これらのブリッジ ピンには、'AcxPinQualifierBridgeB' または 'AcxPinQualifierBridgeDevice' 型があります。 ACXMODEFORMATLIST について詳しくは、「acxdataformat.h ヘッダー」を参照してください。
この図と記事では、アップレベルとダウンレベルを使用してフローの方向を記述します。上または下のストリーム フローの方向は、ピンがデータを送信 (レンダリング) しているか、データを受信しているか (キャプチャ) に依存するためです。
ACXMODEFORMATLIST を使用しないダウンレベル ブリッジ ピン
ドライバーは、ダウンレベル ピンでモード形式のリストを公開しないことを選択できます。 モード形式リストがダウンレベル ブリッジ ピンで使用できない場合、ユーザー (サウンド コントロール パネル経由) またはその他のソフトウェア エンティティは、このピンと関連ストリームのオーディオ形式を直接制御または指定できません。 これらの一覧が必要ないシナリオを次に示します。
DSP 回路、CODEC 回線、またはオーディオ デバイスに直接接続できるストリーミング専用回線。 これらの回路は、データを変更せずにポイント A からポイント B に移動するだけです。 これらの回線では、受信/送信ストリームのデータ サンプル レートは変更されません。 この場合、モード形式のリストはアップレベル ピンに関連付けられます。
受信/送信サンプル レートを変更する要素のない単一ストリーム回線。 その例として、USB オーディオ デバイス回線があります。 このシナリオでは、モード形式のリストはアップレベル ピンに関連付けられます。
データ形式リストが存在しないということは、このピンから送信されるストリームのデータ形式が、接続された回線のアップレベル ピンのいずれかのデータ形式と互換性があることを意味します。
ACXMODEFORMATLIST を使用したダウンレベル ブリッジ ピン
ドライバーは、ダウンレベル ピンでモード形式のリストを公開することを選択できます。 モード形式リストがダウンレベル ブリッジ ピンで使用できる場合、ユーザー (サウンド コントロール パネル経由) またはその他のソフトウェア エンティティは、このピンと関連ストリームのオーディオ形式を直接制御または指定できます。
これらのモード形式リストが使用される有効なシナリオを次に示します。
- DSP 回線 - 通常、このタイプの回線は異なるサンプル レートで実行される複数のストリームをサポートし、これらのストリームは内部的に共通のサンプル レートに変換され、データが次の回線に移動する前に混合されます。 データ形式リストは、最終的な (この回路の) サンプル レートを制御/指定します。
データ形式リストが存在する場合、これらのデータ形式は、次の回線のピンのアップレベル ピン内のデータ形式サンプルと一致する必要があります。 モードは一致する必要はありません。以下のセクションで、モードの説明を参照してください。
ダウンレベル形式リストは、結果のストリームの形式をユーザー/上位レイヤーが制御する機会を与えます。この場合、リストの既定値は、このピンの形式を変更するために明示的なアクションが実行されるまで使用されるサンプル レートです。
形式リストについて詳しくは、「acxdataformat.h ヘッダー」を参照してください。
アップレベル ブリッジ ピン
アップレベル ブリッジ ピンは、ソフトウェア モジュールから直接または間接的にデータを受信 (レンダリング) またはデータを送信 (キャプチャ) するピンです。 このタイプのピンには、ACXMODEFORMATLIST が関連付けられている必要があります。 これらのブリッジ ピンには、"AcxPinQualifierBridgeA" 型があります。
ここでも前の図を使用して、ストリーミング ピン、2 つの回線、デバイス間のレンダリング データとキャプチャ データの流れを示すことができます。
ACXMODEFORMATLIST を使用しないアップレベル [ブリッジ] ピン
モード形式リストのないアップレベル ピンは有効な組み合わせではないため、エンドポイントが正しく構成されていません。 エンドポイントは、ユーザーの観点からは表示されません。
ACXMODEFORMATLIST を使用したアップレベル [ブリッジ] ピン
アップレベル ピンには、常に 1 つ以上の ACXMODEFORMATLIST が必要です。 mode-format-lists では、モードに使用できるすべてのサンプル レートとその既定のサンプル レートを指定します。 モードによって、サンプル レートのセットが異なる場合があります。 既定のサンプル レートは、そのモードで推奨されるサンプル レートです。
モードと回線
単一ストリーム回線またはマルチストリーム回線のアップレベル ピンは、1 つ以上のモード形式リストをサポートできます。 単一ストリーム回線では一度に 1 つのモードがアクティブになりますが、マルチストリーム回線では、異なるモードを使用して複数のストリームを同時に実行できます。
モード マッピング
このセクションでは、標準モードについて簡単に説明し、"モード" マッピングが使用される理由について説明します。
RAW モード: ストリーム/回線はストリームに影響を与えません (場合によっては、音量、ミュート、スピーカー保護などの安全上の制約を除く)。
既定モード: ストリーム/回線は、いくつかの既定の効果を実行します。
<mode_name> mode
: ストリーム/回線は、選択した <mode_name> モード固有の効果を適用します。
ストリーミング ピンは、Raw モードまたは既定のモードをサポートすることが必須です。 ストリーミング ピンが他の <mode_name> modes
モードをサポートすることは省略可能です。
複合エンドポイントでは、アップレベル回線が複数のモードをサポートし、ダウンレベル回線が RAW または既定のみをサポートできる場合があります。
2 回線エンドポイントの例:
アップレベル回路のダウンレベル ピンは、モードと関連する形式 m1{f1,f2} と m2{f3,f4} をサポートしています。つまり、m1 を使用する場合は、ピンのストリームの形式が f1 または f2、または m2 が使用されている場合は f3 または f4 の形式になります。 これは、アップレベル回線が単一のストリーム回線であることを前提としています。
ダウンレベル回線のアップレベル ピンは、default-mode{f1,f2,f3} をサポートしています。
この場合、ストリームのモードは、同じサンプル レートを維持しながら、<mode_name> モードから既定モードに変換されます。
m1/f1 to > default/f1
m1/f2 to > default/f2
m2/f3 to > default/f3
無効なエントリ: m2/f4 to > None
モード マッピングは、ACX を使用してドライバーによって実行されます。 上の表では、最後のエントリは無効です。アップレベル回線のダウンレベル ピンは、サポートされている形式のオプションとして m2/f4 を削除する必要があります。 これは逆に起こった可能性があることに注意してください。つまり、ダウンレベル回路のアップレベル ピンは、f4 と f5 もサポートできた可能性があります。 この場合、default-f4 はサポートされていましたが、default-f5 はサポートされていませんでした。 このような場合は、ダウンレベル回線のアップレベル ピンが、そのリストからオプションとして m?/f5 をリストしないようにします。 以降のセクションでは、このプロセスについて説明します。
形式に関するネゴシエーション
ACX は、複合デバイスを構成する回線のオーディオ インターフェイスを有効にする前に、回線がオーディオ データのモード/形式をネゴシエートできることを確認します。 ACX は、複合のすべての回線で複合初期化コールバックを呼び出すことによって、この回線通知を実行します。 シーケンスは、ダウンレベル (デバイス側) からアップレベル (システム側) までです。 回線には、このフェーズ中に形式を更新する機会があります。
デバイス形式のコントロール パネルの表示
現在のサウンド コントロール パネルのロジックでは、デバイスの形式の一覧が次のように表示されます。
- オーディオ デバイスがオーディオ エンジン要素をサポートしている場合、コントロール パネルに表示されるデータ形式の一覧は、デバイスのデータ形式リスト、つまり、ダウンレベル ピン (オーディオ エンジン要素の出力ピンに接続されている) に接続されているデータ形式リストです。
- オーディオ デバイスがオーディオ エンジン要素をサポートしていない場合、コントロール パネルに表示されるデータ形式の一覧は、ストリーミング ピンのデータ形式リスト、つまり、アップレベル ピンに接続されたデータ形式リストです。
複数回線の自動ダウンレベル ストリームの作成
ACX は、ダウンレベル ブリッジ ピンに関連付けられた ACXSTREAMBRIDGE オブジェクトを使用して、作成ストリーム要求をリモート回線に自動的に伝達します。
クライアント アプリがストリームを作成すると、その要求は最初にストリーミング ピンによって受信されます。 ACX は、回路作成時に指定されたコールバックを介して、ストリーミング ピンを所有するドライバにーストリームの作成要求を通知します。 コールバックでは、ドライバーはストリームを表す ACXSTREAM オブジェクトを作成し、コントロールを ACX に返します。 ACX は、コントロールを受信すると、この作成要求を次の (ダウンレベル) 回線に転送する必要がある場合にチェックします。 必要に応じて、ドライバーは作成ストリーム コールバックから戻る前に、作成要求を次の (ダウンレベル) 回線に転送できます。 後者のオプションを使用すると、ダウンレベル回線が作成要求を処理する機会を得た後に、ドライバーが事後の操作を実行できます。
ACX では、ストリームの作成に次の既定のロジックが使用されます。
- ダウンレベル ブリッジ ピンがない場合は、すべて完了です。
- ドライバーが既に ACXSTREAMBRIDGE にストリームを手動で関連付けられている場合は、すべて完了です。
- ダウンレベル ブリッジ ピンに指定したモードの ACXSTREAMBRIDGE がない場合は、要求の処理を中止します。
- ACX は、取得した ACXSTREAMBRIDGE で作成されたドライバーの新しいストリームを追加します。
ACXSTREAMBRIDGE は、マルチイン/シングルアウトとして機能します。インストリームがある限り、ACXSTREAMBRIDGE はアウトストリームを維持します。 アウトストリームは、最後のインストリームが削除された場合にのみ削除されます。 ACXSTREAMBRIDGE は、リモート回線に使用するモードと形式を決定するときに、ダウンレベル ブリッジ ピンに関連付けられている ACXDATAFORMATLIST を使用します。
ACXSTREAMBRIDGE は、アウトストリームのモードとデータ形式を選択するために次のロジックを使用します。
アウトストリームのモードが指定されていない場合は、"既定" 形式の一覧が存在するかどうかを確認します。
アウトストリームのモードが指定されておらず、'既定' の形式リストが存在しない場合は、'raw' の形式リストがあるかを確認します。
モードが NULL_GUID の場合は、最初のインストリームのモードに関連付けられた形式リストがあるかどうかを確認します。
モードが指定されている場合は、このモードの形式リストがあるかどうかを確認します。
形式リストが見つかった場合は、形式リストから既定の形式を取得します。
形式が見つからない場合、ACXSTREAMBRIDGE は最初のストリーム内の形式を使用します。
ACXSTREAMBRIDGE は、次のように取得したモードとデータ形式を使用して、ACXTARGETSTREAM を使用してストリーム作成要求を構築します。
- モードが指定されている場合は、そのモードが使用されます。
- モードが NULL_GUID の場合は、最初のインストリームのモードが使用されます。
- それ以外の場合はモードは使用されません。
ACX は、最後のインストリームが削除されたときに対象のストリームを削除または閉じる処理を行います。
ACXSTREAMCIRCUIT のもう 1 つの役割は、ストリーミング チェーンに沿ってストリームの状態を自動的に伝達することです。
ドライバーは、ACX に制御を戻す前に、AcxCircuitInitDisableDefaultStreamBridgeHandling を呼び出すか、ACXSTREAM オブジェクトを ACXSTREAMBRIDGE と手動で関連付けることによって、既定の回線のリモート ストリーム ブリッジの作成をオフにすることができます。 後者の場合、リモート ストリームは、ドライバーが '作成ストリーム' EVT_ACX_CIRCUIT_CREATE_STREAM コールバック関数から戻る前に作成されます。
host/offload/loopback/kws のように複数のキャプチャ/レンダリング ピンを使用する回線の場合 (つまり、オーディオエンジン エレメントがサポートされている場合)、ドライバーは、インモードを指定せずにストリーム ブリッジを作成し、作成ストリーム コールバックを処理する際に、受け取るACXSTREAM オブジェクトをストリーム ブリッジに手動で追加する必要があります。
ストリーム ブリッジの作成の詳細については、以下を参照してください。
ダウンレベル ストリームへの複数回線の自動ストリーム状態の伝達
ACXSTREAMBRIDGE は、ストリーム状態要求をダウンレベルでリモート回線に自動的に伝達します。 ストリームの状態が変化すると、ACXSTREAMBRIDGE は、アウトストリームの混合状態を計算し、ACXTARGETSTREAM を使用して、その新しい "ストリーム状態" 要求をリモート ストリームに送信します。
ACXSTREAM と ACXSTREAMBRIDGE は、次のロジックを使用します。
次のシナリオでは、最初にアップレベル ストリームの状態を変更します。
- && のレンダリングの停止を>実行へ
- && のキャプチャを実行から>停止へ
- その他の && を実行から>停止へ
次のシナリオでは、最後にアップレベル ストリームの状態を変更します。
- && のレンダリングを実行から>停止へ
- && のキャプチャを停止から>実行へ
- その他の && を停止から>実行へ
ドライバーには、構成設定を使用してこの順序を逆にするオプションがあります。
Note
ドライバー/回線/ストリームは、ストリームの実行から停止への切り替えを常に成功させる必要があります。 一方、ドライバーの停止から実行への失敗は許されます。