IReferenceClock
COM公式ドキュメント
IReferenceClock インターフェイスは、フィルターグラフの基準時刻(リファレンスタイム)を提供します。リファレンスクロックとして機能できるフィルターは、このインターフェイスを公開できます。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetTime メソッドは、現在の基準時刻を取得します。
| pTime | LONGLONG* | out | 現在の時刻を 100 ナノ秒単位で受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。取り得る値には次のものが含まれます。
| リターンコード | 説明 |
|---|---|
| NULL ポインター引数です。 | |
| 返される時刻は前回の値と同じです。 | |
| 成功しました。 |
AdviseTime メソッドは、1 回限りの通知(advise)要求を作成します。
| baseTime | LONGLONG | in | 基準時刻。100 ナノ秒単位。「解説」を参照してください。 |
| streamTime | LONGLONG | in | ストリームオフセット時刻。100 ナノ秒単位。「解説」を参照してください。 |
| hEvent | HANDLE | in | 呼び出し側が作成したイベントのハンドル。 |
| pdwAdviseCookie | UINT_PTR* | out | 通知要求の識別子を受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。取り得る値には次のものが含まれます。
| リターンコード | 説明 |
|---|---|
| 成功しました。 | |
| 時刻の値が無効です。 | |
| 失敗しました。 | |
| NULL ポインター引数です。 |
解説(Remarks)
このメソッドは、基準時刻 rtBaseTime + rtStreamTime に対する 1 回限りの通知要求を作成します。この合計は 0 より大きく MAX_TIME より小さくなければなりません。そうでない場合、このメソッドは E_INVALIDARG を返します。要求された時刻になると、クロックは hEvent パラメーターで指定されたイベントをシグナル状態にします。
指定時刻に達する前に通知をキャンセルするには、Unadvise メソッドを呼び出し、この呼び出しで返された pdwAdviseToken の値を渡します。通知が発生した後は、クロックが自動的に通知をクリアするため、Unadvise を呼び出す必要はありません。ただし、呼び出してもエラーにはなりません。
AdvisePeriodic メソッドは、周期的な通知要求を作成します。
| startTime | LONGLONG | in | 最初の通知の時刻。100 ナノ秒単位。0 より大きく MAX_TIME より小さくなければなりません。 |
| periodTime | LONGLONG | in | 通知間の間隔。100 ナノ秒単位。0 より大きくなければなりません。 |
| hSemaphore | HANDLE | in | 呼び出し側が作成したセマフォのハンドル。 |
| pdwAdviseCookie | UINT_PTR* | out | 通知要求の識別子を受け取る変数へのポインター。 |
戻り値
HRESULT 値を返します。取り得る値には次のものが含まれます。
| リターンコード | 説明 |
|---|---|
| 成功しました。 | |
| 時刻の値が無効です。 | |
| 失敗しました。 | |
| NULL ポインター引数です。 |
解説(Remarks)
各通知時刻において、クロックは hSemaphore パラメーターで指定されたセマフォを解放します。これ以上通知が不要になったら、IReferenceClock::Unadvise を呼び出し、この呼び出しで返された pdwAdviseToken の値を渡します。
次のコード例は、作成された時刻から 5 秒後にシグナルを発生させ、その後は 1 秒ごとにシグナルを発生させる通知要求を作成します。
| C++ |
|---|
IReferenceClock *pRefClock = NULL; // IReferenceClock ポインターを取得します(コードは省略)。 |
Unadvise メソッドは、保留中の通知要求を削除します。
| dwAdviseCookie | UINT_PTR | in | 削除する要求の識別子。IReferenceClock::AdviseTime または IReferenceClock::AdvisePeriodic が pdwAdviseToken パラメーターで返した値を使用します。 |
戻り値
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IReferenceClock "{56A86897-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IReferenceClock IID_IReferenceClock "{}" #comfunc global IReferenceClock_GetTime 3 var #comfunc global IReferenceClock_AdviseTime 4 int64,int64,sptr,var #comfunc global IReferenceClock_AdvisePeriodic 5 int64,int64,sptr,var #comfunc global IReferenceClock_Unadvise 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IReferenceClock "{56A86897-0AD4-11CE-B03A-0020AF0BA770}" #usecom global IReferenceClock IID_IReferenceClock "{}" #comfunc global IReferenceClock_GetTime 3 sptr #comfunc global IReferenceClock_AdviseTime 4 int64,int64,sptr,sptr #comfunc global IReferenceClock_AdvisePeriodic 5 int64,int64,sptr,sptr #comfunc global IReferenceClock_Unadvise 6 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。