グラフ クロックの設定
フィルタ グラフを作成するとき、フィルタ グラフ マネージャは自動的にグラフの基準クロックを選択する。グラフのすべてのフィルタは基準クロックに同期される。特に、レンダラ フィルタは基準クロックを使い、各サンプルのプレゼンテーション タイムを調べる。
通常、フィルタ グラフ マネージャによる基準クロックの選択をアプリケーションがオーバーライドする必要はない。しかし、オーバーライドする場合は、フィルタ グラフ マネージャに対して IMediaFilter::SetSyncSource メソッドを呼び出す。このメソッドは、クロックの IReferenceClock インターフェイスへのポインタを受け取る。グラフの停止中にメソッドを呼び出す。次の例はクロックの指定方法を示している。
IGraphBuilder *pGraph = 0;
IReferenceClock *pClock = 0;
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
// グラフを作成する。
pGraph->RenderFile(L"C:\\Example.avi", 0);
// クロックを作成する。
hr = CreateMyPrivateClock(&pClock);
if (SUCCEEDED(hr))
{
// グラフ クロックを設定する。
IMediaFilter *pMediaFilter = 0;
pGraph->QueryInterface(IID_IMediaFilter, (void**)&pMediaFilter);
pMediaFilter->SetSyncSource(pClock);
pClock->Release();
pMediaFilter->Release();
}
この例では、CreateMyPrivateClock がクロックを作成し、IReferenceClock ポインタを返すアプリケーション定義関数であることを仮定している。
また、NULL 値を使って SetSyncSource を呼び出すと、クロックを使わずにフィルタ グラフを実行するように設定できる。クロックがない場合、グラフは可能な限り高速に実行される。クロックがない場合、レンダラ フィルタはサンプルのプレゼンテーション タイムを待機しない。各サンプルは、到着するとすぐにレンダリングされる。データを高速に処理する場合、実時間でプレビューするより、クロックなしでグラフを実行するように設定した方が役立つ。
参照