Microsoft DirectX 8.0

IMediaEvent インターフェイス

このインターフェイスは、イベント通知を取得するメソッドと、フィルタ グラフのデフォルトのイベント処理をオーバーライドするメソッドを提供する。IMediaEventEx インターフェイスは、このインターフェイスを継承し、拡張する。

フィルタ グラフ マネージャがこのインターフェイスを実装する。アプリケーションでは、このインターフェイスを使用して、ストリームの終了、レンダリング エラーなど、フィルタ グラフ内で発生するイベントに応答できる。フィルタでは、IMediaEventSink インターフェイスを使用してフィルタ グラフにイベントを送る。

イベント通知の詳細については、「DirectShow でのイベント通知」を参照すること。システム定義のイベント通知の一覧については、「イベント通知コード」を参照すること。

vtable 順のメソッド

IUnknown メソッド説明
QueryInterface サポートされているインターフェイスへのポインタを取得する。
AddRef 参照カウントをインクリメントする。
Release 参照カウントをデクリメントする。
IDispatch メソッド説明
GetTypeInfoCount このディスプインターフェイスに利用可能なタイプ情報があるかどうか判断する。
GetTypeInfo GetTypeInfoCount が成功した場合は、このディスプインターフェイスのタイプ情報を取得する。
GetIDsOfNames (引数を含む) プロパティおよびメソッドのテキスト名を対応する DISPID に変換する。
Invoke DISPID およびその他の必要なパラメータが指定された場合は、このディスプインターフェイスのメソッドを呼び出すか、またはプロパティにアクセスする。
IMediaEvent メソッド説明
GetEventHandle キューにイベント通知がある間通知済状態の、手動リセット イベントへのハンドルを受け取る。
GetEvent 次の通知イベントをイベント キューから取得する。
WaitForCompletion フィルタ グラフがすべての有効なデータをレンダリングするのを待つ。
CancelDefaultHandling 指定したイベントに対するフィルタ グラフ マネージャのデフォルト処理をキャンセルする。
RestoreDefaultHandling 指定したイベントに対するフィルタ グラフ マネージャのデフォルト処理をリストアする。
FreeEventParams イベントのパラメータに関連付けられたリソースを解放する。

IMediaEvent::CancelDefaultHandling

IMediaEvent インターフェイス

指定したイベントに対するフィルタ グラフ マネージャのデフォルト処理をキャンセルする。

構文

HRESULT CancelDefaultHandling(
    long lEvCode
);

パラメータ

lEvCode
デフォルト処理をキャンセルするイベント コード。

戻り値

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

S_OK成功。
E_INVALIDARGこのイベントにはデフォルト処理はない。

注意

イベントのデフォルト処理をリストアするには、イベントコードを渡して RestoreDefaultHandling メソッドを呼び出すこと。

IMediaEvent::FreeEventParams

IMediaEvent インターフェイス

イベントのパラメータに関連付けられたリソースを解放する。

構文

HRESULT FreeEventParams(
    long lEventCode,
    long lParam1,
    long lParam2
);

パラメータ

lEventCode
[in] イベント コード。
lParam1
[in] 第 1 イベント パラメータ。
lParam2
[in] 第 2 イベント パラメータ。

戻り値

S_OK を返す。

注意

IMediaEvent::GetEvent メソッドを呼び出してイベント通知を受け取った後で、FreeEventParams を呼び出さなければならない。このメソッドはイベントパラメータに割り当てられてすべてのリソースを解放する。次の例に示すように GetEvent に用いた同じ変数を渡すこと :

hr = pEvent->GetEvent(&evCode, &param1, &param2, 0);
// Handle the event (not shown). 
hr = pEvent->FreeEventParams(evCode, param1, param2);

IMediaEvent::GetEvent

IMediaEvent インターフェイス

次の通知イベントをイベント キューから取得する。

構文

HRESULT GetEvent(
    long *lEventCode,
    long *lParam1,
    long *lParam2,
    long msTimeout
);

パラメータ

IEventCode
[out] イベント コードを受け取る変数へのポインタ。
lParam1
[out] 第 1 イベント パラメータを受け取る変数へのポインタ。
lParam2
[out] 第 2 イベント パラメータを受け取る変数へのポインタ。
msTimeout
[in] タイムアウト時間、ミリ秒単位。イベントがある間は INFINITE を使いブロックする。

戻り値

