次の方法で共有


クロックの同期

ウェーブ シンクの重要なタスクは、基準クロックとサンプル クロッククリスタルの間の時間ドリフトを解決することです。 これは、ソフトウェアと同等のフェーズ ロック ループを使用して行います。

ウェーブ シンクは、次に書き込むことができるバッファー内のサンプル番号を追跡します。 そのため、サンプル 20 など、オンになっていることがわかっていても、基準時間を取得するには、ウェーブ シンクでマスター クロックを確認する必要があります。 約 20 ミリ秒ごとに起動し、マスター クロックに現在の時刻を要求するスレッドがあります。 たとえば、マスター クロックは現在の時刻 (ミリ秒) が 420 であることを報告する場合があります。

また、ウェーブ シンクには待機時間クロックも保持されます。このクロックは、マスター クロックとサンプル時間に従って現在の時刻の間のオフセットを示します。 この情報を使用して、予想されるマスター クロック時間を計算し、これを実際のマスター クロックの読み取りと比較して、2 つのクロックが離れているかどうかを確認します。

ウェーブ シンクは、位相ロック ループを使用してサンプル時間を調整します。 ドリフトを確認する場合、読み取り値にいくつかのジッターが含まれているので、ウェーブシンクは全量では調整されません。 代わりに、サンプル クロックをマスター クロックに向かって距離の一部ずつ移動します。 このように、ウェーブシンクはジッターによるエラーを緩和し、おおよそ同期した状態を維持します。また、この時間を活用して、マスタークロックに対する相対的な遅延クロック時間に変換します。 アプリケーションは、シンセサイザーが任意の時点でレンダリングされている場所を知る必要があるため、これは重要です。

待機時間クロックは、新しいノートを再生するようにスケジュールできる最も早い時刻をアプリケーションに通知します。 待機時間のクロック時間は、マスター クロック時間とシンセサイザーの待機時間を表すオフセットです。 この待機時間は、アプリケーションが再生する新しいノートを送信するまでの最小遅延時間を、シンセサイザーが実際にノートを再生するまでの時間を表します。 アプリケーションは、任意の時点で、現在の待機時間クロック時間より前ではなく、それ以降に再生されるようにメモをスケジュールできます。

たとえば、マスター クロックが現在時刻 420 で、アプリケーションにできるだけ早く再生したいというメモがある場合、待機時間クロックは、ノートを再生できる最も早い時刻を示します。 ソフトウェア シンセサイザーの待機時間が 100 ミリ秒の場合、次回ノートを再生できる時間は 520 です。

イベントが参照時刻の時刻 520 で再生するようにマークされるとします。 シンセサイザーは、ノートをサンプルにレンダリングし、そのすべての計算をサンプル時間で実行することで、その作業を行います。 したがって、520 の基準時間がサンプル時間で何に変換されるかを把握する必要があります。 ユーザー モードでは、ウェーブ シンクは、シンセが使用する 2 つの関数を提供します。

IDirectMusicSynthSink::SampleToRefTime と IDirectMusicSynthSink::RefTimeToSample**

この場合に変換を行うために、シンセはウェーブ シンクで IDirectMusicSynthSink::RefTimeToSample を呼び出します。

その後、ウェーブ シンクによってサンプル時間が返されます (例: 600)。 問題のメモは、サンプル時間 600 でレンダリングされます。 次に、synth IDirectMusicSynth::Render メソッドがウェーブ シンクによって呼び出され、ストリームの次の部分 (サンプル時間 600 から 800 など) をレンダリングすると、ノートはサンプル時刻 600 でバッファーにレンダリングされます。

手記 サンプル時間は、ロールオーバーを回避するために 64 ビット数値として保持されます。 (DWORD 値は 27 時間以内にロールオーバーされます)。

要約すると、シンセはサンプル時間ですべての内部数学を行い、ウェーブシンクは基準時間からサンプル時間への変換を行います。 また、ウェーブ シンクはマスター クロックとの同期を管理し、待機時間情報を提供します。 ウェーブシンクでこの機能を非表示にすると、シンセの書き込みが容易になります。