遅延の時計
シンセサイザー ミニポート ドライバー モデルは、複数のデバイス間でオーディオ出力の同期を許可するように設計されています。 そのため、純粋な UART デバイスによって提供されるタイミング モデルよりも複雑なタイミング モデルが含まれています。
イベントは、関連付けられたタイム スタンプを使用してミニポート ドライバーに配信 (およびキャプチャ) されます。 このタイムスタンプは マスタークロックを基準としています。 マスター クロックは、システム全体のすべてのシーケンス処理で使用されるのと同じクロックです。 マスター クロック時間は、100 ナノ秒ティック単位で測定されます。
ミニポート ドライバーは、IMasterClock::GetTime を呼び出 すことによって、マスター クロックから現在の時刻を取得します。 ピンの作成時に、ポート ドライバーはカーネル モードの IMasterClock インターフェイスを IMiniportDMus::NewStream メソッドへの入力パラメーターの 1 つとしてミニポート ドライバーに渡します。 現在、マスター クロックはシステムのリアルタイム クロックをラップします。 マスター クロックは、run 状態にする必要があるピンがある場合、決して変化しません。 一時停止しない一定レートクロックです。
すべてのレンダリング デバイスには、イベントを受け入れる時間からイベントを受信できる時間までの間に、ある程度の待機時間があります。 この待機時間は一定または可変にすることができます (ソフトウェア シンセサイザーの場合と同様に、待機時間はオーディオ バッファーの現在の再生位置に依存します)。 この待機時間は、次の方法で補正されます。
DMus ミニポート ドライバーは、デバイスの待機時間にもかかわらず、時間に再生できるように十分に事前にイベントを受信できるようにします。 イベントは、DMus ポート ドライバーのシーケンサー エンジンによってミニポート ドライバーのシーケンス処理されます。
ピンの作成時に、ポート ドライバーは、ミニポート ドライバーのデルタ時間を 100 ナノ秒単位で照会します。 このデルタ時間は、ミニポート ドライバーがイベントを受信する各イベントのプレゼンテーション時間のどのくらい前です。 ポート ドライバーは、この先にイベントを配信するためのベスト エフォートを行います。 このデルタに非常に大きな値を指定すると (IMiniportDMus::NewStream の SchedulePreFetch ポート ドライバーは、イベントがユーザー モードからポート ドライバーに配信されるとすぐに、イベントをミニポート ドライバーに渡します。
イベントのスケジュールをどの程度進めるかをアプリケーションに通知する。 この場合、最大待機時間を使用することは望ましくありません。 イベントは一度送信した後はキャンセルできないため、イベントをプレゼンテーション時間に近づければ近いほど、アプリケーションとシンセが対話する応答性が高くなります。 この要件を処理するために、DirectMusic では待機時間クロックの概念が導入されています。
待ち時間クロックは、イベントを再生するようにスケジュールでき、まだ時間どおり再生できる最も近い時間を提供します。 つまり、アプリケーションが待機時間クロックに従って現在の時刻より前に再生されるイベントをスケジュールすると、イベントは遅延再生されます。 シンセサイザー ミニポート ドライバーは、KSPROPERTY_SYNTH_LATENCYCLOCK プロパティ項目に応答して待機時間のクロックを提供します。
ミニポート ドライバーは、KSPROPSETID_Synth およびKSPROPERTY_SYNTH_LATENCYCLOCKに対して照会されます。 ミニポート ドライバーのプロパティ ハンドラーは、マスター クロックの観点から、次にそのデータを時間にレンダリングできる時間を指定する待機時間クロックを返す必要があります。 たとえば、マスター クロックが現在 50 を読み取り、現在 25 単位の待機時間がある場合、待機時間クロックは 75 を読み取ります。 この方法でクロックが実装される理由は、待機時間を一定にする必要がないためです。また、返される値は差分よりもアプリケーションに対してより多く使用されるためです。