Microsoft DirectX 8.0 |
宣言 : Refclock.h
このクラスは、IReferenceClock インターフェイスをサポートする基準クロックを実装する。ハードウェア デバイスにアクセスするなどして、フィルタがフィルタ グラフに基準クロックを提供できる場合、フィルタはこのクラスを使ってクロックを実装する。
CBaseReferenceClock オブジェクトは、次の 2 つの個別のタイム値を維持する。
内部クロックが短時間にわたって戻ることは有効である。たとえば、クロックが進んだ場合、フィルタは逆方向に調整できる。詳細については、「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 を報告し続ける。
デフォルトでは、timeGetTime 関数の呼び出しによって、GetPrivateTime はシステム タイムを返す。外部デバイスから基準クロックを提供しているフィルタは、次のいずれかを行うことができる。
このクラスは、CAMSchedule オブジェクトを使ってアドバイズ要求のスケジューリングを行う。詳細については、CAMSchedule クラスのドキュメントを参照すること。
プロテクト メンバ変数 | |
---|---|
m_pSchedule | クロックのスケジュール タスクを処理する CAMSchedule オブジェクト。 |
プロテクト メソッド | |
~CBaseReferenceClock | デストラクタ メソッド。 |
Public メソッド | |
CBaseReferenceClock | コンストラクタ メソッド。 |
GetPrivateTime | クロックから現在のタイムを取得する。 |
SetTimeDelta | 内部クロック タイムを調整する。 |
GetSchedule | クロックのスケジュール オブジェクトへのポインタを取得する。 |
TriggerThread | スケジューリングを処理するワーカー スレッドを起動する。 |
IReferenceClock メソッド | |
GetTime | 現在の基準タイムを取得する。 |
AdviseTime | 単発のアドバイズ要求を作成する。 |
AdvisePeriodic | 周期的アドバイズ要求を作成する。 |
Unadvise | 保留中のアドバイズ要求を削除する。 |
ヘルパー関数 | |
ConvertToMilliseconds | 基準タイムをミリ秒に変換する。 |
クロックのスケジュール タスクを行う CAMSchedule オブジェクト。
構文
CAMSchedule * const m_pSchedule;
周期的アドバイズ要求を作成する。IReferenceClock::AdvisePeriodic メソッドを実装する。
構文
HRESULT AdvisePeriodic( REFERENCE_TIME StartTime, REFERENCE_TIME PeriodTime, HSEMAPHORE hSemaphore, DWORD *pdwAdviseToken );
パラメータ
- StartTime
- 最初の通知のタイム (100 ナノ秒単位)。ゼロ以上、MAX_TIME 以下でなくてはならない。
- PeriodTime
- 通知の間隔 (100 ナノ秒単位)。ゼロ以上でなくてはならない。
- hSemaphore
- セマフォへのハンドル。呼び出し元によって作成される。
- pdwAdviseToken
- アドバイズ要求の識別子を受け取る変数へのポインタ。
戻り値
次の表に示されるいずれかの HRESULT 値を返す。
S_OK | 成功 |
E_INVALIDARG | 無効なタイム値 |
E_OUTOFMEMORY | 失敗 |
E_POINTER | NULL ポインタ引数 |
注意
要求のたびに、クロックは hSemaphore パラメータで指定されたセマフォを解放する。以降の通知が必要ではない場合は、Unadvise を呼び出し、この呼び出しから返された pdwAdviseToken 値を渡す。
単発のアドバイズ要求を作成する。IReferenceClock::AdviseTime メソッドを実装する。
構文
HRESULT AdviseTime( REFERENCE_TIME baseTime, REFERENCE_TIME streamTime, HEVENT hEvent, DWORD *pdwAdviseToken );
パラメータ
- baseTime
- 基準タイム (100 ナノ秒単位)。
- streamTime
- ストリーム オフセット タイム (100 ナノ秒単位)。
- hEvent
- イベントへのハンドル。呼び出し元によって作成される。
- pdwAdviseToken
- アドバイズ要求の識別子を受け取る変数へのポインタ。
戻り値
次の表に示されるいずれかの HRESULT 値を返す。
S_OK 成功 E_INVALIDARG 無効なタイム値 E_OUTOFMEMORY 失敗 E_POINTER NULL ポインタ変数
注意
このメソッドは、基準タイム baseTime + streamTime の単発のアドバイズ要求を作成する。この合計は、ゼロ以上、MAX_TIME 以下でなくてはならない。それ以外の場合、E_INVALIDARG を返す。要求のたびに、クロックは hEvent パラメータで指定されるイベントに通知する。
指定したタイムになる前に通知を取り消すには、Unadvise メソッドを呼び出して、この呼び出しから返された pdwAdviseToken の値を渡す。通知の発生後、クロックは自動的に通知を取り消すので、Unadvise を呼び出す必要はない。ただし、呼び出しても間違いではない。
コンストラクタ メソッド。
構文
CBaseReferenceClock( TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr, CAMSchedule *pSched = NULL );
パラメータ
- pName
- オブジェクトの名前を含む文字列へのポインタ。詳細については、「CBaseObject」を参照すること。
- pUnk
- 委任オブジェクトの IUnknown インターフェイスへのポインタ。
- phr
- このオブジェクトの所有者へのポインタ。オブジェクトが集成された場合は、集成オブジェクトの IUnknown インターフェイスにポインタを渡す。それ以外の場合は、このパラメータに NULL を設定する。
- pSched
- CAMSchedule オブジェクトへのポインタ。NULL の場合、このメソッドは新しい CAMSchedule オブジェクトを作成する。
デストラクタ メソッド。
構文
CBaseReferenceClock(void);
クロックからリアル タイムを取得する。
構文
virtual REFERENCE_TIME GetPrivateTime(void);
戻り値
現在のクロック タイムを返す (100 ナノ秒単位)。
注意
このメソッドは、クロックによって報告されるリアル タイムを返す。外部の呼び出し元は、このメソッドを呼び出す GetTime メソッドを使用する。GetTime メソッドとは異なり、内部クロックは戻ることが許可される。この場合、GetTime メソッドは、GetPrivateTime メソッドが追いつくまで、最後に報告されたタイムを返し続ける。
クロックのスケジュール オブジェクトへのポインタを取得する。
構文
CAMSchedule GetSchedule(void);
戻り値
m_pSchedule メンバ変数を返す。
現在の基準タイムを取得する。IReferenceClock::GetTime メソッドを実装する。
構文
HRESULT GetTime( REFERENCE_TIME *pTime );
パラメータ
- pTime
- 現在のタイムを受け取る変数へのポインタ (100 ナノ秒単位)。
戻り値
次の表に示されるいずれかの HRESULT 値を返す。
E_POINTER NULL ポインタ変数。 S_FALSE 返されたタイムは、以前の値と同じである。 S_OK 成功。
注意
このメソッドは GetPrivateTime を呼び出して、実際のクロック タイムを決定する。クロック タイムが厳密に以前の値よりも大きな場合は、GetTime はそのクロック タイムを使って S_OK を返す。それ以外の場合は、以前の値を使って S_FALSE を返す。そのため、内部クロックは短時間にわたって戻ることができるが、基準タイムが戻ることはない。基準タイムは、内部クロックが追いつくまで同じ値で "ストール" 状態となる。
内部クロック タイムを調整する。
構文
HRESULT SetTimeDelta( const REFERENCE_TIME& TimeDelta );
パラメータ
- TimeDelta
- クロック タイムを調整する量 (100 ナノ秒単位)。正の値によってクロックは進み、負の値によってクロックは戻る。
戻り値
S_OK を返す。
注意
派生したクラスは、タイム情報を提供するデバイスからタイムがずれた場合に、このメソッドを使って内部クロックを調整できる。
GetTime メソッドは、減少する値を返すことはない。クロックを戻す調整をした場合、GetTime は、クロックがその値に到達するまで以前の値を返す。
スケジューリングを処理するワーカー スレッドを起動できる。
構文
void TriggerThread(void);
戻り値
戻り値なし。
注意
クロックは、適切なときに CAMSchedule::Advise メソッドを呼び出すワーカー スレッドを使用する。派生したクラスは、TriggerThread を呼び出してワーカー スレッドを起動できる。
保留中のアドバイズ要求を削除する。IReferenceClock::Unadvise メソッドを実装する。
構文
HRESULT Unadvise( DWORD dwAdviseToken );
パラメータ
- dwAdviseToken
- 削除する要求の識別子。AdviseTime メソッドまたは pdwAdviseToken パラメータの AdvisePeriodic メソッドによって返される値を使用する。
戻り値
次の表に示されるいずれかの HRESULT 値を返す。
S_FALSE 見つからない。 S_OK 成功。
基準タイムをミリ秒に変換する。
構文
LONGLONG ConvertToMilliseconds( const REFERENCE_TIME& RT );
パラメータ
- RT
- 基準タイム (100 ナノ秒単位)。
戻り値
ミリ秒単位に変換された基準タイムを返す。