IMFClockStateSink
COM公式ドキュメント
プレゼンテーションクロックから状態変更通知を受け取ります。
解説(Remarks)
プレゼンテーションクロックから状態変更通知を受け取るには、このインターフェイスを実装し、プレゼンテーションクロックに対して IMFPresentationClock::AddClockStateSink を呼び出します。
このインターフェイスは、以下のオブジェクトで実装する必要があります。
- プレゼンテーションタイムソース。プレゼンテーションクロックは、このインターフェイスを使用してタイムソースに状態変更を要求します。
- メディアシンク。メディアシンクは、このインターフェイスを使用して、プレゼンテーションクロックが変化したときに通知を受け取ります。
メソッド 5
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
プレゼンテーションクロックが開始したときに呼び出されます。
| hnsSystemTime | LONGLONG | in | クロックが開始したときのシステム時刻(100ナノ秒単位)。 |
| llClockStartOffset | LONGLONG | in | クロックの新しい開始時刻(100ナノ秒単位)。このパラメーターには PRESENTATION_CURRENT_POSITION を指定することもでき、その場合はクロックが現在の位置から開始または再開したことを示します。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、プレゼンテーションクロックの IMFPresentationClock::Start メソッドが呼び出されたときに呼び出されますが、次の例外があります。クロックが一時停止しており、値 PRESENTATION_CURRENT_POSITION を指定して Start が呼び出された場合は、OnClockStart の代わりに IMFClockStateSink::OnClockRestart が呼び出されます。
クロックは、タイムソースの OnClockStart メソッドを呼び出すことで、プレゼンテーションタイムソースに通知します。この呼び出しは Start メソッド内で同期的に行われます。タイムソースが OnClockStart からエラーを返した場合、プレゼンテーションクロックの Start メソッドはエラーを返し、状態変更は行われません。
プレゼンテーションタイムソース以外のオブジェクトの場合、OnClockStart メソッドは状態変更が完了した後に非同期で呼び出されます。この場合、このメソッドの戻り値は無視されます。
llClockStartOffset で指定される値はクロックが開始するときのプレゼンテーション時刻であり、プレゼンテーションの開始からの相対値です。メディアシンクは、llClockStartOffSet より前のプレゼンテーション時刻を持つデータをレンダリングしてはなりません。サンプルがオフセットをまたぐ場合、つまりオフセットがサンプルの開始時刻と終了時刻の間にある場合、シンクは llClockStartOffset 以降のデータのみがレンダリングされるようにサンプルをトリミングするか、単にサンプルを破棄する必要があります。
プレゼンテーションクロックが停止したときに呼び出されます。
| hnsSystemTime | LONGLONG | in | クロックが停止したときのシステム時刻(100ナノ秒単位)。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表に示すものが含まれますが、これらに限定されません。
| 戻りコード | 説明 |
|---|---|
| メソッドが成功しました。 | |
| 非推奨。このエラーコードは使用しないでください。 |
解説(Remarks)
プレゼンテーションクロックの IMFPresentationClock::Stop メソッドが呼び出されると、クロックはプレゼンテーションタイムソースの OnClockStop メソッドを呼び出すことで、プレゼンテーションタイムソースに通知します。この呼び出しは Stop メソッド内で同期的に行われます。タイムソースが OnClockStop からエラーを返した場合、プレゼンテーションクロックの Stop メソッドはエラーを返し、状態変更は行われません。
プレゼンテーションタイムソース以外のオブジェクトの場合、OnClockStop メソッドは状態変更が完了した後に非同期で呼び出されます。
オブジェクトがすでに停止している場合は、OnClockStop から S_OK を返す必要があります。エラーコードを返してはなりません。
プレゼンテーションクロックが一時停止したときに呼び出されます。
| hnsSystemTime | LONGLONG | in | クロックが一時停止したときのシステム時刻(100ナノ秒単位)。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
プレゼンテーションクロックの IMFPresentationClock::Pause メソッドが呼び出されると、クロックはタイムソースの OnClockPause メソッドを呼び出すことで、プレゼンテーションタイムソースに通知します。この呼び出しは Pause メソッド内で同期的に行われます。タイムソースが OnClockPause からエラーを返した場合、プレゼンテーションクロックの Pause メソッドはエラーを返し、状態変更は行われません。
プレゼンテーションタイムソース以外のオブジェクトの場合、OnClockPause メソッドは状態変更が完了した後に非同期で呼び出されます。この場合、このメソッドの戻り値は無視されます。
プレゼンテーションクロックが一時停止中に同じ位置から再開したときに呼び出されます。
| hnsSystemTime | LONGLONG | in | クロックが再開したときのシステム時刻(100ナノ秒単位)。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このメソッドは、プレゼンテーションクロックが一時停止しており、値 PRESENTATION_CURRENT_POSITION を指定して IMFPresentationClock::Start メソッドが呼び出された場合に呼び出されます。
クロックは、タイムソースの OnClockRestart メソッドを呼び出すことで、プレゼンテーションタイムソースに通知します。この呼び出しは Start メソッド内で同期的に行われます。タイムソースが OnClockRestart からエラーを返した場合、プレゼンテーションクロックの Start メソッドはエラーを返し、状態変更は行われません。
プレゼンテーションタイムソース以外のオブジェクトの場合、OnClockRestart メソッドは状態変更が完了した後に非同期で呼び出されます。この場合、このメソッドの戻り値は無視されます。
プレゼンテーションクロックのレートが変更されたときに呼び出されます。
| hnsSystemTime | LONGLONG | in | レートが設定されたときのシステム時刻(100ナノ秒単位)。 |
| flRate | FLOAT | in | 新しいレート(通常の再生レートに対する倍率)。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
プレゼンテーションクロックの IMFRateControl::SetRate メソッドが呼び出されると、クロックはタイムソースの OnClockSetRate メソッドを呼び出すことで、プレゼンテーションタイムソースに通知します。この呼び出しは SetRate メソッド内で同期的に行われます。タイムソースが OnClockSetRate からエラーを返した場合、プレゼンテーションクロックの SetRate メソッドはエラーを返し、状態変更は行われません。
プレゼンテーションタイムソース以外のオブジェクトの場合、OnClockSetRate メソッドは状態変更が完了した後に非同期で呼び出されます。この場合、このメソッドの戻り値は無視されます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFClockStateSink "{F6696E82-74F7-4F3D-A178-8A5E09C3659F}"
#usecom global IMFClockStateSink IID_IMFClockStateSink "{}"
#comfunc global IMFClockStateSink_OnClockStart 3 int64,int64
#comfunc global IMFClockStateSink_OnClockStop 4 int64
#comfunc global IMFClockStateSink_OnClockPause 5 int64
#comfunc global IMFClockStateSink_OnClockRestart 6 int64
#comfunc global IMFClockStateSink_OnClockSetRate 7 int64,float
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。