WavePci デバイスのハードウェア要件
新しいハードウェア設計の機能を選択するとき、ベンダーは次の一般的な原則に従う必要があります。
ベンダーは、すべての処理を単純にハードウェアに移行するのではなく、各機能のコストとパフォーマンスへの影響を比較検討する必要があります。
ハードウェア機能の潜在的な価値を検討する場合、ベンダーは、オーディオなどの特定のサブシステムに絞り込むのではなく、システム全体への影響の観点からその機能を評価する必要があります。
ハードウェアで高速化する機能を慎重に選択することにより、ベンダーは CPU ワークロードを軽減して、メモリ使用量を改善し、より多くのシステム リソースを他のタスクで使用できるようになります。
これまで、すべてのオーディオ ハードウェア設計がこれらの原則に従ってきたわけではありません。
オーディオ コンテンツを再生するとき、または複数のストリームを混在させるとき、WDM オーディオ ドライバーによっては不必要に多くの CPU 時間とバス帯域幅を消費します。 このような欠陥は通常、問題のあるハードウェア設計と非効率的なドライバー実装の結果生じます。 ハードウェア設計の問題により、オーディオ ドライバーが特定のウェーブ形式を処理したり、ソフトウェアの介入を必要とする回避策が必要になるのを防ぐことができます。
WaveCyclic デバイス モデルの目的は、古いオーディオ デバイスのハードウェア制限に対応することです。 新しいハードウェア設計は、WavePci に完全に準拠している必要があります。
実際のスキャッター/ギャザー DMA を実行できる WavePci デバイスでは、CPU がバッファー間でオーディオ データのコピーに時間を費やす必要がなくなります。 WaveCyclic とは異なり、WavePci にはデータ コピーの固有のニーズがないため、マルチストリームまたはハードウェア アクセラレータ オーディオ デバイスに適したミニポート ドライバーとなります。 適切に設計された WavePci デバイスは CPU リソースをほとんど消費しないため、大量のオーディオ ストリーム (64 以上) をハードウェアに送信し、3-D 処理とミキシングを行うことができます。
WavePci デバイスには、スキャッター/ギャザー DMA 転送をサポートするバス マスター DMA コントローラーが必要です。 ハードウェア設計では、DMA コントローラーが処理できるデータ転送の種類に任意の制限を設けないでください。 WavePci デバイスは、以下の要件を満たしている必要があります。
デバイスはバス マスターである必要があります。
システム DMA リソースを使用することなく、オペレーティング システムからの介入なしでシステム メモリに自律的にアクセスできる必要があります。
デバイスは、任意の長さのデータ転送を処理できる必要があります。
メモリ ページよりも大きいマッピング (IPortWavePciStream::GetMapping を参照) を処理する必要があります。 たとえば、転送制限が 4 KB のデバイスは、WavePci の全要件を満たしません。 Microsoft Windows をサポートする 64 ビット CPU では、ページ サイズは 8 KB であるため、一部のマッピングのサイズが 4 KB を超える可能性があります。 物理メモリの断片化状況によっては、理論的に 1 回のマッピングで 32 KB を超えるデータ転送が可能です。 もう一方の極端の例として、マッピング サイズが 1 バイトの可能性があります。
デバイスは、システム メモリ内の任意の場所との間のデータ転送を処理する必要があります。
32 KB 以上の 2 のべき乗境界にまたがるデータ転送が行われる可能性がかなり高くなります。 4 GB を超える RAM をコンピューターに搭載できるようになったため、そのようなシステムでは、64 ビット CPU または x86 物理アドレス拡張 (PAE) のいずれかの場合、物理メモリに 4 GB を超えるマッピングを配置できます。 それらのコンピューターで最高のパフォーマンスを実現するには、ベンダーは 64 ビット アドレス指定をサポートするデバイスを作成する必要があります。 それ以外の場合、ソフトウェアでのデータのコピーが必要です。 これまで、16 MB を超える RAM を持つシステムで 24 ビット アドレス指定を行うデバイスの場合、データ コピーが必要でした。 デバイスは、物理メモリ内の任意の場所に対して読み書きできない場合、WavePci の代わりに WaveCyclic を使用する必要があります。 ドライバーは、そのアドレス到達がシステム メモリ バスの全アドレス範囲にアクセスするのに十分かどうかを判断する機会が与えられた後、デバイスの起動時にこの決定を行うことができます (IRP_MN_START_DEVICE を参照)。
デバイスは、任意の配置でデータ転送を処理する必要があります。
マッピングは、メモリ内の任意のバイト境界で開始および終了することができます。 オーディオ データのフレームは、最初のマッピングの末尾にある最初のいくつかのチャネルのサンプルと、2 番目のマッピングの残りのチャネルのサンプルを使用して、マッピング間で分割できます。 例については、「ウェーブ フィルター」をご覧ください。 一部のサンプル サイズでは、サンプル コンテナーもマッピング間で分割できます。 転送がキャッシュ ライン境界上にあることがデバイスにより求められる場合、または転送をオーディオ フレーム境界に厳密に揃える必要がある場合 (たとえば、転送サイズがステレオ 16 ビットの場合は 4 つに均等に分割されていると仮定した場合)、このデバイスでは WavePci への準拠をすべて満たすことができません。 非準拠のハードウェアは、ドライバーによって公開されるデータ範囲または形式を制限することにより WavePci デバイスとして公開できる点に注意してください (たとえば、特定のビット深度のみ、または特定のチャネル構成のみ)。
前の一覧の最後のポイントに関して、WavePci デバイスのスキャッター/ギャザー DMA エンジンは、メモリ ページの境界をまたぐバッファーを処理する必要があります。 たとえば、48 kHz、5.1 チャネル ウェーブ ストリームに対して 10 ミリ秒相当の 16 ビット PCM オーディオ サンプルを含むバッファーのサイズは次のとおりです。
(6 サンプル/フレーム)x(2 バイト/サンプル)x(48K フレーム/秒)x(10 ミリ秒) = 5760 バイト
これは、メモリ ページ サイズ (4096 バイト) を超えています。つまり、メモリ内での配置方法に応じて、バッファーに 1 つまたは 2 つのページ境界が含まれています。 バッファーには、オーディオ データのフレームの整数 (480) が含まれていますが、これらのフレームの 1 つまたは 2 つがページ境界をまたいでいる可能性があります。
このため、WavePci デバイスのスキャッター/ギャザー DMA ハードウェアは、メモリ内の 2 つの物理的に連続しないページ間で分割されるオーディオ フレーム (次の図のフレーム 197 など) を処理するよう設計する必要があります。
前の図の上部には、2 つのページ間の境界をまたぐ 5760 バイトのバッファーがあります。 この例では、バッファーは最初のページの先頭から 1728 バイトのオフセットで始まり、バッファーの先頭はメモリ内の 64 バイト境界に揃えられます。 各オーディオ フレームが 12 バイトを占有し、6 つのチャネルを含んでいると想定しています。 最初のページには、0 から 196 までのフレームがすべて含まれていますが、フレーム 197 の最初の 4 バイトのみです。
図の下部にはオーディオ フレーム 197 の詳細ビューがあり、チャンネル 0 と 1 のサンプルのみ最初のページに収まることを示しています。 チャネル 2 ~ 5 のサンプルは、2 番目のページに含まれています。
図の上部で 2 つのページが隣り合って表示されますが、実際にはカーネル仮想メモリ内でのみ連続しています。 バッファーを含むページは物理メモリ内で連続しないため、物理アドレスを使用するスキャッター/ギャザー DMA コントローラーでは、バッファーの 2 つの部分を、転送キューの 2 つの独立したエントリとして指定する必要があります。 WavePci ポート ドライバーは、ページ境界でバッファーを 2 つの別個の物理マッピングに自動的に分割します。
前の例が変更されて、バッファーが最初のページの先頭に合わせられた場合でも、分割フレームの問題は解消されません。 次の図に、この点を示します。 この場合、フレーム 341 は、最初のページ内に再び収まったチャネル 0 と 1 のサンプル、および 2 番目のページにあるチャネル 2 ~ 5 のサンプルを使用して、ページ境界で分割されます。
スキャッター/ギャザー DMA コントローラーが分割オーディオ フレームを適切に処理しない WavePci デバイスは、処理できるオーディオ データ形式の種類に制限されますが、ハードウェア設計上の問題を軽減するのにソフトウェアの回避策が役立つ可能性があります。 詳しくは、「WavePci の待機時間」をご覧ください。