HRESULT 値を返す。以下のいずれかの値。

S_OK成功。
E_ABORTタイムアウトによる時間切れ。

注意

アプリケーションはタイムアウト時間 INFINITE を使うのは避けるべきだ、なぜならスレッドは GetEvent を待つ間メッセージを処理することができないからだ。Windows メss-時を処理する同じスレッドから GetEvent を呼び出すなら、ユーザー入力へのレスポンスを維持するために待ち時間を少なくすること。インターネットのようなソースからデータをストリーミングするときにはこれは最も重要である、なぜなら状態の移行は完了するまで非常に時間がかかるからだ。

GetEvent を呼び出した後で、FreeEventParams メソッドを呼び出してイベントパラメータに確保したすべてのリソースを解放すること。

通知コードおよびパラメータ値の一覧については、「イベント通知コード」を参照すること。

IMediaEvent::GetEventHandle

IMediaEvent インターフェイス

キューにイベント通知がある間通知済状態の、手動リセット イベントへのハンドルを受け取る。

構文

HRESULT GetEventHandle(
    OAEVENT *hEvent
);

パラメータ

hEvent
[out] イベント ハンドルを受け取る変数へのポインタ。

戻り値

S_OK を返す。

注意

フィルタ グラフ マネージャはイベント キューの状態を反映した手動リセット イベントを保持する。キューにイベント通知が入っていると、手動リセット イベントが通知済になる。キューがカラなら、IMediaEvent::GetEvent メソッドはそのイベントをリセットする。

アプリケーションはこのイベントを使用してキューの状態を確認することができる。最初に GetEventHandle を呼び出してイベントのハンドルを取得する。WaitForSingleObject のような Microsoft® Windows® 関数を使って、イベントが通知済になるまで待つ。イベントが通知済になると、GetEvent メソッドを呼び出して次のイベント通知をキューから受け取る。フィルタ グラフ マネージャはキューが空になるまでイベント通知を保持し、その後イベントをリセットする。

  Automation との互換性のため、このメソッドは OAEVENT 変数へのポインタを持つ。C++ では、次のように HANDLE タイプの変数を宣言しそれを OAEVENT タイプにキャストする :
HANDLE hEvent;
GetEventHandle( (OAEVENT*) &hEvent );

アプリケーションがイベントキューをモニタするもう 1 つの方法は IMediaEventEx::SetNotifyWindow メソッドを呼び出すことである。

IMediaEvent::RestoreDefaultHandling

IMediaEvent インターフェイス

指定したイベントに対するフィルタ グラフ マネージャのデフォルト処理をリストアする。

構文

HRESULT RestoreDefaultHandling(
    long lEvCode
);

パラメータ

lEvCode
[in] デフォルト処理に戻すイベント コード。

戻り値

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

S_OK成功。
E_INVALIDARGこのイベントにはデフォルト処理はない。

注意

デフォルトでは、グラフ マネージャは (EC_REPAINT のような) いくつかのイベントをアプリケーションに渡さずに処理する。CancelDefaultHandling メソッドを呼び出してイベントのデフォルト処理をオーバーライドすると、同じイベント コードで RestoreDefaultHandling をコーすることでデフォルトの処理をリストアすることができる。

IMediaEvent::WaitForCompletion

IMediaEvent インターフェイス

フィルタ グラフがすべての有効なデータをレンダリングするのを待つ。

構文

HRESULT WaitForCompletion(
    long msTimeout,
    long *pEvCode
);

パラメータ

msTimeout
[in] タイムアウト時間、ミリ秒単位。即座に戻るには 0 を渡す。無期限にブロックするには INFINITE を渡す。
pEvCode
[out] イベント コードを受け取る変数へのポインタ。詳細については、「注意」を参照すること。

戻り値

HRESULT 値を返す。以下のいずれかの値。

S_OK成功。
E_ABORTタイムアウトによる時間切れ。
VFW_E_WRONG_STATEフィルタ グラフが実行中ではない。

注意

このメソッドはタイムアウトが時間切れになるまでブロックする、あるいは以下のイベントの 1 つを起こす :

待っている間、このメソッドはすべての他のイベント通知を廃棄する。

戻り値が S_OK なら、pEvCode パラメータは待ち状態終了のイベントコードを受け取る。メソッドが帰っても、フィルタ グラフはまだ実行している。アプリケーションは必要に応じてグラフをポーズしたり停止したりできる。