注
Microsoft では、多様で包括的な環境をサポートしています。 この記事には、偏りのない通信の Microsoft スタイル ガイドで除外として認識 用語への参照が含まれています。 単語または語句は、現在ソフトウェアに表示されるため、一貫性を保つため、この記事で使用されます。 言語を削除するようにソフトウェアが更新されると、この記事は整合するように更新されます。
PortCls システム ドライバーは、WaveCyclic ミニポート ドライバーと WavePci ミニポート ドライバーの利点のために IDmaChannel インターフェイスと IDmaChannelSlave インターフェイスを実装します。 IDmaChannel は、DMA チャネルに加えて、関連付けられている DMA バッファーとバッファー使用パラメーターを表します。 さらに、WaveCyclic ミニポート ドライバーは、下位デバイスの DMA チャネルを管理する IDmaChannelSlave を使用します。 IDmaChannelSlave は IDmaChannel から継承します。 DMA 操作の制御については、「 アダプター オブジェクトと DMA」を参照してください。
IDmaChannel オブジェクトは、次をカプセル化します。
マスターまたは下位デバイスの DMA チャネル
チャネルに関連付けられているデータ バッファー
チャネルの使用方法を説明する情報
ポートドライバーとミニポート ドライバーは、DMA チャネル オブジェクトを使用して、DMA チャネルの使用状況に関する情報を通信します。 通常、ミニポート ドライバーは、初期化中またはストリームの作成時に DMA チャネルのセットを割り当てます。 新しいストリームの作成時に、ミニポート ドライバーは、ストリームに使用される DMA チャネル オブジェクトをポート ドライバーに通知します。
DMA チャネル オブジェクトは、マスター デバイスまたは下位デバイス用に作成できます。
下位デバイスには DMA ハードウェア機能が組み込まれていないので、システム DMA コントローラーに依存して、デバイスに必要なデータ転送を実行する必要があります。
マスター デバイスは、独自のバス マスタリング DMA ハードウェアを使用して、システム バス上でデータ転送を実行します。
下位 DMA チャネル オブジェクトを使用する WaveCyclic デバイスの例については、以前のバージョンの Microsoft Windows Driver Kit (WDK) の Sb16 サンプル オーディオ ドライバーを参照してください。 マスター DMA チャネル オブジェクトは、ポートとミニポート ドライバーの間で DMA チャネルに関する情報を共有するためのバックボードに過す程度です。 マスター デバイスと下位デバイスの詳細については、「 アダプター オブジェクトの概要」を参照してください。
マスターまたは下位デバイスの DMA チャネル オブジェクトは、次を公開します。
アダプター オブジェクト
ドライバーと DMA ハードウェアが共有できる 1 つの共通バッファー
クエリと変更が可能なバッファー サイズの値
アダプター オブジェクトは、物理デバイス オブジェクト (PDO) の DMA アダプター構造体です。 アダプター オブジェクトは、ミニポート ドライバーは、次のいずれかのメソッドを呼び出すことによって DMA チャネル オブジェクトを作成するときに自動的に作成されます。
IPortWavePci::NewMasterDmaChannel
IPortWaveCyclic::NewMasterDmaChannel
IPortWaveCyclic::NewSlaveDmaChannel
メソッド IDmaChannel::GetAdapterObject を使用して、アダプター オブジェクトへのポインターを取得できます。
アダプター ドライバーは、DMA チャネル オブジェクトを作成する PcNewDmaChannel 関数を呼び出すこともできますが、呼び出し元が明示的にデバイス オブジェクトとその他のコンテキスト情報を指定する必要があるため、この関数は IPortWaveXxx::NewXxxDmaChannel 呼び出しよりも使用が困難です。
下位デバイスの DMA チャネルの場合、IDmaChannel::TransferCount メソッドは、IDmaChannelSlave::Start の呼び出しで指定された最大転送サイズ (MapSize パラメーター) を返します。 また、アダプター オブジェクトには、DMA デバイスを操作およびクエリするためのメソッドがいくつか用意されています。 マスター DMA チャネルでは、これらのメソッドのいずれも意味がありません。
IDmaChannel::AllocateBuffer と IDmaChannel::FreeBuffer は、DMA チャネル オブジェクトに関連付けられている単一の共通バッファーを管理するために使用されます。 オブジェクトによって割り当てられるバッファーは、ドライバー (カーネル仮想メモリ アドレスを使用) と DMA デバイス (物理メモリ アドレスを使用) の両方にアクセス可能であることが保証されます。 さらに、バッファーは物理的に連続します。 通常、最適な方法は、物理的に連続したメモリが最も豊富な場合、ミニポート ドライバーの初期化中に DMA バッファーを割り当てることです。 IDmaChannel::AllocatedBufferSize は、 IDmaChannel::AllocateBuffer の呼び出しで指定されたバッファーのサイズを返します。
IDmaChannel::MaximumBufferSize は、使用できる実際の最大バッファー サイズを示します。 割り当てられたサイズがページ サイズの偶数倍でない場合は、割り当てられたサイズを超える可能性があります。 DMA デバイスが割り当てられたサイズの転送をサポートできない場合は、割り当てられたサイズよりも小さい可能性があります。 IDmaChannel::BufferSize と IDmaChannel::SetBufferSize は、DMA 転送に使用するバッファーのサイズを照会および設定するために使用されます。 バッファーが割り当てられると、バッファー サイズは最大バッファー サイズに設定されます。 初期化後、ポート ドライバーとミニポート ドライバーの両方に、バッファー サイズを変更するか、現在の値を検出する機会があります。 ミニポート ドライバーは、 IDmaChannel::BufferSize の結果を使用して、DMA チャネルが開始されたときに DMA 操作の転送サイズを決定します。 IDmaChannel::SystemAddress と IDmaChannel::P hysicalAddress は、それぞれバッファーの仮想アドレスと物理アドレスを取得するために使用されます。
IDmaChannel::CopyTo と IDmaChannel::CopyFrom は DMA バッファーとの間でサンプル データをコピーします。 WaveCyclic ポート ドライバーは、アプリケーション バッファーとミニポート ドライバーの循環バッファーの間でオーディオ データをコピーするこれらのメソッドを呼び出します。
DMA バッファーは、必ずしもストリーミング データの転送に使用されるとは限りません。 WavePci ポート ドライバーの場合、ストリーミングされたデータは、散布図/収集マッピングの一覧としてミニポート ドライバーに配信されます (または、ミニポート ドライバーから取得されます)。 ただし、ミニポート ドライバーは引き続き、アダプター ドライバーと通信するための共有メモリ領域として DMA バッファーを使用することがあります。
ポート ドライバーは、DMA チャネルの作成に使用できる機能をミニポート ドライバーに提供します。 ポート ドライバーの説明で特に明記されていない限り、ポート ドライバーから割り当てられた DMA オブジェクトを使用する必要はありません。 ポート ドライバーには、必要なメソッドをサポートする IDmaChannel インターフェイスへのポインターが必要です。 ポート ドライバーに必要な DMA チャネル メソッドの一覧については、各ポート ドライバーのドキュメントを確認してください。
通常、最も簡単な方法は、ポート ドライバーが実装する DMA チャネル割り当て関数を使用することです。 まれに、ミニポート ドライバーの開発者は、特定のアダプターの特別な要件を満たすために独自の DMA チャネル オブジェクトを実装する必要があります。 これには、新しいオブジェクトの実装が必要な場合があります。 それ以外の場合は、ミニポート ドライバーのストリーム オブジェクトに IDmaChannel インターフェイスを公開し、DMA チャネル メソッド自体を実装するだけで十分です。
IDmaChannel インターフェイスでは、次のメソッドがサポートされています。
IDmaChannel::AllocatedBufferSize
IDmaChannel::MaximumBufferSize
IDmaChannelSlave インターフェイスは、次のメソッドを追加して IDmaChannel を拡張します。