WaveRT ミニポート ドライバーの開発

このトピックでは、独自の WaveRT ミニポート ドライバーを開発するときに考慮する必要があるソフトウェアとハードウェア関連のポイントについて説明します。

Microsoft では、ユニバーサル オーディオ アーキテクチャ (UAA) の一連のハードウェア設計ガイドラインを策定しており、このガイドラインには WaveRT オーディオ デバイスに推奨される機能が包含されています。 UAA ガイドラインは、Intel によって開発された高解像度 (HD) オーディオ仕様に密接に基づいています。

Windows Vista 以降の Windows オペレーティング システムでは、UAA に準拠したオーディオ デバイス用の HD オーディオ ドライバーが提供されています。 そのため、使用するオーディオ デバイスが UAA に準拠している場合は、独自の WaveRT ミニポート ドライバーを開発する必要はありません。 ただし、UAA 以外の独自のハードウェア機能を備えているオーディオ デバイスの場合は、独自の機能をサポートするために独自の WaveRT ミニポート ドライバーを開発する必要があります。

独自の WaveRT ミニポート ドライバーを開発する場合は、最初にサンプル アダプター ドライバーを確認してから、WaveRT に対応した UAA 機能を確認することをお勧めします。

サンプル アダプター ドライバー

サンプル ドライバーの詳細については、「サンプル オーディオ ドライバー」を参照してください。

WaveRT に対応した機能

