Microsoft DirectX 8.0

イベント通知コード

Microsoft® DirectShow® では、システム定義イベントをサポートしている。フィルタは、IMediaEventSink::Notify メソッドを使ってフィルタ グラフ マネージャにイベントを渡す。フィルタ グラフ マネージャは、一部のイベントを処理し、それ以外のイベントをアプリケーションに渡す。アプリケーションは、IMediaEvent::GetEvent メソッドを呼び出すことで、イベントを取得する。詳細については、「DirectShow でのイベント通知」を参照すること。

ここでは、DVD 固有イベント以外の DirectShow イベントについて説明する。DVD に固有のイベントについては、「DVD イベント通知コード」を参照すること。

ここでは、イベントごとにイベント コードと 2 つのイベント パラメータの意味を示す。また、フィルタ グラフ マネージャによるイベントの既定処理がある場合は、それについても記述する。既定処理を無効にするには、アプリケーションで IMediaEvent::CancelDefaultHandling を呼び出す。

イベント通知コードは、ヘッダー ファイルの Evcode.h および Audevcod.h に定義されている。

イベント通知コード説明
EC_ACTIVATEビデオ ウィンドウがアクティブまたは非アクティブ。
EC_BUFFERING_DATAグラフがデータをバッファリングしている、またはデータのバッファリングを停止した。
EC_CLOCK_CHANGED基準クロックが変更された。
EC_COMPLETE特定のストリームからのすべてのデータをレンダリングし終えた。
EC_DEVICE_LOSTプラグ & プレイ デバイスが取り外された、または再び使用できるようになった。
EC_DISPLAY_CHANGED表示モードが変更された。
EC_END_OF_SEGMENTセグメントの終わりに到達した。
EC_ERROR_STILLPLAYINGグラフを実行する非同期コマンドが失敗した。
EC_ERRORABORTエラーのため操作が中止された。
EC_FULLSCREEN_LOSTビデオ レンダラがフルスクリーン モードから抜けようとしている。
EC_GRAPH_CHANGEDフィルタ グラフが変更された。
EC_NEED_RESTARTフィルタがグラフの再開を要求している。
EC_NOTIFY_WINDOWフィルタにビデオ レンダラのウィンドウを通知する。
EC_OLE_EVENTフィルタがアプリケーションにテキスト文字列を渡している。
EC_OPENING_FILEグラフがファイルを開いている、またはファイルを開き終えた。
EC_PALETTE_CHANGEDビデオ パレットが変更された。
EC_PAUSEDポーズ要求が完了した。
EC_QUALITY_CHANGE品質管理のため、グラフがサンプルを削除した。
EC_REPAINTビデオ レンダラが再描画を要求している。
EC_SEGMENT_STARTED新しいセグメントが開始した。
EC_SHUTTING_DOWNフィルタ グラフが破棄前にシャットダウンしている。
EC_SNDDEV_IN_ERROR入力ピンでオーディオ デバイス エラーが発生した。
EC_SNDDEV_OUT_ERROR出力ピンでオーディオ デバイス エラーが発生した。
EC_STARVATIONフィルタは十分なデータを受け取っていない。
EC_STEP_COMPLETEコマ送りを実行しているフィルタが、指定数のコマ送りを完了した。
EC_STREAM_CONTROL_STARTEDストリーム制御開始コマンドが有効になった。
EC_STREAM_CONTROL_STOPPEDストリーム制御停止コマンドが有効になった。
EC_STREAM_ERROR_STILLPLAYINGストリーム内にエラーが発生した。ストリームは引き続き再生中である。
EC_STREAM_ERROR_STOPPEDエラーのためストリームが停止した。
EC_USERABORTユーザーが再生を強制終了した。
EC_VIDEO_SIZE_CHANGEDネイティブ ビデオ サイズが変更された。
EC_WINDOW_DESTROYEDビデオ レンダラが破棄またはグラフから削除された。

EC_ACTIVATE

ビデオ ウィンドウがアクティブまたは非アクティブ。

パラメータ

