イベントの取得
フィルタ グラフ マネージャはイベント通知をサポートする 3 つのインターフェイスを公開している。
- IMediaEventSink は、フィルタがイベントを送信するためのメソッドを含む。
- IMediaEvent は、アプリケーションがイベントを取得するためのメソッドを含む。
- IMediaEventEx は、IMediaEvent インターフェイスを継承し、拡張する。
フィルタは、フィルタ グラフ マネージャに対する IMediaEventSink::Notify メソッドを呼び出すことによって、イベント通知を送信する。イベント通知は、イベントのタイプを定義するイベント コードと、付加情報を提供する 2 つの DWORD パラメータで構成される。イベント コードに応じて、パラメータにはポインタ、戻りコード、基準タイム、またはその他の情報が含まれる。すべてのイベント コードとパラメータの一覧については、「イベント通知コード」を参照すること。
キューからイベントを取得するために、アプリケーションはフィルタ グラフ マネージャに対して IMediaEvent::GetEvent メソッドを呼び出す。このメソッドは、返すイベントが発生するまで、または指定された時間が経過するまでブロックする。キュー内にイベントがあり、メソッドがイベント コードと 2 つのイベント パラメータを返したとする。アプリケーションは、GetEvent を呼び出した後必ず IMediaEvent::FreeEventParams メソッドを呼び出し、イベント パラメータに関連付けられたリソースを解放する必要がある。たとえば、パラメータは、フィルタ グラフによって割り当てられた BSTR 値である場合がある。
次のサンプル コードは、キューからイベントを取得する方法の概要を示している。
long evCode, param1, param2;
HRESULT hr;
while (hr = pEvent->GetEvent(&evCode, ¶m1, ¶m2, 0), SUCCEEDED(hr))
{
switch(evCode)
{
// 処理する各種イベントについて、アプリケーション定義の
// 関数を呼び出す。
}
hr = pEvent->FreeEventParams(evCode, param1, param2);
}
イベントに対するフィルタ グラフ マネージャのデフォルト処理をオーバーライドするには、パラメータにイベント コードを指定した IMediaEvent::CancelDefaultHandling メソッドを呼び出す。デフォルト処理は、IMediaEvent::RestoreDefaultHandling メソッドを呼び出すことによって復元できる。フィルタ グラフが指定されたイベント コードに対してデフォルト処理を実行しない場合は、これらのメソッドを呼び出しても効果はない。