サンプル アダプター ドライバーを確認し、WaveRT ミニポート ドライバーの設計を開始したら、ソフトウェアとハードウェアの次の機能がサポートされていることを確認する必要があります。 これにより、ビルドするミニポート ドライバーが、システム提供の WaveRT ポート ドライバーと Windows Vista オーディオ エンジンの操作モードとの互換性をもつようになります。

  • ハードウェアの低遅延。 WaveRT ミニポート ドライバーは、IMiniportWaveRTStream::GetHWLatency メソッドの完全に機能する実装を提供する必要があります。 このメソッドは、KSPROPERTY_RTAUDIO_HWLATENCY プロパティをサポートするために必要です。

  • FIFO 割り込み。 WaveRT ミニポート ドライバーは、FIFO のオーバーランとアンダーランが発生したときに割り込みを自動的に生成する必要があります。 この機能を使用すると、オーディオ デバイスとドライバー ソフトウェアでテストを実行するときに、オーディオ ストリームの欠陥を検出できます。 ハードウェアのサポート (つまり、FIFO 割り込み) がなければ、欠陥情報を取得するための便利で信頼性の高い手段は存在しません。

  • スキャッター/ギャザー DMA とバッファー ループ。 使用するミニポート ドライバーが、スキャッター/ギャザー機能を持つ DMA コントローラーをサポートしている場合は、ミニポート ドライバーからの介入を必要とすることなく、循環バッファーとの間でデータを移動することができます。

    ミニポート ドライバーがバッファー ループを実行できる DMA コントローラーをサポートしている場合は、DMA コントローラーは、読み取りまたは書き込み操作でバッファーの末尾に到達した後、バッファーの先頭まで自動的にラップすることができます。 ミニポート ドライバーからの介入なしでラップを実行できます。

    WaveRT ポート ドライバーでは、スキャッター/ギャザー転送または自動バッファー ループを実行する機能がない既存のハードウェア設計がサポートされていることに点に留意してください。

    オーディオ デバイスにスキャッター/ギャザー機能がない場合、WaveRT ミニポート ドライバーは、最初にメモリ内で物理的に連続しているページで構成される循環バッファーを割り当てる必要があります。 ミニポート ドライバーは、データ転送と自動バッファー ループを実行する WaveRT ポート ドライバーのヘルパー関数を使用します。 欠点は、システムの非ページ メモリ プールの断片化が進むにつれて、連続した物理メモリの大きなブロックを割り当てる要求が失敗する可能性が高くなることです。 スキャッター/ギャザー機能を備えたデバイスは、メモリの断片化の影響を受けません。

    DMA チャンネルが循環バッファーの末尾に達したときにオーディオ デバイスがバッファー ループを自動的に実行できない場合、WaveRT ミニポート ドライバーが介入し、バッファーの先頭でデータの転送を開始するようにチャンネルを構成する必要があります。

  • 位置レジスタ。 新しい設計の場合、ハードウェア実装者は、各 DMA チャンネルの位置レジスタを含める必要があります。 位置レジスタは、現在のバッファー位置を循環バッファーの先頭からのバイト オフセットとして示します。 位置レジスタの読み取り値は、バッファーの先頭にある 0 です。 位置レジスタが循環バッファーの末尾に達すると、自動的にバッファーの先頭にラップされ (ゼロにリセットされます)、バッファーの位置が進むにつれてインクリメントし続けます。

    位置レジスタは、クライアントがレジスタを直接読み取ることができるように、仮想メモリにマップすることができます。

    位置レジスタは、オーディオ デバイスのデジタルからアナログおよびアナログからデジタルへのコンバーター (DAC および ADC) を通過しているサンプルのバッファー位置を示すのが理想です。

    ただし、この情報は、デジタル機能とアナログ機能を別々のバス コントローラーとエンコーダー/デコーダー (コーデック) チップに分割するオーディオ チップセットからは、直接入手できない場合があります。 通常、位置レジスタはバス コントローラー チップ内にあり、各レジスタは、コントローラーがコーデックに書き込んだり、コーデックから読み取ったりしているオーディオ データの位置を示しています。

    このタイプの位置レジスタから読み取りを取得した後、クライアントはコーデックを介して遅延を加算または減算することで、DAC または ADC を通過するサンプルの現在位置を推定することができます。 クライアントは、KSPROPERTY_RTAUDIO_HWLATENCY プロパティ要求からコーデック遅延を取得します。 このため、WaveRT ミニポート ドライバーは、ポート ドライバーがこの種類のプロパティ要求に応答して IMiniportWaveRTStream::GetHardwareLatency メソッドを呼び出すときにコーデックの遅延を正確に報告する必要があります。

    WaveRT ポート ドライバーでは、位置レジスタがない既存のハードウェア設計がサポートされていることに注意してください。 この制限があるデバイスの場合、WaveRT ミニポート ドライバーは、KSPROPERTY_RTAUDIO_POSITIONREGISTER プロパティ要求をポート ドライバーに強制的に失敗させる STATUS_NOT_SUPPORTED エラーコードを返すことによって、IMiniportWaveRTStream::GetPositionRegister メソッドへの呼び出しに失敗する必要があります。 この場合、クライアントは、KSPROPERTY_AUDIO_POSITION プロパティを使用して現在の位置を取得する必要があり、これにより、位置の読み取りごとにユーザー モードとカーネル モード間の切り替えのオーバーヘッドが発生します。

  • クロック レジスタ。 クロック レジスタは、WaveRT と互換性のあるオーディオ デバイス用の、オプションではあるものの便利なハードウェア機能です。 オーディオ アプリケーション プログラムは、クロック レジスタを使用して、個別の同期されていないハードウェア クロックを持つ 2 つ以上の独立したオーディオ デバイスでオーディオ ストリームを同期できます。 クロック レジスタがないと、アプリケーションはハードウェア クロック間の誤差を検出して補正することができません。

    オーディオ ハードウェアがデジタルからアナログまたはアナログからデジタルへのコンバーターを介してオーディオ データの時間を合わせるために使用するサンプル クロックは、クロック レジスタをインクリメントする内部クロックから派生する必要があります。 サンプル クロックに関して非同期のレートでインクリメントされるクロック レジスタは、同期には使用されないため、公開しないでください。

    位置レジスタと同様に、クライアントがレジスタを直接読み取ることができるように、仮想メモリにクロック レジスタをマップすることができます。

  • オーディオ処理オブジェクト。 適切に設計された WaveRT ミニポート ドライバーは、オーディオ デバイスの循環バッファー内のオーディオ データに決して触れないようにする必要があります。 オーディオ ドライバー ソフトウェアによる介入なしで、オーディオ データがクライアントとオーディオ ハードウェアの間を直接流れるように、ハードウェアを設計する必要があります。

APO は、共有モードのオーディオ ストリームでのみ使用できます。 排他モード ストリームの場合、アプリケーションは循環バッファーを介して WaveRT ハードウェア デバイスと直接データを交換し、その他のコンポーネントはバッファー内のデータに触れることはできません。

詳細については、「Windows オーディオ処理オブジェクト」を参照してください。