イベントの取得

フィルタ グラフ マネージャはイベント通知をサポートする 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, &param1, &param2, 0), SUCCEEDED(hr))
{
    switch(evCode) 
    { 
        // 処理する各種イベントについて、アプリケーション定義の
        // 関数を呼び出す。
    } 
    hr = pEvent->FreeEventParams(evCode, param1, param2);
}

イベントに対するフィルタ グラフ マネージャのデフォルト処理をオーバーライドするには、パラメータにイベント コードを指定した IMediaEvent::CancelDefaultHandling メソッドを呼び出す。デフォルト処理は、IMediaEvent::RestoreDefaultHandling メソッドを呼び出すことによって復元できる。フィルタ グラフが指定されたイベント コードに対してデフォルト処理を実行しない場合は、これらのメソッドを呼び出しても効果はない。