データのコピーおよびキャッシュのポリシー
WaveCyclic ミニポート ドライバーは、HD オーディオ コントローラー ハードウェアがアクセスする DMA バッファーと、ユーザー モードオーディオ アプリケーションがアクセスするクライアント バッファーの間でオーディオ データをコピーします。
再生データ ストリームの場合、ドライバーはクライアント バッファーから DMA バッファーにデータをコピーします。
キャプチャ データ ストリームの場合、ドライバーは DMA バッファーからクライアント バッファーにデータをコピーします。
再生ストリームとキャプチャ ストリームの両方で、ドライバーは DMA バッファー メモリ (キャッシュの種類が MmCached) のキャッシュを有効にし、PCI コントローラーのバス スヌーピング メカニズムに依存してキャッシュの一貫性を確保することで、最高のパフォーマンスを実現できます。 ただし、一部の PCI Express コントローラー実装では、HD オーディオ コントローラーのアイソクロナス データ転送 (Intel の初期 PCI Express チップセットなど) がスヌーピングされません。
ファンクション ドライバーは、PCI コントローラー ハードウェアが DMA バッファー転送のスヌーピングをサポートしているか、アイソクロナス データ転送を実行するかを検出することができません。 キャッシュの一貫性の問題を回避するために、ドライバーは、メモリのキャッシュの種類を MmWriteCombined として指定することで、DMA バッファー メモリのキャッシュを無効にします。 (MmNonCached も機能しますが、同様に動作しない可能性があります。) サンプル関数ドライバーに基づくカスタム アダプター ドライバーを作成する場合、PCI コントローラーが DMA バッファー転送のスヌーピングを実際にサポートしていることを確認できない限り、WaveCyclic ミニポート ドライバーも同様の動作になるはずです。
バス スヌーピングを実行しないデバイスとシステムをサポートするには、カスタム関数ドライバーは、次の規則に従う必要があります。
再生ストリームの場合は、DMA バッファーのキャッシュの種類を MmWriteCombined として指定します。 クライアント バッファーから DMA バッファーにデータ ブロックをコピーした後、KeMemoryBarrier 関数を呼び出して、データを DMA エンジンに表示させます。 KeMemoryBarrier は、コピーしたデータを効率的な方法でメモリにフラッシュします。この方法では、プロセッサのデータ キャッシュはほとんど妨げられることがありません。
キャプチャ ストリームの場合は、DMA バッファーのキャッシュの種類を MmWriteCombined または MmNonCached として指定します。 さらに、関数ドライバーは、DMA バッファーへの書き込みを避ける必要があります。 オーディオ サンプルのインプレース処理を実行する必要がある場合は、最初にデータを別の場所にコピーする必要があります。
関数ドライバーが DMA バッファーとの間でコピーするデータ ブロックは、書き込み結合バッファーの境界で開始または終了する必要はありません。また、そのサイズは、書き込み結合バッファー サイズの倍数である必要はありません (通常は 32 または 64 バイト)。
DDI の HDAUDIO_BUS_INTERFACE_BDL バージョンを使用するコーデック関数ドライバーの場合、AllocateContiguousDmaBuffer ルーチンが、DMA バッファー メモリの割り当てとマッピングの両方を実行します。 このルーチンは常に、バッファーのキャッシュの種類を MmWriteCombined に 設定します。
書き込み結合の詳細については、Intel Web サイトの「IA-32 Intel Architecture Software Developer's Manual」を参照してください。