次の方法で共有


ウェーブ フィルター

ウェーブ フィルターは、ウェーブ形式のデジタル オーディオ データをレンダリングまたはキャプチャするデバイスを表します。 通常、アプリケーションは、DirectSound API または Microsoft Windows マルチメディア waveOutXxx および waveInXxx 関数を介して、これらのデバイスの機能にアクセスします。 WDM オーディオ ドライバーでサポートできるウェーブ形式については、「 WAVEFORMATEX 」および「 WAVEFORMATEXTENSIBLE」を参照してください。

ウェーブ レンダリング フィルターは、ウェーブ デジタル オーディオ ストリームを入力として受信し、アナログ オーディオ信号 (スピーカーまたは外部ミキサーのセット) またはデジタル オーディオ ストリーム (S/PDIF コネクタなど) を出力します。

ウェーブ キャプチャ フィルターは、アナログ オーディオ信号 (マイクまたは入力ジャックから) またはデジタル ストリーム (S/PDIF コネクタなど) として入力として受信します。 同じフィルターによって、デジタル オーディオ データを含むウェーブ ストリームが出力されます。

1 つのウェーブ フィルターで、レンダリングとキャプチャの両方を同時に実行できます。 この種類のフィルターは、たとえば、一連のスピーカーを介してオーディオを再生し、同時にマイクを介してオーディオを録音できるオーディオ デバイスを表す場合があります。 または、「 ダイナミック オーディオ サブデバイス」の説明に従って、ウェーブ レンダリングハードウェアとウェーブキャプチャ ハードウェアを個別のウェーブ フィルターとして表す場合があります。

オーディオ アダプター ドライバーは、ウェーブ ミニポート ドライバーをバインドすることによって、ウェーブ フィルターを形成します。このドライバーは、ハードウェア ベンダーがアダプター ドライバーの一部として実装し、システムが実装するウェーブ ポート ドライバーを使用します。 ミニポート ドライバーは、ウェーブ フィルターのすべてのハードウェア固有の操作を処理し、ポート ドライバーは、すべての汎用ウェーブ フィルター関数を管理します。

PortCls システム ドライバー (Portcls.sys) は、WaveRT、WavePci、WaveCyclic の 3 つのウェーブ ポート ドライバーを実装します。

3 種類のウェーブ フィルターは次のように動作します。

  • WaveRT フィルターは、ウェーブ データのバッファーを割り当て、そのバッファーにユーザー モード クライアントから直接アクセスできるようにします。 バッファーは、ウェーブ デバイスのハードウェア機能に応じて、連続したメモリ ブロックまたは連続しないメモリ ブロックで構成できます。 クライアントは、仮想メモリの連続したブロックとしてバッファーにアクセスします。 バッファーは循環型です。つまり、デバイスの読み取り (レンダリング用) または書き込み (キャプチャ用) ポインターがバッファーの末尾に達すると、バッファーの先頭に自動的にラップされます。

  • WavePci フィルターは、クライアントのバッファーに直接アクセスします。 クライアントは、単一の連続した仮想メモリ ブロックとしてバッファーにアクセスしますが、WavePci フィルターは、一連の非連続メモリ ブロックとしてバッファーにアクセスする必要があります。 レンダリング ストリームまたはキャプチャ ストリームの連続する部分を含むブロックは、デバイスでキューに登録されます。 デバイスの読み取りまたは書き込みポインターが 1 つのブロックの末尾に達すると、キュー内の次のブロックの先頭に移動します。

  • WaveCyclic フィルターは、出力 (レンダリング用) または入力 (キャプチャ用) バッファーとして使用するために、単一の連続したメモリ ブロックで構成されるバッファーを割り当てます。 このバッファーは循環しています。 バッファーはクライアントから直接アクセスできないため、ドライバーはドライバーの循環バッファーとクライアントのユーザー モード バッファーの間でデータをコピーする必要があります。

WaveRT は WavePci および WaveCyclic よりも優先されます。 WavePci と WaveCyclic は、以前のバージョンの Windows で使用されていました。

WaveRT フィルターは、PCI や PCI Express などのシステム バス上に存在するオーディオ デバイスを表すことができます。 WaveCyclic フィルターまたは WavePci フィルターに対する WaveRT フィルターの主な利点は、WaveRT フィルターを使用すると、ユーザー モード クライアントがオーディオ ハードウェアと直接オーディオ データを交換できる点です。 これに対し、WaveCyclic フィルターと WavePci フィルターの両方には、ドライバーによる定期的なソフトウェア介入が必要であり、オーディオ ストリームの待機時間が長くなります。 さらに、分散/収集 DMA 機能の有無にかかわらず、オーディオ デバイスを WaveRT フィルターとして表すことができます。 詳細については、「 A Wave Port Driver for Real-Time Audio Streaming 」ホワイト ペーパーを参照してください。

WaveRT フィルター

WaveRT フィルターは、ポート/ミニポート ドライバーのペアとして実装されます。 Windows Vista 以降では、WaveRT フィルター ファクトリによって次のように WaveRT フィルターが作成されます。

  • WaveRT ミニポート ドライバー オブジェクトをインスタンス化します。

  • GUID 値である CLSID_PortWaveRT を指定して PcNewPort を呼び出すことにより、WaveRT ポート ドライバー オブジェクトをインスタンス化します。

  • ポート ドライバーの IPort::Init メソッドを呼び出して、ミニポート ドライバーをポート ドライバーにバインドします。