lParam1
ウィンドウがアクティブになった場合は TRUE、ウィンドウが非アクティブになった場合は FALSE。
lParam2
レンダラの IBaseFilter インターフェイスへのポインタ。

既定処理

フィルタ グラフ マネージャは、IResourceManager インターフェイスを介してフォーカスを設定する。アプリケーションにはイベント通知を送信しない。

注意

ビデオ レンダラは、ウィンドウがアクティブまたは非アクティブにされたとき (ACTIVATEAPP を受け取ったとき) にこのイベントを送信する。ウィンドウのアクティブと非アクティブが発生するのは、ウィンドウがフォーカスを取得または喪失したこと、またはレンダラがフルスクリーン モードとウィンドウ モードを切り替えたことが原因である。

このイベントにより、フィルタ グラフ マネージャは、オーディオ デバイスなど、ウィンドウ フォーカスに依存するリソースを割り当てることができる。

EC_BUFFERING_DATA

イベント通知コード

グラフがデータをバッファリングしている、またはデータのバッファリングを停止した。

パラメータ

lParam1
グラフがバッファリングを開始する場合は TRUE、グラフがバッファリングを停止する場合は FALSE。
lParam2
ゼロ。

既定処理

なし。

注意

外部ソースからで多をバッファリングする必要がある場合に、フィルタはこのイベントを送信する(ネットワークからデータを読み込む場合など)。アプリケーションはこのイベントを使ってユーザー インターフェイスを調整する。

EC_CLOCK_CHANGED

イベント通知コード

基準クロックが変更された。

パラメータ

lParam1
ゼロ。
lParam2
ゼロ。

既定処理

なし。

注意

フィルタ グラフの IMediaFilter::SetSyncSource メソッドが呼び出されると、フィルタ グラフはこのイベントを送信する。

EC_COMPLETE

イベント通知コード

特定のストリームからのすべてのデータをレンダリングし終えた。

パラメータ

lParam1
HRESULT 値。S_OK でもよい。
lParam2
ゼロ、またはレンダラの IBaseFilter インターフェイスへのポインタ。

既定処理

既定では、フィルタ グラフ マネージャはこのイベントをアプリケーションには転送しない。ただし、グラフ内のすべてのストリームが EC_COMPLETE を報告した後、フィルタ グラフ マネージャはアプリケーションに対して別に EC_COMPLETE イベントを送信する。

このイベントの既定処理が無効化されると、アプリケーションはレンダラからすべての EC_COMPLETE イベントを受け取る。

注意

レンダリング フィルタはエンドオブストリーム通知を受け取ると、このイベントを送信する(エンドオブストリームは IPin::EndOfStream メソッドを介して通知済になる)。フィルタは各ストリームに対して EC_COMPLETE イベントを 1 回だけ送信する。フィルタはこのイベントを送信する前に、保留中のサンプルをすべて処理する必要がある。レンダラを停止すると、キャッシュ内のエンドオブストリーム状態がすべてリセットされる。

フィルタは lParam2 パラメータを IBaseFilter ポインタに設定する。既定処理が有効な場合、フィルタ グラフ マネージャはこのパラメータをゼロに設定する。

EC_DEVICE_LOST

イベント通知コード

プラグ & プレイ デバイスが取り外された、または再び使用できるようになった。

パラメータ

lParam1
デバイスを表すフィルタの IUnknown インターフェイスへのポインタ。
lParam2
デバイスが取り外された場合はゼロ、デバイスが再び使用可能になった場合は 1。

既定処理

なし。

注意

デバイスが再び使用可能になると、デバイス フィルタの前の状態はもはや有効ではなくなる。アプリケーションがデバイスを使用するためには、グラフを再構築する必要がある。

EC_DISPLAY_CHANGED

イベント通知コード

表示モードが変更された。

パラメータ

lParam1
ビデオ レンダラの入力ピンの IPin インターフェイスへのポインタ、またはゼロ。
lParam2
ゼロ。

既定処理

