IReferenceClockTimerControl
COM公式ドキュメント
IReferenceClockTimerControl インターフェイスは、参照クロックが使用するタイマー周期を変更します。このインターフェイスは DirectShow のシステム参照クロックによって公開されます。
解説(Remarks)
既定では、DirectShow のシステム参照クロックはタイマー周期をタイマーが許容する最小値に設定します。通常、この値は 1 ミリ秒です。
タイマー周期は Windows 全体のグローバルな設定です。解像度を高くすると、待機関数のタイムアウト間隔の精度を向上させることができます。ただし、スレッドスケジューラーがタスクをより頻繁に切り替えるようになるため、システム全体のパフォーマンスが低下する可能性もあります。また、高い解像度は CPU の電源管理システムが省電力モードに移行することを妨げる場合もあります。なお、解像度を高く設定しても、高分解能パフォーマンスカウンターの精度は向上しません。
このインターフェイスの主な目的は、参照クロックの既定のタイマー設定をオーバーライドすることです。そのためには、SetDefaultTimerResolution を値 0 で呼び出します。これによりタイマー解像度が低くなり、ユーザーのコンピューターが省電力モードに移行できるようになる場合があります。(実際の動作は、他にどのようなプロセスが実行されているかなど、多くの要因に依存します。)DVD Navigator フィルターは、ここで説明したとおりにこのインターフェイスを使用します。
DirectShow フィルターがより高いタイマー解像度を必要とする場合は、timeBeginPeriod を呼び出してください。通常、この要件が当てはまるのはレンダラーフィルターのみです。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
SetDefaultTimerResolution メソッドは、最小タイマー解像度を設定します。
| timerResolution | LONGLONG | in | 最小タイマー解像度 (100 ナノ秒単位)。値が 0 の場合、参照クロックは以前の要求をキャンセルします。 |
戻り値
HRESULT 値を返します。取り得る値には次のものがあります。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 |
解説(Remarks)
参照クロックは、タイマーの周期を timerResolution に設定しようとします。実際のタイマー周期はハードウェアによって異なる場合があります。タイマー解像度の最小値と最大値を調べるには、timeGetDevCaps 関数を呼び出します。参照クロックは timeBeginPeriod を呼び出してタイマー解像度を設定します。timerResolution が 0 の場合、このメソッドは timeEndPeriod を呼び出して以前のタイマー要求をキャンセルします。(参照クロックが破棄されるときには、以前の要求は自動的にキャンセルされます。)
このメソッドが呼び出されない場合、参照クロックはタイマー解像度を 1 ミリ秒に設定します。電源管理のパフォーマンスを最適にするには、このメソッドを値 0 で呼び出すことをお勧めします。これにより、クロックの既定設定である 1 ミリ秒がオーバーライドされます。グラフ内のいずれかのフィルターがより高いタイマー解像度を必要とする場合は、そのフィルターが個別に timeBeginPeriod を呼び出すことができます。通常、特定のタイマー解像度を必要とするのはレンダラーのみです。
GetDefaultTimerResolution メソッドは、参照クロックが要求したタイマー解像度を返します。
| pTimerResolution | LONGLONG* | out | 要求されたタイマー解像度を 100 ナノ秒単位で受け取ります。 |
戻り値
解説(Remarks)
pTimerResolution で返される値は、参照クロックが基になるタイマーに設定しようとする周期です。実際のタイマー周期はハードウェアによって異なる場合があります。参照クロックが最小タイマー解像度を要求していない場合、pTimerResolution パラメーターは値 0 を受け取ります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IReferenceClockTimerControl "{EBEC459C-2ECA-4D42-A8AF-30DF557614B8}" #usecom global IReferenceClockTimerControl IID_IReferenceClockTimerControl "{}" #comfunc global IReferenceClockTimerControl_SetDefaultTimerResolution 3 int64 #comfunc global IReferenceClockTimerControl_GetDefaultTimerResolution 4 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IReferenceClockTimerControl "{EBEC459C-2ECA-4D42-A8AF-30DF557614B8}" #usecom global IReferenceClockTimerControl IID_IReferenceClockTimerControl "{}" #comfunc global IReferenceClockTimerControl_SetDefaultTimerResolution 3 int64 #comfunc global IReferenceClockTimerControl_GetDefaultTimerResolution 4 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。