基準クロック
フィルタ グラフ マネージャの機能の 1 つとして、グラフ内のすべてのフィルタの同期があり、これを "基準クロック" と呼ぶ。
IReferenceClock インターフェイスを公開するすべてのオブジェクトは基準クロックとして機能する。基準クロックは、DirectShow フィルタ (通常はハードウェア タイマにアクセスできるオーディオ レンダラ) が提供することもできる。予備として、フィルタ グラフ マネージャはシステム タイムを使える。
基準クロックは、名目上 100 ナノ秒間隔で時間を測定することになっているが、実際のクロックの精度はこれよりも低い場合がある。クロックの現在のタイムを取得するには、IReferenceClock::GetTime メソッドを呼び出す。クロックの基準、つまりカウントを開始するタイムは、実装に依存するので、GetTime から返される値は本質的に意味のあるものではない。重要なのは、グラフの実行が開始されてからのデルタ値である。
基準クロックの精度はさまざまであるが、GetTime メソッドが返すタイムは単調に増加することが保証されている。つまり、クロック タイムが逆戻りすることはない。基準クロックがハードウェア ソースからクロック タイムを生成しており、ハードウェア クロックが逆戻りした場合 (たとえば、クロックの調整など)、GetTime メソッドはハードウェア クロックが追いつくまで、最後にレポートされたタイムを返し続けるべきである。詳細については、「CBaseReferenceClock Class」を参照すること。
デフォルトの基準クロック
フィルタ グラフ マネージャは、グラフを実行しているときに、自動的に基準クロックを選択する。クロックを選択するために、次のようなアルゴリズムを使う。
- アプリケーションがクロックを選択している場合 (後述) は、そのクロックを使う。
- グラフに IReferenceClock をサポートするライブ ソース フィルタが含まれている場合は、そのフィルタを使う。ライブ ソースの定義については、「ライブ ソース」を参照すること。
- グラフがライブ ソース フィルタを含んで "いない" 場合は、レンダラから順にアップストリームに向かって、IReferenceClock をサポートするグラフ内の任意のフィルタを使う。接続されていないフィルタよりも接続されているフィルタを優先する。グラフがオーディオ ストリームをレンダリングしている場合は、アルゴリズムのこの手順で通常オーディオ レンダリング フィルタが選択される。
- フィルタが適切なクロックを提供しない場合は、システム タイムに基づくシステム基準クロックを使う。
基準クロックの設定
アプリケーションは、フィルタ グラフ マネージャで IMediaFilter::SetSyncSource メソッドを呼び出して、クロックを選択できる。この操作は、別のクロックを使う明確な理由がある場合にのみ行うべきである。
NULL 値を指定して SetSyncSource を呼び出すことによって、フィルタ グラフ マネージャが基準クロックを使わないように指示できる。たとえば、サンプルをできる限り高速に処理しなければならないような場合である。デフォルトの基準クロックを復元するには、フィルタ グラフ マネージャで IFilterGraph::SetDefaultSyncSource メソッドを呼び出す。
基準クロックが変更されるたびに、フィルタ グラフ マネージャは IMediaFilter::SetSyncSource メソッドを呼び出して各フィルタに通知する。アプリケーションはフィルタでこのメソッドを呼び出してはならない。
参照