フィルタ グラフ マネージャはグラフを一時的に停止してから、ビデオ レンダラの接続解除と再接続を行う。アプリケーションにはイベントを送信しない。

注意

ビデオ レンダラは、WM_DISPLAYCHANGE メッセージへの応答としてこのイベントを送信できる。WM_DISPLAYCHANGE メッセージは、ユーザーがディスプレイ解像度を変更したことを示す。

ピン接続中に、大部分のビデオ レンダラは現在のディスプレイ モードに基づいてフォーマットを選択する。ディスプレイ モードが変更されると、ビデオ レンダラは別のフォーマットを選択しなければならないことが多い。このメッセージを送信することで、レンダラは再接続する必要があることをフィルタ グラフ マネージャに対して通知する。再接続中に、レンダラは新しいフォーマットを選択できる。再接続に失敗すると、フィルタ グラフ マネージャはアプリケーションに対して EC_ERRORABORT イベントを送信する。

EC_END_OF_SEGMENT

イベント通知コード

セグメントの終わりに到達した。

パラメータ

lParam1
セグメントの開始以降の累積ストリーム時間を示す REFERENCE_TIME 値へのポインタ。
lParam2
セグメント番号 (ゼロから開始) を示す DWORD 値。

既定処理

フィルタ グラフ マネージャは、EC_END_OF_SEGMENT イベントの番号と EC_SEGMENT_STARTED イベントの番号を比較する。一致する場合は、EC_END_OF_SEGMENT イベントをアプリケーションに転送する。

注意

このイベント コードはシームレス ルーピングをサポートしている。IMediaSeeking::SetPositions メソッドの呼び出しに AM_SEEKING_Segment フラグが設定されている場合、ソース フィルタは IPin::EndOfStream を呼び出す代わりに、このイベント コードを送信する。

EC_ERROR_STILLPLAYING

イベント通知コード

グラフを実行する非同期コマンドが失敗した。

パラメータ

lParam1
失敗した処理の HRESULT 値。
lParam2
ゼロ。

既定処理

なし。

注意

フィルタ グラフ マネージャが非同期実行コマンドを発行し、それが失敗した場合、アプリケーションにこのイベントを送信する。グラフは実行中状態のままになる。基底となるフィルタの状態は不定である。あるフィルタは実行中である可能性もあるが、別のフィルタは違う可能性もある。

EC_ERRORABORT

イベント通知コード

エラーのため操作が中止された。

パラメータ

lParam1
失敗した処理の HRESULT 値。
lParam2
ゼロ。

既定処理

なし。

EC_FULLSCREEN_LOST

イベント通知コード

ビデオ レンダラがフルスクリーン モードから抜けようとしている。

パラメータ

lParam1
ゼロ。
lParam2
ビデオ レンダラの IBaseFilter インターフェイスへのポインタ、または NULL。

既定処理

なし。

注意

フル スクリーン レンダラがアクティブでなくなると、このイベントを送信する。別のビデオ レンダラがフルスクリーン モードから抜けると、フィルタ グラフ マネージャは、レンダラからの EC_ACTIVATE イベントへの応答として、このイベントを送信する。

EC_GRAPH_CHANGED

イベント通知コード

フィルタ グラフが変更された。

パラメータ

lParam1
ゼロ。
lParam2
ゼロ。

既定処理

なし。

注意

このイベント コードはデバッグ用である。すべてのグラフの変更で送信されるとは限らない。

EC_NEED_RESTART

イベント通知コード

フィルタがグラフの再起動を要求している。

パラメータ

lParam1
ゼロ。
lParam2
ゼロ。

既定処理

フィルタ グラフ マネージャはグラフをポーズして再開する。アプリケーションにはイベントを送信しない。

注意

フィルタがストリーム半ばのサンプルを拒絶する場合、アップストリーム ピンがサンプルの配信を停止する。フィルタは、このイベントを送信することでストリームを再開できる。たとえば、オーディオ レンダラは、ビデオ ウィンドウがフォーカスを失ったためにサウンド デバイスへのアクセスを失うことがある。その時点で、オーディオ レンダラはサンプルの拒絶を開始する。サウンド デバイスへのアクセスを再取得したら、このイベントを送信して、オーディオ ストリームを再開する。

