WavePci 遅延
WavePci ポート ドライバーは、WaveCyclic ドライバーとは異なる方法でオーディオ ストリームのバッファリングを処理します。
WavePci ミニポート ドライバーがハードウェア ミキシングを提供する場合、DirectSound は、DirectSound ウェーブ ストリーム全体を 1 つの循環バッファーに含む WavePci ポート ドライバーに IRP を送信します。 DirectSound は、仮想メモリの連続したブロックとしてバッファーを割り当てます。 DirectSound バッファーのコピーを回避するために、カーネルストリーミング レイヤーはバッファーをカーネルモードの仮想メモリにマップし、循環バッファー内のメモリ ページの仮想アドレスと物理アドレスの両方を指定する MDL (メモリ記述子リスト) を生成します。 WavePci ポート ドライバーは、循環バッファーをアロケーター フレームのシーケンスにパーティション分割します (KS アロケーターを参照)。 ミニポート ドライバーは、ストリームの初期化中にポート ドライバーによってIMiniportWavePciStream::GetAllocatorFraming メソッドが呼び出されたときに、優先アロケーター フレーム サイズを指定します。 ただし、システム グラフ ビルダーである SysAudio は、オーディオ フィルター グラフ内の他のコンポーネントの要件に対応するために、ミニポート ドライバーの基本設定をオーバーライドできます。
WavePci ポート ドライバーは、マッピングのシーケンスとして循環バッファーをミニポート ドライバーに公開します。 マッピングは、割り当てフレーム全体またはフレームの一部です。 特定の割り当てフレームが完全にページ内にある場合、ポート ドライバーはそのフレームを 1 つのマッピングとしてミニポート ドライバーに提示します。 割り当てフレームが 1 つ以上のページ境界にまたがっている場合、ポート ドライバーは各ページ境界でフレームを分割し、2 つ以上のマッピングとして表示します。 IPortWavePciStream::GetMapping を呼び出すたびに、シーケンス内の次の連続するマッピングが生成されます。
ミニポート ドライバーがハードウェアでバッファーされるデータのミリ秒数をほとんど制御できない WaveCyclic ケースとは対照的に、WavePci ミニポート ドライバーは、いつでも開いているマッピングの数を大幅に制御できます。 開いているマッピングの数は、GetMapping を呼び出すたびに 1 ずつ増加し、ReleaseMapping を呼び出すごとに 1 ずつ減少します。 (もちろん、GetMapping 呼び出しは失敗する可能性があるため、ドライバーはマッピングの数を完全に制御することはできません)。開いているマッピングの数を制御し、マッピングの累積サイズを追跡することで、ミニポート ドライバーは、ハードウェアで使用できるバッファリングのミリ秒数を (マッピング サイズに依存する許容範囲内で) 決定できます。 WavePci ミニポート ドライバーは、枯渇の可能性を許容レベルに減らすのに十分なページ マッピングを要求する必要があります。
ミニポート ドライバーのポリシーが、読み取りポインターと書き込みポインターの間など、最大 50 ミリ秒のデータをバッファー処理する場合、この制限はドライバーが蓄積するデータの最大量を表しますが、ストリームの待機時間に対するドライバーの貢献を表すものではなく、表すべきではありません。 ドライバーは、待機時間をできるだけ小さく保つように設計する必要があります。 ミニポート ドライバーが新しいストリームの再生を開始する前にマッピングの初期セットを取得すると、ミニポート ドライバーは、バッファー制限 (この例では 50 ミリ秒) に達するか、マッピングがすぐに使用できなくなるまで、マッピングを要求し続けることができます。 ただし、後者の場合、ミニポート ドライバーは、ストリームの再生を開始する前に、より多くのマッピングが使用可能になるまで待機しないでください。 代わりに、ドライバーは既に取得したマッピングの再生をすぐに開始する必要があります。 その後、より多くのマッピングが使用可能になると、ドライバーは、バッファー サイズの制限に達するか、マッピングがすぐに使用できなくなるまで、追加のマッピングを取得し続けることができます。
一般に、WavePci デバイスの DMA ハードウェアは、任意のバイト アラインメントで格納され、物理メモリの非連続ページ間の境界をまたぐオーディオ フレームに直接アクセスするように設計する必要があります。 マッピングを整数のオーディオ フレームにする必要があるデバイスがある場合、そのデバイスはサポートするオーディオ形式の種類が制限されます。 もちろん、この制限があるデバイスでも、2 の累乗のオーディオ フレーム サイズを処理できる必要があります。
たとえば、4 つのチャネルと 16 ビットのサンプル サイズを持つデバイスには、8 バイトのオーディオ フレーム サイズが必要です。 整数のオーディオ フレームは、ページ (または 8 バイトの倍数であるその他の割り当てフレーム サイズ) 内にきちんと収まります。 ただし、16 ビット サンプルの 5.1 チャネル ストリームの場合、オーディオ フレーム サイズは 12 バイトであり、1 ページのサイズを超えるストリームには、ページ境界をまたぐオーディオ フレームが必然的に含まれます。 波形フィルターの図は、この問題を示しています。任意のバイト アラインメントと任意のバイト長のマッピングを処理できないハードウェアは、中間コピーを実行するためにドライバーに依存する必要があり、パフォーマンスが低下します。
Microsoft Windows Driver Kit (WDK) の Ac97 サンプル アダプター ドライバーは、GetAllocatorFraming メソッドを実装します。 ミニポート ドライバーは、このメソッドを使用して、優先フレーム割り当てサイズを通信します。 Windows 2000 および Windows Me では、ポート ドライバーは、スプリッター システム ドライバー (Splitter.sys) が出力ピンの上にインスタンス化されている場合にのみ、このメソッドを呼び出します。 Windows XP 以降では、ポート ドライバーは入力ストリームに対してもこのメソッドを呼び出します。 SysAudio は、フレーム割り当てサイズを決定するときに、ミニポート ドライバーの基本設定を無視することを選択する場合があることに注意してください。