次の方法で共有


WaveCyclic レイテンシー

WaveCyclic ミニポート ドライバーがオーディオ再生ストリームのハードウェア ミキシングを提供する場合、DirectSound は、単一の循環バッファー内の DirectSound 波ストリーム全体を含む WaveCyclic ポート ドライバーに IRP を送信します。 WaveCyclic ポート ドライバーは、IRP を受け取り、ドライバーが公開する DMA バッファーにウェーブ データを 1 つずつフィードします。 WaveCyclic は、DMA バッファーの書き込みポインターを読み取りポインターの約 40 ミリ秒前に保持しようとします。 ドライバーが DirectSound とハードウェアの混在を行っている場合でも、DMA バッファーに約 40 ミリ秒の余分なデータが含まれる可能性があります。

WaveCyclic ポート ドライバーが循環バッファーに最大 40 ミリ秒のデータを蓄積しようとするという事実は、WaveCyclic ポート ドライバーがストリームの待機時間に 40 ミリ秒を加算することを意味しません。 実際、ポート ドライバーは待機時間をほとんど追加しません。 新しいストリームの再生が開始される直前に、ポート ドライバーがまだ初期データを循環バッファーの先頭に書き込んでいる間、ポート ドライバーは、これ以上データが使用できないか、バッファーに 40 ミリ秒の完全なデータが含まれるまで書き込みを続行します。 ただし、この量未満のデータがすぐに使用可能な場合、ポート ドライバーはミニポート ドライバーを強制的に待機しません。 代わりに、ミニポート ドライバーが既にバッファーに格納されているデータの再生をすぐに開始できます。 その後、より多くのデータが使用可能になると、ポート ドライバーは、これ以上データが使用できないか、読み取りと書き込みポインターの間でバッファーに格納されたデータの量が 40 ミリ秒に達するまで、バッファーへのデータの書き込みを続行します。

飢餓状態に近い期間を経た後、KMixer ストリームには自然に無音の間隔が含まれることがあります。 WaveCyclic が、DMA バッファー内の 40 ミリ秒の余分なデータではなく 30 ミリ秒を維持するのに十分なウェーブ データのみを KMixer から受信した場合、WaveCyclic は、KMixer からの有効なデータの末尾に続いて DMA バッファーへの無音の書き込みを開始します。 このポリシーにより、不足が発生し、デバイスが有効なデータの末尾を超えて読み取った場合、オーディオ デバイスは古いデータや初期化されていないデータではなく無音状態になります。

DMA バッファーに書き込まれる無音の量はかなり小さく保持され、KMixer が無音が再生される前に WaveCyclic ポート ドライバーに追加のデータを提供することに成功した場合、そのデータはバッファー内の無音を上書きします。 不足が発生しない場合、オーディオ デバイスは、強制無音の間隔なしで、混合データの連続ストリームを受信します。 ドライバーをデバッグしているときに、オーディオレンダラーが枯渇していなくても、ミニポートドライバーの IMiniportWaveCyclicStream::Silence メソッドが呼び出される可能性があります。