Microsoft DirectX 8.0

CBaseReferenceClock クラス

CBaseReferenceClock クラスの階層

宣言 : 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基準タイムをミリ秒に変換する。

CBaseReferenceClock.m_pSchedule

CBaseReferenceClock クラス

クロックのスケジュール タスクを行う CAMSchedule オブジェクト。

構文

CAMSchedule * const m_pSchedule;

CBaseReferenceClock::AdvisePeriodic

CBaseReferenceClock クラス

周期的アドバイズ要求を作成する。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_POINTERNULL ポインタ引数

注意

要求のたびに、クロックは hSemaphore パラメータで指定されたセマフォを解放する。以降の通知が必要ではない場合は、Unadvise を呼び出し、この呼び出しから返された pdwAdviseToken 値を渡す。

CBaseReferenceClock::AdviseTime

CBaseReferenceClock クラス

単発のアドバイズ要求を作成する。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_POINTERNULL ポインタ変数

注意

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

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

CBaseReferenceClock::CBaseReferenceClock

CBaseReferenceClock クラス

コンストラクタ メソッド。

構文

CBaseReferenceClock(
TCHAR *pName,
LPUNKNOWN pUnk,
HRESULT *phr,
CAMSchedule *pSched = NULL
    );

パラメータ

pName
オブジェクトの名前を含む文字列へのポインタ。詳細については、「CBaseObject」を参照すること。
pUnk
委任オブジェクトの IUnknown インターフェイスへのポインタ。
phr
このオブジェクトの所有者へのポインタ。オブジェクトが集成された場合は、集成オブジェクトの IUnknown インターフェイスにポインタを渡す。それ以外の場合は、このパラメータに NULL を設定する。
pSched
CAMSchedule オブジェクトへのポインタ。NULL の場合、このメソッドは新しい CAMSchedule オブジェクトを作成する。

CBaseReferenceClock::~CBaseReferenceClock

CBaseReferenceClock クラス

デストラクタ メソッド。

構文

CBaseReferenceClock(void);

CBaseReferenceClock::GetPrivateTime

CBaseReferenceClock クラス

クロックからリアル タイムを取得する。

構文

virtual REFERENCE_TIME GetPrivateTime(void);

戻り値

現在のクロック タイムを返す (100 ナノ秒単位)。

注意

このメソッドは、クロックによって報告されるリアル タイムを返す。外部の呼び出し元は、このメソッドを呼び出す GetTime メソッドを使用する。GetTime メソッドとは異なり、内部クロックは戻ることが許可される。この場合、GetTime メソッドは、GetPrivateTime メソッドが追いつくまで、最後に報告されたタイムを返し続ける。

CBaseReferenceClock::GetSchedule

CBaseReferenceClock クラス

クロックのスケジュール オブジェクトへのポインタを取得する。

構文

CAMSchedule GetSchedule(void); 

戻り値

m_pSchedule メンバ変数を返す。

CBaseReferenceClock::GetTime

CBaseReferenceClock クラス

現在の基準タイムを取得する。IReferenceClock::GetTime メソッドを実装する。

構文

HRESULT GetTime(
REFERENCE_TIME *pTime
    );

パラメータ

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

戻り値

次の表に示されるいずれかの HRESULT 値を返す。

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

注意

このメソッドは GetPrivateTime を呼び出して、実際のクロック タイムを決定する。クロック タイムが厳密に以前の値よりも大きな場合は、GetTime はそのクロック タイムを使って S_OK を返す。それ以外の場合は、以前の値を使って S_FALSE を返す。そのため、内部クロックは短時間にわたって戻ることができるが、基準タイムが戻ることはない。基準タイムは、内部クロックが追いつくまで同じ値で "ストール" 状態となる。

CBaseReferenceClock::SetTimeDelta

CBaseReferenceClock クラス

内部クロック タイムを調整する。

構文

HRESULT SetTimeDelta(
const REFERENCE_TIME& TimeDelta
    );

パラメータ

TimeDelta
クロック タイムを調整する量 (100 ナノ秒単位)。正の値によってクロックは進み、負の値によってクロックは戻る。

戻り値

S_OK を返す。

注意

派生したクラスは、タイム情報を提供するデバイスからタイムがずれた場合に、このメソッドを使って内部クロックを調整できる。

GetTime メソッドは、減少する値を返すことはない。クロックを戻す調整をした場合、GetTime は、クロックがその値に到達するまで以前の値を返す。

CBaseReferenceClock::TriggerThread

CBaseReferenceClock クラス

スケジューリングを処理するワーカー スレッドを起動できる。

構文

void TriggerThread(void);

戻り値

戻り値なし。

注意

クロックは、適切なときに CAMSchedule::Advise メソッドを呼び出すワーカー スレッドを使用する。派生したクラスは、TriggerThread を呼び出してワーカー スレッドを起動できる。

CBaseReferenceClock::Unadvise

CBaseReferenceClock クラス

保留中のアドバイズ要求を削除する。IReferenceClock::Unadvise メソッドを実装する。

構文

HRESULT Unadvise(
DWORD dwAdviseToken
    );

パラメータ

dwAdviseToken
削除する要求の識別子。AdviseTime メソッドまたは pdwAdviseToken パラメータの AdvisePeriodic メソッドによって返される値を使用する。

戻り値

次の表に示されるいずれかの HRESULT 値を返す。

S_FALSE見つからない。
S_OK成功。

ConvertToMilliseconds Function

CBaseReferenceClock クラス

基準タイムをミリ秒に変換する。

構文

LONGLONG ConvertToMilliseconds(
    const REFERENCE_TIME& RT
);

パラメータ

RT
基準タイム (100 ナノ秒単位)。

戻り値

ミリ秒単位に変換された基準タイムを返す。