Microsoft DirectX 8.0

IReferenceClock インターフェイス

フィルタ グラフに基準タイムを提供する。

基準クロックとしての機能を持つフィルタは、このインターフェイスを公開できる。このインターフェイスは、システム基準クロックでも公開される。フィルタ グラフ マネージャは、このインターフェイスを使用してフィルタ グラフの同期をとる。アプリケーションでは、このインターフェイスを使用して、現在の基準タイムを取得したり、経過時間の通知を要求したりできる。

詳細については、「DirectShow のタイムとクロック」を参照すること。

フィルタ開発者へ : 信頼性の高いクロック タイムを生成するフィルタを開発するには、このインターフェイスを実装すること。たとえば、サウンド ボードには基準クロックが付いていることが多いので、オーディオ レンダリング フィルタはこのインターフェイスを実装する。このインターフェイスを実装するには、CBaseReferenceClock クラスを使用すること。

非レンダリング フィルタがフィルタグラフマネージャから参照クロックとして選択されるチャンスを増やすには、以下のステップ :

  1. そのフィルタ内で IReferenceClock を実装する。
  2. そのフィルタ内で IAMFilterMiscFlags を実装する。
  3. IAMFilterMiscFlags::GetMiscFlags から AM_FILTER_MISC_FLAGS_IS_SOURCE を返す。
  4. すべての出力ピンで IAMPushSource を実装する。
  5. IAMPushSource::GetPushSourceFlags から (* pFlags) = 0 を返す。
  6. すべての他の IAMPushSource メソッドから E_NOTIMPL を返す。

vtable 順のメソッド

IUnknown メソッド説明
QueryInterface サポートされているインターフェイスへのポインタを返す。
AddRef 参照カウントをインクリメントする。
Release 参照カウントをデクリメントする。
IReferenceClock メソッド説明
GetTime 現在の基準タイムを取得する。
AdviseTime 単発のアドバイズ要求を作成する。
AdvisePeriodic 周期的なアドバイズ要求を作成する。
Unadvise 保留中のアドバイズ要求を削除する。

IReferenceClock::AdvisePeriodic

IReferenceClock インターフェイス

周期的なアドバイズ要求を作成する。

構文

HRESULT AdvisePeriodic(
    REFERENCE_TIME rtStartTime,
    REFERENCE_TIME rtPeriodTime,
    HSEMAPHORE hSemaphore,
    DWORD *pdwAdviseCookie
);

パラメータ

rtStartTime
[in] 最初の通知のタイム (100 ナノ秒単位)。ゼロ以上、MAX_TIME 以下でなくてはならない。
rtPeriodTime
[in] 通知の間のタイム (100 ナノ秒単位)。ゼロ以上でなくてはならない。
hSemaphore
[in] 呼び出し元によって作成されるセマフォのハンドル。
pdwAdviseCookie
[out] このアドバイズ要求の識別子を受け取る変数へのポインタ。

戻り値

HRESULT 値を返す。次の可能な値がある。

S_OK成功。
E_INVALIDARG無効なタイム値。
E_OUTOFMEMORY失敗。
E_POINTERNULL ポインタ引数。

注意

クロックは、通知のたびに hSemaphore パラメータで指定されたセマフォを解放する。それ以上通知が不要になった場合は Unadvise を呼び出し、この呼び出しによって返された pdwAdviseToken 値を渡す。

次のサンプル コードでは、作成後 5 秒、およびそれ以降の 2 秒ごとに通知されるアドバイズ要求を作成している。

IReferenceClock *pRefClock = NULL;
// IReferenceClock ポインタを取得する (示されない)。

DWORD          dwAdviseToken;
HANDLE         hSemaphore = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL);
REFERENCE_TIME rtPeriodTime = 10000000; // A one-second interval
REFERENCE_TIME rtNow;

pRefClock->GetTime(&rtNow);
pRefClock->AdvisePeriodic(rtNow + (5 * rtPeriodTime),
                          rtPeriodTime, 
                          hSemaphore, 
                          &dwAdviseToken);
...

pRefClock->Unadvise(dwAdviseToken);

IReferenceClock::AdviseTime

IReferenceClock インターフェイス

単発のアドバイズ要求を作成する。

構文

    HRESULT AdviseTime(
    REFERENCE_TIME rtBaseTime,
    REFERENCE_TIME rtStreamTime,
    HEVENT hEvent,
    DWORD *pdwAdviseCookie
);

パラメータ

rtBaseTime
[in] 基本となる基準タイム (100 ナノ秒単位)。「注意」を参照すること。
rtStreamTime
[in] ストリーム オフセット タイム (100 ナノ秒単位)。「注意」を参照すること。
hEvent
[in] 呼び出し元によって作成されるイベントへのハンドル。
pdwAdviseCookie
[out] アドバイズ要求の識別子を受け取る変数へのポインタ。

戻り値

HRESULT 値を返す。次の可能な値がある。

S_OK成功。
E_INVALIDARG無効なタイム値。
E_OUTOFMEMORY失敗。
E_POINTERNULL ポインタ引数。

注意

このメソッドは、基準タイム baseTime + streamTime に対して単発のアドバイズ要求を作成する。その合計は、ゼロ以上、MAX_TIME 以下でなくてはならない。これ以外の場合は、E_INVALIDARG を返す。クロックは、要求されたタイムに、hEvent パラメータで指定されたイベントを通知する。

タイムに到達する前に通知を取り消すには、Unadvise メソッドを呼び出し、呼び出しによって返された pdwAdviseToken 値を渡す。通知の発生後、クロックは自動的に通知を消去するので、Unadvise を呼び出す必要はない。ただし、呼び出しても間違いではない。

IReferenceClock::GetTime

IReferenceClock インターフェイス

現在の時間を取得する。

構文

HRESULT GetTime(
    REFERENCE_TIME *pTime
);

パラメータ

pTime
[out] 現在の時間を受け取る変数へのポインタ (100 ナノ秒単位)。

戻り値

HRESULT 値を返す。次の可能な値がある。

POINTERNULL ポインタ引数。
S_FALSE 返されたタイムは、前の値と同じである。
S_OK成功。

IReferenceClock::Unadvise

IReferenceClock インターフェイス

保留中のアドバイズ要求を削除する。

構文

HRESULT Unadvise(
    DWORD dwAdviseCookie
);

パラメータ

dwAdviseCookie
[in] 削除する要求の識別子。AdviseTime、または pdwAdviseToken パラメータの AdvisePeriodic から返された値を使用する。

戻り値

HRESULT 値を返す。次の可能な値がある。
S_FALSE見つからなかった。
S_OK成功。