次の方法で共有


時計の同期化

ウェーブ シンクの重要なタスクは、基準クロックとサンプル クロックの水晶振動子間の時間ドリフトを解消することです。 これは、フェーズ ロック ループに相当するソフトウェアで行われます。

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

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

ウェーブ シンクは、フェーズロック ループを使用してサンプル時間を調整します。 ドリフトをチェックする際は、読み取り値にいくつかのジッターが含まれているため、ウェーブ シンクは全体量では調整を行いません。 代わりに、サンプル クロックをマスター クロックに向かって隔たりを少しずつ移動します。 このように、ウェーブ シンクはジッター エラーを平滑化しながら、ほぼ同期を保ちます。また、この時間を、マスター クロックと相関関係にある待機時間クロックの時間に変換します。 アプリケーションは、シンセサイザーがどの時点でレンダリングするのかを把握する必要があるため、これは重要です。

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

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

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

IDirectMusicSynthSink::SampleToRefTime と IDirectMusicSynthSink::RefTimeToSample**

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

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

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

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