EC_NOTIFY_WINDOW

イベント通知コード

フィルタにビデオ レンダラのウィンドウを通知する。

パラメータ

lParam1
ウィンドウのハンドル。
lParam2
ゼロ。

既定処理

このイベントは DirectShow で内部的に使用される。フィルタ グラフ マネージャはこのイベントをアプリケーションには送信しない。アプリケーションは、このイベントの既定処理をオーバーライドできない。

注意

ビデオ レンダラが接続されたら、レンダラは、アップストリーム出力ピンが IMediaEventSink インターフェイスをサポートするかどうかをチェックする。サポートされる場合、レンダラはこのイベントをアップストリーム フィルタに送信する。

EC_OLE_EVENT

イベント通知コード

フィルタがアプリケーションにテキスト文字列を渡している。

パラメータ

lParam1
BSTR 型の文字列。
lParam2
BSTR 型の文字列。

既定処理

なし。

注意

規約により、最初のパラメータにはタイプ情報 (Text など)を格納し、2 番目のパラメータにはテキスト文字列を格納する。

EC_OPENING_FILE

イベント通知コード

グラフがファイルを開いている、またはファイルを開き終えた。

パラメータ

lParam1
グラフがファイルのオープンを開始する場合は TRUE、グラフがファイルのオープンを行っていない場合は FALSE。
lParam2
ゼロ。

既定処理

なし。

注意

フィルタは、ファイルを開くのに時間がかかる場合、このイベントを送信できる(ファイルがネットワーク上にある場合など)。アプリケーションはこのイベントを使ってユーザー インターフェイスを調整する。

現在のところ、DirectShow に含まれるフィルタはいずれも、このイベントを送信しない。

EC_PALETTE_CHANGED

イベント通知コード

ビデオ パレットが変更された。

パラメータ

lParam1
ゼロ。
lParam2
ゼロ。

既定処理

なし。

注意

ビデオ レンダラは、ストリーム内でパレットの変更を検出した場合、このイベントを送信する。

EC_PAUSED

イベント通知コード

ポーズ要求が完了した。

パラメータ

lParam1
移行結果を示す HRESULT 値。この値が S_OK である場合、フィルタ グラフは現在ポーズ状態にある。
lParam2
ゼロ。

既定処理

なし。

注意

フィルタ グラフ マネージャは、非同期ポーズ コマンドが完了したときに、このイベントを送信する。

EC_QUALITY_CHANGE

イベント通知コード

品質管理のため、グラフがサンプルを削除した。

パラメータ

lParam1
ゼロ。
lParam2
ゼロ。

既定処理

なし。

注意

フィルタは、品質コントロール メッセージへの応答としてサンプルを削除する場合、このイベントを送信する。イベントが送信されるのは、品質レベルを調整する場合のみであり、サンプルを削除するたびに送信されるわけではない。詳細については、「品質コントロールの管理」を参照すること。

EC_REPAINT

イベント通知コード

ビデオ レンダラが再描画を要求している。

パラメータ

lParam1
ビデオ レンダラの入力ピンの IPin インターフェイスへのポインタ、または NULL。
lParam2
ゼロ。

既定処理

多くの場合、lParam1 パラメータは、ビデオ レンダラの入力ピンを指定する。この場合、フィルタ グラフ マネージャは、そのピンに接続された出力ピンを探し、IMediaEventSink インターフェイスがあるかどうかを問い合わせる。出力ピンが IMediaEventSink をサポートする場合、フィルタ グラフ マネージャは EC_REPAINT イベント コードを指定して IMediaEventSink::Notify を呼び出す。これにより、アップストリーム フィルタは、最後のサンプルを再送信する機会を得ることができる。

lParam1 が NULL である場合、出力ピンが IMediaEventSink をサポートしない場合、または Notify メソッドが失敗した場合は、フィルタ グラフ マネージャ自体が EC_REPAINT イベントを処理する。その動作は、グラフの状態により次のいずれかになる。