Subdevice Creation のコード例は、このプロセスを示しています。 ポートドライバーとミニポート ドライバーは、IPortWaveRT インターフェイスと IMiniportWaveRT インターフェイスを介して相互に通信します。

詳細については、「 A Wave Port Driver for Real-Time Audio Streaming 」ホワイト ペーパーを参照してください。

以前のバージョンの 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 メソッドを呼び出して、ミニポート ドライバーをポート ドライバーにバインドします。

Subdevice Creation のコード例は、このプロセスを示しています。 ポートドライバーとミニポート ドライバーは、IPortWavePci インターフェイスと IMiniportWavePci インターフェイスを介して相互に通信します。

詳細については、「 WavePci デバイスの実装に関する問題」を参照してください。

WaveCyclic フィルター

Microsoft では、多様で包括的な環境をサポートしています。 この記事には、偏りのない通信の Microsoft スタイル ガイドで除外として認識 用語への参照が含まれています。 単語または語句は、現在ソフトウェアに表示されるため、一貫性を保つため、この記事で使用されます。 言語を削除するようにソフトウェアが更新されると、この記事は整合するように更新されます。

注: 以前のバージョンの Windows の WaveCyclic 情報

WaveCyclic フィルターは、ポート/ミニポート ドライバーのペアとして実装されます。 WaveCyclic フィルター ファクトリは、次のように WaveCyclic フィルターを作成します。

  • WaveCyclic ミニポート ドライバー オブジェクトをインスタンス化します。

  • WaveCyclic ポート ドライバー オブジェクトは、GUID 値 CLSID_PortWaveCyclic を使用して PcNewPort を呼び出すことによってインスタンス化します。

  • ポート ドライバーの IPort::Init メソッドを呼び出して、ミニポート ドライバーをポート ドライバーにバインドします。

Subdevice Creation のコード例は、このプロセスを示しています。 ポートドライバーとミニポート ドライバーは、IPortWaveCyclic インターフェイスと IMiniportWaveCyclic インターフェイスを介して相互に通信します。

WaveCyclic フィルターの循環バッファーは、常に仮想メモリの連続したブロックで構成されます。 ポート ドライバーの IDmaChannel::AllocateBuffer メソッドの実装では、物理メモリと仮想メモリアドレス空間の両方で連続するバッファーが常に割り当てられます。 前述のように、WaveCyclic デバイスの DMA エンジンがバッファー メモリに追加の制約を課している場合、ミニポート ドライバーは、これらの制約を満たすために独自のバッファー割り当てメソッドを自由に実装できます。

大きなバッファー (たとえば、8 つの物理的に連続したメモリ ページ) を要求する WaveCyclic ミニポート ドライバーは、オペレーティング システムが元の要求を拒否した場合、小さいバッファー サイズに解決するように準備する必要があります。 オーディオ デバイスがアンロードされ、再読み込みされてシステム リソースの再調整が行われる場合があります (「リソースを再 調整するデバイスの停止」を参照)。

バス マスタリング DMA ハードウェアが組み込まれた WaveCyclic デバイスは、 マスター デバイスと呼ばれます。 または、WaveCyclic デバイスを、DMA ハードウェア機能が組み込まれていない 下位デバイス にすることもできます。 下位デバイスは、システム DMA コントローラーに依存して、必要なデータ転送を実行する必要があります。 マスター デバイスと下位デバイスの詳細については、IDmaChannel と IDmaChannelSlave を参照してください。

WaveCyclic ミニポート ドライバーは、既定の DMA チャネル オブジェクトを使用する代わりに、独自の DMA チャネル オブジェクトを実装できます。これは、ポート ドライバーの NewXxxDmaChannel メソッドのいずれかによって作成されます。

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

アダプター ドライバーのカスタム IDmaChannel 実装では、特別なハードウェア制約を満たすために、データのカスタム処理を実行できます。 たとえば、Windows マルチメディア関数では、16 ビット サンプルが常に符号付き値であるウェーブ形式が使用されますが、オーディオ レンダリング ハードウェアは、代わりに符号なし 16 ビット値を使用するように設計されている場合があります。 この場合、ドライバーのカスタム IDmaChannel::CopyTo メソッドを書き込んで、署名されたソース値を、ハードウェアに必要な署名されていない宛先値に変換できます。 この手法は、ハードウェア設計上の欠陥を回避するのに役立ちますが、ソフトウェアのオーバーヘッドに大きなコストが発生する可能性もあります。

独自の DMA チャネル オブジェクトを実装するドライバーの例については、WDK の以前のバージョンの Sb16 サンプル オーディオ アダプターを参照してください。 定数OVERRIDE_DMA_CHANNELが TRUE と定義されている場合、ソース コードの条件付きコンパイル ステートメントを使用すると、IPortWaveCyclic::NewXxxDmaChannel 呼び出しの既定の IDmaChannel オブジェクトの代わりにドライバーが使用する独自の IDmaChannel オブジェクトを実装できます。