WavePci ポート ドライバーは、WaveCyclic ドライバーとは異なる方法でオーディオ ストリームのバッファリングを処理します。
WavePci ミニポート ドライバーがハードウェアミキシングを提供する場合、DirectSound は、単一の循環バッファー内の DirectSound ウェーブ ストリーム全体を含む 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 は、フレーム割り当てサイズを決定するときにミニポート ドライバーの設定を無視することを選択する場合があることに注意してください。