既定では、フィルタ グラフ マネージャはこのイベントをアプリケーションには送信しない。

注意

ビデオ レンダラは、WM_PAINT メッセージを受け取り、表示するデータがないときに、このメッセージを送信する。

EC_SEGMENT_STARTED

イベント通知コード

新しいセグメントが開始した。

パラメータ

lParam1
セグメントの開始以降の累積ストリーム時間を示す REFERENCE_TIME 値へのポインタ。
lParam2
セグメント番号 (ゼロから開始) を示す DWORD 値。

既定処理

このイベント通知はアプリケーションに送信されない。

注意

フィルタがセグメントの最後で EC_END_OF_SEGMENT を送信する予定である場合は、セグメントの最初でこのイベントを送信する。フィルタ グラフ マネージャは、このイベント通知を使って、セグメントの最後でいくつの EC_END_OF_SEGMENT 通知を受け取ることになるかを計算する。

既定では、フィルタはセグメントの最後に EC_END_OF_SEGMENT イベントを送信しないので、このイベントを送信するべきではない。詳細については、「AM_SEEKING_Segment」および「IMediaSeeking::SetPositions」を参照すること。

EC_SHUTTING_DOWN

イベント通知コード

フィルタ グラフが破棄前にシャットダウンしている。

パラメータ

lParam1
ゼロ。
lParam2
ゼロ。

既定処理

このイベント通知はアプリケーションに送信されない。フィルタ グラフ マネージャは、PID に対してこのイベントを送信し、グラフがシャットダウンすることを通知するアプリケーションは、このイベントの既定処理をオーバーライドできない。

EC_SNDDEV_IN_ERROR

イベント通知コード

入力ピンでオーディオ デバイス エラーが発生した。

パラメータ

lParam1
エラーが発生したときにデバイスがどのようにアクセスされていたかを示す、SNDDEV_ERR 列挙型の DWORD 値。
lParam2
サウンド デバイス呼び出しから返されたエラーを示す DWORD 値。

既定処理

なし。

EC_SNDDEV_OUT_ERROR

イベント通知コード

出力ピンでオーディオ デバイス エラーが発生した。

パラメータ

lParam1
エラーが発生したときにデバイスがどのようにアクセスされていたかを示す、SNDDEV_ERR 列挙型の DWORD 値。
lParam2
サウンド デバイス呼び出しから返されたエラーを示す DWORD 値。

既定処理

なし。

EC_STARVATION

イベント通知コード

フィルタは十分なデータを受け取っていない。

パラメータ

lParam1
ゼロ。
lParam2
ゼロ。

既定処理

このイベントはアプリケーションに送信されない。フィルタ グラフが実行中である場合、フィルタ グラフ マネージャはグラフをポーズし、ポーズが完了するまで待機する。その後、グラフを再び実行する。このイベントを送信するフィルタがポーズ状態への移行を完了するには、再開するのに十分なデータを受け取らなければならない。フィルタ グラフが実行中でない場合、フィルタ グラフ マネージャはこのイベントを無視する。

注意

到着するデータ量が少なすぎる場合に、パーサーまたはソース フィルタがこのイベントを送信できる。

EC_STEP_COMPLETE

イベント通知コード

コマ送りを実行しているフィルタが、指定数のコマ送りを完了した。

パラメータ

lParam1
ゼロ。
lParam2
ゼロ。

既定処理

フィルタ グラフ マネージャは、グラフをポーズし、イベントをアプリケーションに渡す。

関連項目

IVideoFrameStep::Step

EC_STREAM_CONTROL_STARTED

イベント通知コード

ストリーム制御停止コマンドが有効になった。

パラメータ

pSender
ストリームを開始したピンの IPin インターフェイスへのポインタ。
dwCookie
ユーザー定義の DWORD 値。

既定処理

なし。

注意

