IMFPMediaPlayerCallback
COM公式ドキュメント
IMFPMediaPlayer インターフェイス用のコールバック インターフェイスです。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
再生イベントをアプリケーションに通知するために、MFPlay プレーヤー オブジェクトによって呼び出されます。
| pEventHeader | MFP_EVENT_HEADER* | in | イベントに関する情報を格納する MFP_EVENT_HEADER 構造体へのポインターです。 |
解説(Remarks)
再生イベントの具体的な種類は、MFP_EVENT_HEADER 構造体の eEventType メンバーで指定されます。この構造体には、すべてのイベント種類に共通する情報が含まれています。一部のイベント種類では拡張構造体が使用されます。pEventHeader ポインターを正しい構造体型にキャストするための一連のマクロが定義されています。詳細については、MFP_EVENT_TYPE を参照してください。
OnMediaPlayer メソッド内で IMFPMediaPlayer および IMFPMediaItem のメソッドを呼び出しても安全です。MFPlay は OnMediaPlayer メソッドに再入しないことが保証されています。つまり、OnMediaPlayer の呼び出しはシリアル化されており、OnMediaPlayer の内部からこのメソッドが再度呼び出されることはありません。
例
次のコードは、pEventHeader パラメーターを正しい構造体型にキャストし、その構造体ポインターをハンドラー関数に渡す方法を示しています。ハンドラー関数は例の冒頭で宣言されています。アプリケーション側でこれらの関数の実装を用意する必要があります。すべてのイベントを処理する必要はない点に注意してください。たとえば、アプリケーションが IMFPMediaPlayer::SetRate を一度も呼び出さない場合、MFP_EVENT_TYPE_RATE_SET イベントを処理する必要はありません。その場合は、switch ステートメントから MFP_EVENT_TYPE_RATE_SET を省略するだけで済みます。
// Declarations of MFPlay event handler functions.
void OnPlay(MFP_PLAY_EVENT *pEvent);
void OnPause(MFP_PAUSE_EVENT *pEvent);
void OnStop(MFP_STOP_EVENT *pEvent);
void OnPositionSet(MFP_POSITION_SET_EVENT *pEvent);
void OnRateSet(MFP_RATE_SET_EVENT *pEvent);
void OnMediaItemCreated(MFP_MEDIAITEM_CREATED_EVENT *pEvent);
void OnMediaItemSet(MFP_MEDIAITEM_SET_EVENT *pEvent);
void OnFrameStep(MFP_FRAME_STEP_EVENT *pEvent);
void OnMediaItemCleared(MFP_MEDIAITEM_CLEARED_EVENT *pEvent);
void OnMFEvent(MFP_MF_EVENT *pEvent);
void OnError(MFP_ERROR_EVENT *pEvent);
void OnPlaybackEnded(MFP_PLAYBACK_ENDED_EVENT *pEvent);
void OnAquireUserCredential(MFP_ACQUIRE_USER_CREDENTIAL_EVENT *pEvent);
// Implementation of IMFPMediaPlayerCallback::OnMediaPlayerEvent
void STDMETHODCALLTYPE PlayerCallback::OnMediaPlayerEvent(MFP_EVENT_HEADER * pEventHeader)
{
switch (pEventHeader->eEventType)
{
case MFP_EVENT_TYPE_PLAY:
OnPlay(MFP_GET_PLAY_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_PAUSE:
OnPause(MFP_GET_PAUSE_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_STOP:
OnStop(MFP_GET_STOP_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_POSITION_SET:
OnPositionSet(MFP_GET_POSITION_SET_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_RATE_SET:
OnRateSet(MFP_GET_RATE_SET_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_MEDIAITEM_CREATED:
OnMediaItemCreated(MFP_GET_MEDIAITEM_CREATED_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_MEDIAITEM_SET:
OnMediaItemSet(MFP_GET_MEDIAITEM_SET_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_FRAME_STEP:
OnFrameStep(MFP_GET_FRAME_STEP_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_MEDIAITEM_CLEARED:
OnMediaItemCleared(MFP_GET_MEDIAITEM_CLEARED_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_MF:
OnMFEvent(MFP_GET_MF_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_ERROR:
OnError(MFP_GET_ERROR_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_PLAYBACK_ENDED:
OnPlaybackEnded(MFP_GET_PLAYBACK_ENDED_EVENT(pEventHeader));
break;
case MFP_EVENT_TYPE_ACQUIRE_USER_CREDENTIAL:
OnAquireUserCredential(MFP_GET_ACQUIRE_USER_CREDENTIAL_EVENT(pEventHeader));
break;
}
}
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFPMediaPlayerCallback "{766C8FFB-5FDB-4FEA-A28D-B912996F51BD}" #usecom global IMFPMediaPlayerCallback IID_IMFPMediaPlayerCallback "{}" #comfunc global IMFPMediaPlayerCallback_OnMediaPlayerEvent 3 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IMFPMediaPlayerCallback "{766C8FFB-5FDB-4FEA-A28D-B912996F51BD}" #usecom global IMFPMediaPlayerCallback IID_IMFPMediaPlayerCallback "{}" #comfunc global IMFPMediaPlayerCallback_OnMediaPlayerEvent 3 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。