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