CBaseReferenceClock クラス
CBaseReferenceClock クラスは基準クロックを実装する。
このクラスは、IReferenceClock インターフェイスをサポートする基準クロックを実装する。ハードウェア デバイスにアクセスするなどして、フィルタがフィルタ グラフに基準クロックを提供できる場合、フィルタはこのクラスを使ってクロックを実装する。
CBaseReferenceClock オブジェクトは、次の 2 つの個別のタイム値を維持する。
- 内部的には、CBaseReferenceClock::GetPrivateTime メソッドが、クロックによって維持されている実際のタイムを返す。
- 外部的には、CBaseReferenceClock::GetTime メソッドが、フィルタ グラフの基準タイムを返す。
内部クロックを短時間逆方向に進めることは有効である。たとえば、クロックが先に進んだ場合、フィルタはクロックを逆方向に調整できる (「CBaseReferenceClock::SetTimeDelta」を参照)。GetTime メソッドは、GetPrivateTime によって報告されたタイム値を使う。しかし、基準タイムは単調増加している。つまり、決して逆方向に進むことはない。そのため、内部クロックが逆方向に進んだ場合、GetTime は内部クロックが追いつくまで古いタイムを報告し続ける。
たとえば、2 つのメソッドが次のシーケンスを返すとする。
GetPrivateTime: 105, 106, 103, 104, 105, 106, 107, 108
GetTime: 105, 106, 106, 106, 106, 106, 107, 108
3 つ目のクロック ティックでは、内部クロックは 103 に戻っている。GetTime メソッドは、内部クロックが追いつくまで、106 を報告し続ける。
デフォルトでは、GetPrivateTime は、timeGetTime 関数の呼び出しによってシステム タイムを返す。外部デバイスから基準クロックを提供しているフィルタは、次のいずれかを行うことができる。
- GetPrivateTime をオーバーライドし、デバイスからのタイムを返す。
- デバイス タイムとシステム タイムの差を監視し、SetTimeDelta を呼び出して訂正する。
このクラスは、CAMSchedule オブジェクトを使ってアドバイズ要求のスケジューリングを行う。詳細については、CAMSchedule クラスのドキュメントを参照すること。
要件
ヘッダー : Refclock.h で宣言し、Streams.h をインクルードする。
ライブラリ : Strmbase.lib (リテール ビルド) または Strmbasd.lib (デバッグ ビルド)。
プロテクト メンバ変数 | |
m_pSchedule | クロックのスケジュール タスクを処理する CAMSchedule オブジェクト。 |
プロテクト メソッド | |
~CBaseReferenceClock | デストラクタ メソッド。 |
パブリック メソッド | |
CBaseReferenceClock | コンストラクタ メソッド。 |
GetPrivateTime | クロックから現在のタイムを取得する。 |
SetTimeDelta | 内部クロック タイムを調整する。 |
GetSchedule | クロックのスケジュール オブジェクトへのポインタを取得する。 |
TriggerThread | スケジューリングを処理するワーカー スレッドを起動する。 |
IReferenceClock メソッド | |
GetTime | 現在の基準タイムを取得する。 |
AdviseTime | 単発のアドバイズ要求を作成する。 |
AdvisePeriodic | 周期的アドバイズ要求を作成する。 |
Unadvise | ペンディング状態のアドバイズ要求を削除する。 |
ヘルパー関数 | |
ConvertToMilliseconds | 基準タイムをミリ秒に変換する。 |