ウェーブ フィルター
ウェーブ フィルターは、ウェーブ形式のデジタル オーディオ データをレンダリングまたはキャプチャするデバイスを表します。 通常、アプリケーションは、DirectSound API または Microsoft Windows マルチメディア waveOut Xxx 関数と waveIn Xxx 関数を使用して、これらのデバイスの機能にアクセスします。 WDM オーディオ ドライバーがサポートできるウェーブ形式の詳細については、WAVEFORMATEX と WAVEFORMATEXTENSIBLEを参照してください。
波形レンダリング フィルターは、波形デジタル オーディオ ストリームを入力として受信し、アナログ オーディオ信号 (スピーカーのセットまたは外部ミキサー) またはデジタル オーディオ ストリーム (S/PDIF コネクタなど) を出力します。
ウェーブキャプチャフィルタは、アナログオーディオ信号(マイクロフォンまたは入力ジャックから)またはデジタルストリーム(S/PDIFコネクタなど)を入力として受信します。 同じフィルターは、デジタル オーディオ データを含むウェーブ ストリームを出力します。
単一のウェーブ フィルターで、レンダリングとキャプチャの両方を同時に実行できます。 この種類のフィルターは、たとえば、一連のスピーカーを介してオーディオを再生し、同時にマイクを介してオーディオを録音できるオーディオ デバイスを表す場合があります。 または、ウェーブ レンダリング ハードウェアとウェーブ キャプチャ ハードウェアは、ダイナミック オーディオ サブデバイスで説明されているように、個別のウェーブ フィルターとして表される場合があります。
オーディオ アダプター ドライバーは、ハードウェア ベンダーがアダプター ドライバーの一部として実装するウェーブ ミニポート ドライバーを、システムが実装するウェーブ ポート ドライバーとバインドすることで、ウェーブ フィルターを形成します。 ミニポート ドライバーは、ウェーブ フィルターのすべてのハードウェア固有の操作を処理し、ポート ドライバーはすべての汎用ウェーブ フィルター関数を管理します。
PortCls システム ドライバー (Portcls.sys) は、次の 3 つのウェーブ ポート ドライバーを実装します:WaveRT、WavePci、および WaveCyclic。
3 種類のウェーブ フィルターは次のように動作します:
WaveRTフィルターは、ウェーブ データにバッファーを割り当て、そのバッファーにユーザー モード クライアントから直接アクセスできるようにします。 バッファーは、ウェーブ デバイスのハードウェア機能に応じて、連続または非連続のメモリ ブロックで構成できます。 クライアントは、仮想メモリの連続したブロックとしてバッファにアクセスします。 バッファーは循環的であり、デバイスの読み取り (レンダリング用) または書き込み (キャプチャ用) ポインターがバッファーの末尾に達すると、バッファーの先頭に自動的に折り返されます。
WavePci フィルターは、クライアントのバッファーに直接アクセスします。 クライアントは仮想メモリの 1 つの連続したブロックとしてバッファーにアクセスしますが、 WavePci フィルターは、連続していない可能性のある一連のメモリ ブロックとしてバッファーにアクセスする必要があります。 レンダリングまたはキャプチャ ストリームの連続する部分を含むブロックは、デバイスでキューに入れられます。 デバイスの読み取りまたは書き込みポインターが 1 つのブロックの末尾に達すると、キュー内の次のブロックの先頭に移動します。
WaveCyclic フィルターは、出力 (レンダリング用) または入力 (キャプチャ用) バッファーとして使用するために、1 つの連続したメモリ ブロックで構成されるバッファーを割り当てます。 このバッファーは循環的です。 バッファーはクライアントから直接アクセスできないため、ドライバーはドライバーの循環バッファーとクライアントのユーザー モード バッファーの間でデータをコピーする必要があります。
WaveRT は、WavePci や WaveCyclic よりも優先されます。 WavePci と WaveCyclic は、以前のバージョンの Windows で使用されていました。
WaveRT フィルターは、PCI や PCI Express などのシステム バス上に存在するオーディオ デバイスを表すことができます。 WaveCyclic または WavePci フィルターに対する WaveRT フィルターの主な利点は、WaveRT フィルターを使用すると、ユーザー モード クライアントがオーディオ ハードウェアとオーディオ データを直接交換できることです。 これに対し、WaveCyclic フィルターと WavePci フィルターはどちらもドライバーによる定期的なソフトウェア介入を必要とするため、オーディオ ストリームの待機時間が長くなります。 さらに、スキャッター/ギャザー DMA 機能を持つオーディオ デバイスと持たないオーディオ デバイスは、WaveRT フィルターとして表すことができます。 詳細については、ホワイト ペーパーリアルタイムオーディオストリーミング用のウェーブポートドライバを参照してください。
WaveRT フィルター
WaveRT フィルターは、ポート/ミニポート ドライバーのペアとして実装されます。 Windows Vista 以降では、WaveRT フィルター ファクトリによって次のように WaveRT フィルターが作成されます:
WaveRT ミニポート ドライバー オブジェクトをインスタンス化します。
GUID 値 CLSID_PortWaveRT を使用して PcNewPort を呼び出すことによって、WaveRT ポート ドライバー オブジェクトをインスタンス化します。
ポート ドライバーの IPort::Init メソッドを呼び出して、ミニポート ドライバーをポート ドライバーにバインドします。
サブデバイスの作成のコード例は、このプロセスを示しています。 ポート ドライバーとミニポート ドライバーは、IPortWaveRT インターフェイスと IMiniportWaveRT インターフェイスを介して相互に通信します。
詳細については、ホワイト ペーパーリアルタイムオーディオストリーミング用のウェーブポートドライバを参照してください。
以前のバージョンの Windows に関する情報
以前のバージョンの Windows の WaveCyclic 情報
WaveCyclic フィルターは、ISA、PCI、PCI Express、PCMCIA などのシステム バスに接続するオーディオ デバイスを表すことができます。 "WavePci" という名前が示すように、WavePci フィルターは通常、PCI バスに接続するデバイスを表しますが、原則として、WavePci デバイスは代わりに ISA バスなどに接続する場合があります。 WaveCyclic でサポートされている単純なデバイスとは異なり、WavePci でサポートされているデバイスには、スキャッター/ギャザー DMA 機能が必要です。 PCI バス上に存在するが、スキャッター/ギャザー DMA がないオーディオ デバイスは、WaveCyclic フィルターとして表すことができますが、WavePci フィルターとして表すことはできません。
以前のバージョンの Windows の WavePci 情報
WavePci デバイスは、任意のメモリ アドレスに配置でき、任意のバイト アラインメントで開始および終了するバッファーとの間で、スキャッター/コレクト DMA 転送を実行できます。 これに対し、WaveCyclic デバイスの DMA ハードウェアでは、デバイスのミニポート ドライバーが割り当てる 1 つのバッファーとの間でデータを移動する機能のみが必要です。 WaveCyclic ミニポート ドライバーは、DMA チャネルの制限された機能を満たす循環バッファーを自由に割り当てることができます。 たとえば、一般的な WaveCyclic デバイスの DMA チャネルには、次の制限を満たすバッファーが必要になる場合があります:
バッファーは、物理アドレス空間の特定の領域にあります。
バッファーは、物理アドレス空間と仮想アドレス空間で連続しています。
バッファーは、4 バイトまたは 8 バイトの境界で開始および終了します。
ただし、この単純さと引き換えに、WaveCyclic デバイスはサイクリック バッファーとの間でのデータのソフトウェア コピーに依存する必要がありますが、WavePci デバイスは、DMA ハードウェアのスキャッター/ギャザー機能に依存してそのようなコピーを回避します。 ウェーブ オーディオ データをレンダリング デバイスに配信したり、キャプチャ デバイスからデータを取得したりする IRP には、データ バッファーが付属しており、これらの各バッファーには、レンダリングまたはキャプチャされているオーディオ ストリームの一部が含まれています。 WavePci デバイスは、スキャッター/ギャザー DMA エンジンを介してこれらのバッファーに直接アクセスできますが、WaveCyclic デバイスでは、データを IRP からサイクリック バッファーにコピーするか、その逆を行う必要があります。
WavePci フィルター
注記:以前のバージョンの Windows の WavePci 情報
WavePci フィルターは、ポート/ミニポート ドライバーのペアとして実装されます。 WavePci フィルター ファクトリは、次のように WavePci フィルターを作成します。
WavePci ミニポート ドライバー オブジェクトをインスタンス化します。
GUID 値 CLSID_PortWavePci を使用して PcNewPort を呼び出すことによって、WavePci ポート ドライバー オブジェクトをインスタンス化します。
ポート ドライバーの IPort::Init メソッドを呼び出して、ミニポート ドライバーをポート ドライバーにバインドします。
サブデバイスの作成のコード例は、このプロセスを示しています。 ポート ドライバーとミニポート ドライバーは、IPortWavePciと IMiniportWavePci インターフェイスを介して相互に通信します。
詳細については、WavePci デバイスの実装の問題を参照してください。
WaveCyclic フィルター
Note
Microsoft は、多様で包括的な環境をサポートしています。 この記事には、偏りのないコミュニケーションのための Microsoft スタイル ガイドで排他的であると認識されている用語への参照が含まれています。 この単語またはフレーズは現在ソフトウェアに含まれているため、一貫性を保つためにこの記事で使用されています。 ソフトウェアが更新されて言語が削除されると、この記事は調整されるように更新されます。
注記:以前のバージョンの Windows の WaveCyclic 情報
WaveCyclic フィルターは、ポート/ミニポート ドライバー ペアとして実装されます。 WaveCyclic フィルター ファクトリは、次のように WaveCyclic フィルターを作成します:
WaveCyclic ミニポート ドライバー オブジェクトをインスタンス化します。
GUID 値 CLSID_PortWaveCyclic を使用して PcNewPort を呼び出すことによって、WaveCyclic ポート ドライバー オブジェクトをインスタンス化します。
ポート ドライバーの IPort::Init メソッドを呼び出して、ミニポート ドライバーをポート ドライバーにバインドします。
サブデバイスの作成のコード例は、このプロセスを示しています。 ポート ドライバーとミニポート ドライバーは、IPortWaveCyclic インターフェイスと IMiniportWaveCyclic インターフェイスを介して相互に通信します。
WaveCyclic フィルターの循環バッファーは、常に仮想メモリの連続したブロックで構成されます。 IDmaChannel::AllocateBuffer メソッドのポート ドライバーの実装は、物理メモリと仮想メモリの両方のアドレス空間で連続するバッファーを常に割り当てます。 前述のように、WaveCyclic デバイスの DMA エンジンがバッファー メモリに追加の制約を課す場合、ミニポート ドライバーは、これらの制約を満たすために独自のバッファー割り当て方法を自由に実装できます。
大きなバッファー (たとえば、物理的に連続した 8 つのメモリ ページ) を要求する WaveCyclic ミニポート ドライバーは、オペレーティング システムが元の要求を拒否した場合に、より小さいバッファー サイズに落ち着くように準備する必要があります。 オーディオ デバイスは、システム リソースを再調整するために、アンロードおよび再ロードされる場合があります (リソースを再調整するためのデバイスの停止を参照)。
バスマスタリングDMAハードウェアを内蔵したWaveCyclicデバイスは、マスターデバイスと呼ばれます。 または、WaveCyclic デバイスを、組み込みの DMA ハードウェア機能を持たない下位デバイスにすることもできます。 下位デバイスは、必要なデータ転送を実行するために、システム DMA コントローラーに依存する必要があります。 マスター デバイスと下位デバイスの詳細については、IDmaChannelおよびIDmaChannelSlaveを参照してください。
WaveCyclic ミニポート ドライバーは、ポート ドライバーの New Xxx DmaChannel メソッドの 1 つによって作成された既定の DMA チャネル オブジェクトを使用する代わりに、独自の DMA チャネル オブジェクトを実装できます。
IPortWaveCyclic::NewMasterDmaChannel
IPortWaveCyclic::NewSlaveDmaChannel
アダプター ドライバーのカスタム IDmaChannel 実装では、特別なハードウェアの制約を満たすためにデータのカスタム処理を実行できます。 たとえば、Windows マルチメディア関数では、16 ビット サンプルが常に符号付き値であるウェーブ形式が使用されますが、オーディオ レンダリング ハードウェアは、代わりに符号なし 16 ビット値を使用するように設計されている場合があります。 この場合、ドライバーのカスタム IDmaChannel::CopyTo メソッドを記述して、署名されたソース値をハードウェアが必要とする署名されていない宛先値に変換できます。 この手法は、ハードウェア設計の欠陥を回避するのに役立ちますが、ソフトウェアのオーバーヘッドに多大なコストがかかる可能性もあります。
独自の DMA チャネル オブジェクトを実装するドライバーの例については、以前のバージョンの WDK の Sb16 サンプル オーディオ アダプターを参照してください。 定数OVERRIDE_DMA_CHANNELが TRUE に定義されている場合、ソース コード内の条件付きコンパイル ステートメントにより、ドライバーが IPortWaveCyclic::New XxxDmaChannel 呼び出しの既定の IDmaChannel オブジェクトの代わりに使用する独自の IDmaChannel オブジェクトの実装が有効になります。