トポロジ フィルター
トポロジー フィルターは、カード上で管理されるさまざまな Wave および MIDI ストリーム間の相互作用を処理する、オーディオ アダプター カード上の回路の部分を表します。 この回路は、レンダリング ストリームの混合とキャプチャ ストリームの多重化を行います。
トポロジ フィルターは、オーディオ アダプターの外部デバイスへの物理接続を表すブリッジ ピン (オーディオ フィルター グラフを参照) を提供します。 これらの接続は通常、スピーカーを駆動するアナログ出力信号とマイクからのアナログ入力信号を伝送します。 トポロジ フィルターのブリッジ ピンは、アナログ ライン入力およびライン出力ジャック、さらにはデジタル入出力コネクタを表す場合もあります。
「トポロジー フィルター」という用語は、ある意味では誤った名称です。 その名前とは裏腹に、トポロジ フィルタは、内部トポロジまたはレイアウトを公開する数種類のオーディオ フィルタのうちの 1 つにすぎません。 トポロジ フィルタには主要なトポロジ機能が含まれていますが、アダプタのトポロジ全体が含まれているとは限りません。 Wave フィルターと MIDI フィルターには独自のトポロジーがあります。 とえば、最小の WaveCyclic または WavePci フィルタ (波形フィルタを参照) は、基礎となるデバイスがオーディオ レンダリングを行うかキャプチャを行うかに応じて、2 つのピンと DAC (デジタル アナログ コンバーター) または ADC (アナログ デジタル コンバーター) のいずれかで構成されるトポロジを公開する場合があります。
トポロジ フィルターは、ポート/ミニポートのペアとして実装されます。 トポロジ フィルター ファクトリは、次のようにトポロジ フィルターを作成します:
トポロジ ミニポート ドライバー オブジェクトをインスタンス化します。
GUID 値 CLSID_PortTopology を指定して PcNewPortを呼び出すことにより、トポロジ ポート ドライバー オブジェクトをインスタンス化します。
これは、ポート ドライバーの IPort::Init 方式を呼び出して、ミニポート ドライバーをポート ドライバーにバインドします。
サブデバイスの作成のコード例は、このプロセスを示しています。
トポロジー ポート ドライバーとミニポート ドライバーは、それぞれの IPortTopology インターフェイスと IMiniportTopology インターフェイスを介して相互に通信します。 これらのインターフェイスは、トポロジ フィルターがピンを通過するストリームを明示的に管理する必要がないため、波、MIDI ポート、およびミニポート ドライバーのインターフェイスと比較して比較的単純です。 トポロジ フィルターのピンは、アダプター ハードウェアのハードワイヤード接続を表します。 トポロジー フィルター ピンの基礎となる物理接続は通常、アナログ オーディオ信号を伝送しますが、ハードウェア実装によっては、代わりにデジタル オーディオ ストリームを伝送する場合があります。
IMiniportWaveCyclic、IMiniportWavePci、IMiniportMidi、および IMiniportDMus インターフェイスとは対照的に、IMiniportTopology インターフェイスにはNewStream 方式がありません。
トポロジ フィルターの機能のほとんどは、そのプロパティ ハンドラーによって提供されます。 トポロジ フィルターは主に、SysAudio システム ドライバーと Microsoft Windows マルチメディア ミキサー API を使用するアプリケーションにトポロジー情報を提供するために存在します。 トポロジ フィルターのプロパティ ハンドラーは、オーディオ アダプターが通常提供するさまざまなコントロール (ボリューム、イコライゼーション、リバーブなど) へのアクセスを提供します。 プロパティ要求を通じて、ミキサー API はアダプター ハードウェア内の制御ノードを列挙し、ノード間の接続を検出し、ノードの制御パラメーターのクエリと設定の両方を行うことができます。 SndVol32 アプリケーション (SysTray および SndVol32 を参照) は、ミキサー API を使用して、アダプターのストリームごとのボリュームとミュート コントロールを検出します。
フィルター グラフを構築するとき、SysAudio は、トポロジー フィルターのピンの KSPROPERTY_PIN_PHYSICALCONNECTION プロパティをクエリして、どの波、MIDI、または DirectMusic フィルター ピンがどのトポロジ フィルター ピンに接続されているかを判断します。
波、MIDI、または DirectMusic フィルターとは異なり、トポロジー フィルターはピンをインスタンス化しません。 したがって、トポロジ フィルターのピン プロパティのクエリを処理するために使用できるピン オブジェクトはありません。 トポロジー フィルター自体は、そのピンでの物理接続に関するすべてのクエリを処理します。 詳細情報は、KSPROPSETID_Pinを参照してください。
他のタイプのオーディオ フィルターと同様に、トポロジー フィルターは PCCONNECTION_DESCRIPTOR 構造体の配列を使用して内部トポロジーを記述します。 ミニポート ドライバーは、IMiniport::GetDescription 方式から出力される PCFILTER_DESCRIPTOR 構造体でこの配列を公開します。 配列は、トポロジ フィルターのノードとピン間の接続のリストとしてトポロジを指定します (ノードと接続を参照)。 WDMAud システム ドライバーは、これらの接続とノードをミキサー ラインに変換し、ミキサー API がアプリケーションに公開するものを制御します。 オーディオ フィルターで説明したように、KS フィルターの入力ピンは SRC ミキサー ラインにマッピングされ、フィルターの出力ピンは DST ミキサー ラインにマッピングされます。
一般的なオーディオ アダプタは、スピーカーを通じて波および MIDI ファイルを再生したり、マイクや MIDI シンセサイザーからオーディオ信号をキャプチャしたりできます。 以下のコード例には、これらの機能を公開するトポロジ フィルターの PCCONNECTION_DESCRIPTOR 配列が含まれています:
// topology pins
enum
{
KSPIN_TOPO_WAVEOUT_SRC = 0,
KSPIN_TOPO_SYNTHOUT_SRC,
KSPIN_TOPO_SYNTHIN_SRC,
KSPIN_TOPO_MIC_SRC,
KSPIN_TOPO_LINEOUT_DST,
KSPIN_TOPO_WAVEIN_DST
};
// topology nodes
enum
{
KSNODE_TOPO_WAVEOUT_VOLUME = 0,
KSNODE_TOPO_WAVEOUT_MUTE,
KSNODE_TOPO_SYNTHOUT_VOLUME,
KSNODE_TOPO_SYNTHOUT_MUTE,
KSNODE_TOPO_MIC_VOLUME,
KSNODE_TOPO_SYNTHIN_VOLUME,
KSNODE_TOPO_LINEOUT_MIX,
KSNODE_TOPO_LINEOUT_VOLUME,
KSNODE_TOPO_WAVEIN_MUX
};
static PCCONNECTION_DESCRIPTOR MiniportConnections[] =
{
// FromNode---------------------FromPin------------------ToNode-----------------------ToPin
{ PCFILTER_NODE, KSPIN_TOPO_WAVEOUT_SRC, KSNODE_TOPO_WAVEOUT_VOLUME, 1 },
{ KSNODE_TOPO_WAVEOUT_VOLUME, 0, KSNODE_TOPO_WAVEOUT_MUTE, 1 },
{ KSNODE_TOPO_WAVEOUT_MUTE, 0, KSNODE_TOPO_LINEOUT_MIX, 1 },
{ PCFILTER_NODE, KSPIN_TOPO_SYNTHOUT_SRC, KSNODE_TOPO_SYNTHOUT_VOLUME, 1 },
{ KSNODE_TOPO_SYNTHOUT_VOLUME, 0, KSNODE_TOPO_SYNTHOUT_MUTE, 1 },
{ KSNODE_TOPO_SYNTHOUT_MUTE, 0, KSNODE_TOPO_LINEOUT_MIX, 2 },
{ PCFILTER_NODE, KSPIN_TOPO_SYNTHIN_SRC, KSNODE_TOPO_SYNTHIN_VOLUME, 1 },
{ KSNODE_TOPO_SYNTHIN_VOLUME, 0, KSNODE_TOPO_WAVEIN_MUX, 1 },
{ PCFILTER_NODE, KSPIN_TOPO_MIC_SRC, KSNODE_TOPO_MIC_VOLUME, 1 },
{ KSNODE_TOPO_MIC_VOLUME, 0, KSNODE_TOPO_WAVEIN_MUX, 2 },
{ KSNODE_TOPO_LINEOUT_MIX, 0, KSNODE_TOPO_LINEOUT_VOLUME, 1 },
{ KSNODE_TOPO_LINEOUT_VOLUME, 0, PCFILTER_NODE, KSPIN_TOPO_LINEOUT_DST },
{ KSNODE_TOPO_WAVEIN_MUX, 0, PCFILTER_NODE, KSPIN_TOPO_WAVEIN_DST }
};
前述のコード例の定数 PCFILTER_NODE は null ノード ID であり、ヘッダー ファイル Portcls.h で定義されています。 この定数を使用してフィルター上の外部ピンをノード上の論理ピンから区別する方法については、PCCONNECTION_DESCRIPTORを参照してください。
前述のコード例の各ピン名は、ミキサー API がピンをソースまたはデスティネーション ミキサー ラインにマップするかどうかに応じて、「SRC」または「DST」で終わります。 混乱を避けるために、ソースおよびデスティネーション ミキサー ラインはそれぞれシンク (入力) およびソース (出力) KS フィルター ピンにマップされることに注意してください。 詳細情報は、オーディオ フィルターを参照してください。
前のコード例の PCCONNECTION_DESCRIPTOR 配列は、次の図のトポロジ フィルターを記述しています。
図のトポロジー フィルターには、左側に 4 つの入力 (シンク) ピン、右側に 2 つの出力 (ソース) ピンがあります。 上部の 2 つの入力ピンと上部の出力ピンを接続するデータ パスは、波からレンダリングされた 2 つのアナログ信号と再生中の MIDI ストリームをミックスします。 下部の 2 つの入力ピンと下部の出力ピンを接続するデータ パスは、記録されているキャプチャされたアナログ信号を多重化します。
4 つの入力ピンは次のように動作します。
KSPIN_TOPO_WAVEOUT_SRC ピンは、波形フィルターの出力ピンに物理的に接続されており、.wav ファイルなどのソースからの波形ストリームをレンダリングして、ピンでアナログ信号を生成します。
KSPIN_TOPO_SYNTHOUT_SRC ピンは、シンセ フィルターの出力ピンに物理的に接続されており、たとえば .mid ファイルなどのソースからの MIDI ストリームをレンダリングして、ピンでアナログ信号を生成します。
KSPIN_TOPO_SYNTHIN_SRC ピンは、アナログ信号を生成するシンセサイザーに物理的に接続されています。 (より実用的なハードウェア設計では、MPU-401 MIDI インターフェイスから MIDI 入力ストリームを取得し、トポロジー フィルターを完全にバイパスして、それを Wave 形式に直接変換する可能性があることに注意してください。)
KSPIN_TOPO_MIC_SRC ピンは、マイクからアナログ信号を受け取る入力ジャックに物理的に接続されています。
2 つの出力ピンは次のように動作します:
KSPIN_TOPO_LINEOUT_DST ピンは、通常は一連のスピーカーを駆動するアナログ ライン出力ジャックに物理的に接続されています。
KSPIN_TOPO_WAVEIN_DST ピンは、ウェーブ フィルターの入力ピンに物理的に接続されており、アナログ信号をウェーブ ストリームに変換し、それを .wav ファイルなどの宛先に書き込みます。
ボリューム ノードとミュート ノード (KSNODETYPE_VOLUMEおよび KSNODETYPE_MUTEを参照) は、さまざまなストリームの音量レベルを制御するために使用されます。 SUM ノード (KSNODETYPE_SUMを参照) は、wave 入力と MIDI 入力からのオーディオ ストリームをミックスします。 MUX ノード (KSNODETYPE_MUXを参照) は 2 つの入力ストリームの間で選択します。
この図では、2 つのノード間またはピンとノード間の接続を示すために破線の矢印を使用しています。 矢印はデータ フローの方向を指します。 この図は合計 13 個の接続を示しており、それぞれが前のコード例の PCCONNECTION_DESCRIPTOR 配列の 13 個の要素の 1 つに対応します。
トポロジー フィルターに加えて、アダプター ドライバーは、トポロジー フィルターのピンに接続する他のフィルター (ウェーブ、FM シンセ、ウェーブ テーブルなど) を作成します。
たとえば、トポロジ フィルターの KSPIN_TOPO_WAVEOUT_SRC ピンに物理的に接続されている波形フィルターには、PCM データをトポロジー フィルターのピンに出力するアナログ信号に変換する DAC (KSNODETYPE_DAC ノードで表される) が含まれています。 トポロジー フィルターの KSPIN_TOPO_SYNTHOUT_SRC ピンに物理的に接続されている FM シンセまたはウェーブテーブル シンセ フィルターは、同様に MIDI データをアナログ信号に変換し、トポロジー フィルターのピンに出力します。 トポロジー フィルターは、これら 2 つのピンからのアナログ信号を混合し、混合された信号をスピーカーに出力します。
同じアダプタ カード上の他のハードウェア デバイスを表す他のフィルタへのトポロジ フィルタの物理接続は、フィルタへの他のタイプの接続と区別する必要があります。 たとえば、wave、MIDI、および DirectMusic フィルターの特定のピンは、ソフトウェア制御の下で接続または切断できます。
デバイスの起動中、アダプター ドライバーは、接続ごとに 1 回 PcRegisterPhysicalConnection を呼び出して、トポロジ フィルターの物理接続を登録します。 ポートドライバーは、KSPROPERTY_PIN_PHYSICALCONNECTION プロパティ取得要求に応答するために、この情報を必要とします。