フィルタは、IAMStreamControl::StartAt メソッドへの応答としてこのイベントを送信する。このメソッドは、ストリーム送信を開始するピンの基準時間を指定する。ストリーム送信が実際に開始された時点で、フィルタはこのイベントを送信する。

pSender パラメータは、開始コマンドを実行するピンを指定する。実装方法により、このピンは、StartAt 呼び出しを受け取ったピンとは異なる場合がある。

dwCookie パラメータは、StartAt メソッドでアプリケーションにより指定される。このパラメータを使うと、アプリケーションは StartAt メソッドの複数呼び出しを追跡できる。

EC_STREAM_CONTROL_STOPPED

イベント通知コード

ストリーム制御停止コマンドが有効になった。

パラメータ

pSender
ストリームを停止したピンの IPin インターフェイスへのポインタ。
dwCookie
ユーザー定義の DWORD 値。

既定処理

なし。

注意

フィルタは、IAMStreamControl::StopAt メソッドへの応答としてこのイベントを送信する。このメソッドは、ストリーム送信を停止するピンの基準時間を指定する。ストリーム送信が実際に停止された時点で、フィルタはこのイベントを送信する。

pSender パラメータは、停止コマンドを実行するピンを指定する。実装方法により、このピンは、StopAt 呼び出しを受け取ったピンとは異なる場合がある。

dwCookie パラメータは、StopAt メソッドでアプリケーションにより指定される。このパラメータを使うと、アプリケーションは StopAt メソッドの複数呼び出しを追跡できる。

EC_STREAM_ERROR_STILLPLAYING

イベント通知コード

ストリーム内にエラーが発生した。ストリームは引き続き再生中である。

パラメータ

lParam1
失敗した処理の HRESULT 値。
lParam2
DWORD 値、通常はゼロ。

既定処理

なし。アプリケーションはグラフを停止するかどうか決定しなければならない。

EC_STREAM_ERROR_STOPPED

イベント通知コード

エラーのためストリームが停止した。

パラメータ

lParam1
失敗した処理の HRESULT 値。
lParam2
DWORD 値、通常はゼロ。

既定処理

なし。

EC_USERABORT

イベント通知コード

ユーザーが再生を強制終了した。

パラメータ

lParam1
ゼロ。
lParam2
ゼロ。

既定処理

なし。アプリケーションはグラフを停止するかどうか決定しなければならない。

注意

このイベント コードは、ユーザーが通常のグラフ再生を強制終了したことを通知する。たとえば、ビデオ レンダラは、ユーザーがビデオ ウィンドウを閉じた場合、このイベントを送信する。

このイベントの送信後、フィルタが停止してリセットされるまで、フィルタはすべてのサンプルを拒絶し、EC_REPAINT イベントを送信しない。

EC_VIDEO_SIZE_CHANGED

イベント通知コード

ネイティブ ビデオ サイズが変更された。

パラメータ

lParam1
下位 WORD が新しい幅をピクセル単位で指定し、上位 WORD が新しい高さをピクセル単位で指定する。
lParam2
ゼロ。

既定処理

なし。

注意

ビデオ レンダラは、ネイティブ ビデオ サイズの変更を検出した場合、このイベントを送信する。

EC_WINDOW_DESTROYED

イベント通知コード

ビデオ レンダラが破棄またはグラフから削除された。

パラメータ

lParam1
ビデオ レンダラの IBaseFilter インターフェイスへのポインタ。
lParam2
ゼロ。

既定処理

フィルタ グラフ マネージャは、IResourceManager インターフェイスを介し、このウィンドウとフォーカスを解放する。アプリケーションにはイベント通知を送信しない。

注意

ビデオ レンダラは、フィルタ グラフを IBaseFilter::JoinFilterGraph メソッドに残すときに、このイベントを送信する(フィルタが破棄される時点で、フィルタ グラフ マネージャも破棄される可能性があるので、フィルタの破棄時にこのイベントを送信するのでは遅すぎる)。

このイベントにより、ほかのフィルタは、オーディオ デバイスなど、ウィンドウ フォーカスに依存するリソースを取得できる。