トポロジの指定
ハードウェア ベンダーが波および MIDI デバイス用にどのミニポート ドライバーを作成するかを決定したら、次のステップは、これらのデバイスのカーネル ストリーミング (KS) トポロジを表すことです。 KS トポロジは、オーディオまたは MIDI ストリームが各デバイスを流れる際にたどるデータ パスを記述する一連のデータ構造で構成されます。 このトポロジを通じて、ドライバーは各パスに沿った制御ノード (ボリューム コントロールなど) を公開します。 通常、アプリケーションは Windows マルチメディア mixerXxx 関数を使用して、各パスに沿ったノードのシーケンスを列挙することによってトポロジを探索します。 たとえば、ボリューム レベル制御ノードを検出した後、アプリケーションはそのノードのボリューム レベルを設定できます。 Windows マルチメディアの詳細情報は、Microsoft Windows SDK のドキュメントを参照してください。 MixerXxx 関数による KS トポロジの表現の詳細については、カーネル ストリーミング トポロジからオーディオ ミキサー API への変換を参照してください。
PortCls は 6 つのポート ドライバーを提供します。WavePci、WaveCyclic、WaveRT、MIDI、DMus、およびトポロジー。 (WaveRT は Windows Vista 以降で利用可能になっており、推奨されるアプローチです。)トポロジ ポート ドライバーは、wave デバイスと MIDI デバイスからのレンダリング ストリームを混合するオーディオ アダプター回路の部分を制御します。 また、入力ジャックからのキャプチャ ストリームの選択も制御します。 やや誤解を招きやすい名前にもかかわらず、トポロジ ポート ドライバはオーディオ アダプタのトポロジのすべてを具体化しているわけではありませんが、通常はオーディオ アダプタのトポロジの大部分が含まれています。 他のポート ドライバーは、アダプターのトポロジの残りの部分に寄与します。
次の表に示すように、各ポート ドライバーは対応するミニポート ドライバーとペアになって、オーディオ アダプター上の特定のデバイス (wave、MIDI、またはミキサー) を表す KS フィルターを形成します。
フィルターの種類 | 説明 |
---|---|
WaveXxx フィルター |
波出力ストリームをアナログ オーディオ信号に変換する、またはアナログ オーディオ信号を波入力ストリームに変換する 波デバイスを表します。 |
MIDI または DMus フィルター |
MIDI ストリームを再生またはキャプチャする MIDI デバイスを表します。 |
トポロジーフィルター |
アダプターのミキサー回路を表します。 |
ミニポート ドライバーは、デバイスが包含するアダプター トポロジの部分の定義を含む、フィルターのデバイス固有の機能を実装します。 ポート ドライバーは、フィルターの種類ごとに、オペレーティング システムとの通信を含む一般的なフィルター操作を処理します。
各フィルターには 1 つ以上の KS ピンがあり、オーディオ データのストリームがフィルターに出入りするための経路として機能します。 通常、トポロジー フィルターのピンは、アダプター回路の配線接続を介して Wave、MIDI、および DMus フィルターのピンに接続されます。 これらのフィルターとその相互接続は、アダプターのトポロジーを具体化する KS フィルター グラフを形成します。
次の図は、オーディオ アダプタの例のトポロジを示しています。
上の図では、最上位のトポロジは、MIDI、WaveXxx、およびトポロジ フィルター間の接続で構成されています。 さらに、各フィルタには独自の内部トポロジがあり、フィルタを通過するデータ パスと各パスに沿った制御ノードで構成されます。 ノードには次の表に示すようにラベルが付けられます。
Label | 説明 | KS ノードタイプ GUID |
---|---|---|
シンセサイザー |
シンセサイザーノード |
KSNODETYPE_SYNTHESIZER |
DAC (DAC) |
デジタル/オーディオ コンバータ ノード |
KSNODETYPE_DAC |
ADC |
アナログ/デジタル コンバータ ノード |
KSNODETYPE_ADC |
体積 |
ボリュームレベルのコントロール ノード |
KSNODETYPE_VOLUME |
Mute |
ミュート制御ノード |
KSNODETYPE_MUTE |
SUM |
合計ノード |
KSNODETYPE_SUM |
MUX |
マルチプレクサ ノード |
KSNODETYPE_MUX |
上の図では、オーディオ アダプタの左側にあるピンは、データ ストリームがシステム バスからアダプタに入る、またはアダプタからシステム バスに入る論理接続 (物理接続ではない) を表しています。 これらのピンは、アダプタの外部にある他のフィルタ (図示せず) のソース ピンとシンク ピンに論理的に接続されます。 通常、これらのフィルターは、アダプター トポロジーとともに、アプリケーションが mixerXxx 関数を使用してトポロジーを探索できる、より大きなフィルター グラフを形成するソフトウェア モジュールです。 たとえば、上の図で「PCM Wave Out」というラベルが付いているピンは、Windows のユーザー モード オーディオ エンジンに論理的に接続されています。 これらの論理接続は、システム バス上の DMA 転送によって維持されます。
対照的に、トポロジー フィルターの左端にあるピンは、MIDI および WaveXxx フィルターのピンに物理的に接続されています。 これらの接続はハードワイヤードであり、ソフトウェアによって変更することはできません。
オーディオ アダプタの右側にあるブリッジ ピンは、システム シャーシのオーディオ ジャックを表します。 これらのピンは、KS フィルター グラフと外部世界との間の境界を橋渡しするため、ブリッジ ピンと呼ばれます。
通常、フィルター、ピン、ノードには、オーディオ ドライバーのクライアント (カーネル モード コンポーネントまたはユーザー モード アプリケーション) がアクセスできるプロパティがあります。 クライアントは、フィルター、ピン、またはノードに KS プロパティ リクエストを送信して、プロパティの現在の値をクエリしたり、プロパティ値を変更したりできます。 たとえば、ボリュームレベルの制御ノードには KSPROPERTY_AUDIO_VOLUMELEVEL プロパティがあり、クライアントは KS プロパティ要求を通じてこれを変更できます。 合計ノードは、通常はプロパティを持たないノード タイプの例です。
簡単にするために、上の図の WaveXxx フィルターには、システム バスから PCM 波形出力ストリームを受け入れるためのピンが 1 つだけ用意されています。 対照的に、一部の波形デバイスは PCM 波形出力用に複数のピンを提供し、ピンに入るストリームを内部でミキシングするためのハードウェアを備えています。 これらのデバイスは、アプリケーションのサウンド バッファーから再生される PCM ストリームを受け入れることにより、DirectSound を使用するアプリケーションにハードウェア アクセラレーションを提供します。 DirectSound がこれらのピンを使用するには、WDM オーディオの DirectSound ハードウェア アクセラレーションで説明されているように、2 次元 (2-D) および 3 次元 (3-D) 処理用の追加ノードを提供する必要があります。
このタイプのハードウェア アクセラレーションは、Windows Server 2003、Windows XP、Windows 2000、および Windows Me/98 ではサポートされていますが、Windows Vista ではサポートされていません。 Windows Vista は、古い Wave デバイスのハードウェア アクセラレーション ピンを使用しません。
上の図では、MIDI、WaveXxx、およびトポロジ フィルター間の物理接続はすべて、アナログ オーディオ信号を転送します。 ただし、別のトポロジ デバイスでも、MIDI および 波デバイスからのデジタル出力ストリームを受け取り、それらをデジタル的にミキシングし、デジタル ミックスをアナログ出力信号に変換することによって、同様の効果を達成する可能性があります。
上の図の左下隅にある「非 PCM Wave Out」ピンは、AC-3-over-S/PDIF や WMA Pro-over-S/PDIF などの S/PDIF パススルー形式の非 PCM 出力ストリームを受け入れます。 これらの形式のいずれかを使用すると、デバイスはデータをデコードせずに、圧縮データを S/PDIF リンク経由で送信するだけです。 このため、上の図の右下隅にある「S/PDIF Out」ピンへのデータ パスには、ボリューム ノードやミュート ノードが含まれていません。 非 PCM オーディオ形式と S/PDIF パススルー送信の詳細については、非 PCM 波形フォーマットと非 PCM ストリームの S/PDIF パススルー送信のサポートを参照してください。
ミニポート ドライバーは、そのトポロジを PCFILTER_DESCRIPTOR 構造の形式でポート ドライバーに提示します。 この構造はフィルターのすべてのピンとノードを記述し、ピンとノードが相互に接続する方法を指定します。
前の図に示すように、モノリシック トポロジ フィルターを設計する代わりに、オーディオ アダプターのミキサー回路を複数のトポロジー フィルターに分割できます。 たとえば、前の図では、スピーカーを駆動するデータ パスは 1 つのトポロジ フィルターとして実装され、入力デバイスからオーディオ データをキャプチャするデータ パスは別のトポロジー フィルターとして実装できます。 特定のトポロジ フィルター内のデータ パスが使用されていない場合、アダプター全体を無効にすることなく、アダプターのその部分の電源をオフにすることができます。 詳細情報は、ダイナミック オーディオ サブデバイスを参照してください。