次の方法で共有


グラフ クロックの設定

フィルタ グラフを作成するとき、フィルタ グラフ マネージャは自動的にグラフの基準クロックを選択する。グラフのすべてのフィルタは基準クロックに同期される。特に、レンダラ フィルタは基準クロックを使い、各サンプルのプレゼンテーション タイムを調べる。

通常、フィルタ グラフ マネージャによる基準クロックの選択をアプリケーションがオーバーライドする必要はない。しかし、オーバーライドする場合は、フィルタ グラフ マネージャに対して 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 を呼び出すと、クロックを使わずにフィルタ グラフを実行するように設定できる。クロックがない場合、グラフは可能な限り高速に実行される。クロックがない場合、レンダラ フィルタはサンプルのプレゼンテーション タイムを待機しない。各サンプルは、到着するとすぐにレンダリングされる。データを高速に処理する場合、実時間でプレビューするより、クロックなしでグラフを実行するように設定した方が役立つ。

参照