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 | ビデオ レンダラが破棄またはグラフから削除された。 |
ビデオ ウィンドウがアクティブまたは非アクティブ。
パラメータ
- lParam1
- ウィンドウがアクティブになった場合は TRUE、ウィンドウが非アクティブになった場合は FALSE。
- lParam2
- レンダラの IBaseFilter インターフェイスへのポインタ。
既定処理
フィルタ グラフ マネージャは、IResourceManager インターフェイスを介してフォーカスを設定する。アプリケーションにはイベント通知を送信しない。
注意
ビデオ レンダラは、ウィンドウがアクティブまたは非アクティブにされたとき (ACTIVATEAPP を受け取ったとき) にこのイベントを送信する。ウィンドウのアクティブと非アクティブが発生するのは、ウィンドウがフォーカスを取得または喪失したこと、またはレンダラがフルスクリーン モードとウィンドウ モードを切り替えたことが原因である。
このイベントにより、フィルタ グラフ マネージャは、オーディオ デバイスなど、ウィンドウ フォーカスに依存するリソースを割り当てることができる。
グラフがデータをバッファリングしている、またはデータのバッファリングを停止した。
パラメータ
- lParam1
- グラフがバッファリングを開始する場合は TRUE、グラフがバッファリングを停止する場合は FALSE。
- lParam2
- ゼロ。
既定処理
なし。
注意
外部ソースからで多をバッファリングする必要がある場合に、フィルタはこのイベントを送信する(ネットワークからデータを読み込む場合など)。アプリケーションはこのイベントを使ってユーザー インターフェイスを調整する。
基準クロックが変更された。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ゼロ。
既定処理
なし。
注意
フィルタ グラフの IMediaFilter::SetSyncSource メソッドが呼び出されると、フィルタ グラフはこのイベントを送信する。
特定のストリームからのすべてのデータをレンダリングし終えた。
パラメータ
- lParam1
- HRESULT 値。S_OK でもよい。
- lParam2
- ゼロ、またはレンダラの IBaseFilter インターフェイスへのポインタ。
既定処理
既定では、フィルタ グラフ マネージャはこのイベントをアプリケーションには転送しない。ただし、グラフ内のすべてのストリームが EC_COMPLETE を報告した後、フィルタ グラフ マネージャはアプリケーションに対して別に EC_COMPLETE イベントを送信する。
このイベントの既定処理が無効化されると、アプリケーションはレンダラからすべての EC_COMPLETE イベントを受け取る。
注意
レンダリング フィルタはエンドオブストリーム通知を受け取ると、このイベントを送信する(エンドオブストリームは IPin::EndOfStream メソッドを介して通知済になる)。フィルタは各ストリームに対して EC_COMPLETE イベントを 1 回だけ送信する。フィルタはこのイベントを送信する前に、保留中のサンプルをすべて処理する必要がある。レンダラを停止すると、キャッシュ内のエンドオブストリーム状態がすべてリセットされる。
フィルタは lParam2 パラメータを IBaseFilter ポインタに設定する。既定処理が有効な場合、フィルタ グラフ マネージャはこのパラメータをゼロに設定する。
プラグ & プレイ デバイスが取り外された、または再び使用できるようになった。
パラメータ
- lParam1
- デバイスを表すフィルタの IUnknown インターフェイスへのポインタ。
- lParam2
- デバイスが取り外された場合はゼロ、デバイスが再び使用可能になった場合は 1。
既定処理
なし。
注意
デバイスが再び使用可能になると、デバイス フィルタの前の状態はもはや有効ではなくなる。アプリケーションがデバイスを使用するためには、グラフを再構築する必要がある。
表示モードが変更された。
パラメータ
- lParam1
- ビデオ レンダラの入力ピンの IPin インターフェイスへのポインタ、またはゼロ。
- lParam2
- ゼロ。
既定処理
フィルタ グラフ マネージャはグラフを一時的に停止してから、ビデオ レンダラの接続解除と再接続を行う。アプリケーションにはイベントを送信しない。
注意
ビデオ レンダラは、WM_DISPLAYCHANGE メッセージへの応答としてこのイベントを送信できる。WM_DISPLAYCHANGE メッセージは、ユーザーがディスプレイ解像度を変更したことを示す。
ピン接続中に、大部分のビデオ レンダラは現在のディスプレイ モードに基づいてフォーマットを選択する。ディスプレイ モードが変更されると、ビデオ レンダラは別のフォーマットを選択しなければならないことが多い。このメッセージを送信することで、レンダラは再接続する必要があることをフィルタ グラフ マネージャに対して通知する。再接続中に、レンダラは新しいフォーマットを選択できる。再接続に失敗すると、フィルタ グラフ マネージャはアプリケーションに対して EC_ERRORABORT イベントを送信する。
セグメントの終わりに到達した。
パラメータ
- lParam1
- セグメントの開始以降の累積ストリーム時間を示す REFERENCE_TIME 値へのポインタ。
- lParam2
- セグメント番号 (ゼロから開始) を示す DWORD 値。
既定処理
フィルタ グラフ マネージャは、EC_END_OF_SEGMENT イベントの番号と EC_SEGMENT_STARTED イベントの番号を比較する。一致する場合は、EC_END_OF_SEGMENT イベントをアプリケーションに転送する。
注意
このイベント コードはシームレス ルーピングをサポートしている。IMediaSeeking::SetPositions メソッドの呼び出しに AM_SEEKING_Segment フラグが設定されている場合、ソース フィルタは IPin::EndOfStream を呼び出す代わりに、このイベント コードを送信する。
グラフを実行する非同期コマンドが失敗した。
パラメータ
- lParam1
- 失敗した処理の HRESULT 値。
- lParam2
- ゼロ。
既定処理
なし。
注意
フィルタ グラフ マネージャが非同期実行コマンドを発行し、それが失敗した場合、アプリケーションにこのイベントを送信する。グラフは実行中状態のままになる。基底となるフィルタの状態は不定である。あるフィルタは実行中である可能性もあるが、別のフィルタは違う可能性もある。
エラーのため操作が中止された。
パラメータ
- lParam1
- 失敗した処理の HRESULT 値。
- lParam2
- ゼロ。
既定処理
なし。
ビデオ レンダラがフルスクリーン モードから抜けようとしている。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ビデオ レンダラの IBaseFilter インターフェイスへのポインタ、または NULL。
既定処理
なし。
注意
フル スクリーン レンダラがアクティブでなくなると、このイベントを送信する。別のビデオ レンダラがフルスクリーン モードから抜けると、フィルタ グラフ マネージャは、レンダラからの EC_ACTIVATE イベントへの応答として、このイベントを送信する。
フィルタ グラフが変更された。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ゼロ。
既定処理
なし。
注意
このイベント コードはデバッグ用である。すべてのグラフの変更で送信されるとは限らない。
フィルタがグラフの再起動を要求している。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ゼロ。
既定処理
フィルタ グラフ マネージャはグラフをポーズして再開する。アプリケーションにはイベントを送信しない。
注意
フィルタがストリーム半ばのサンプルを拒絶する場合、アップストリーム ピンがサンプルの配信を停止する。フィルタは、このイベントを送信することでストリームを再開できる。たとえば、オーディオ レンダラは、ビデオ ウィンドウがフォーカスを失ったためにサウンド デバイスへのアクセスを失うことがある。その時点で、オーディオ レンダラはサンプルの拒絶を開始する。サウンド デバイスへのアクセスを再取得したら、このイベントを送信して、オーディオ ストリームを再開する。
フィルタにビデオ レンダラのウィンドウを通知する。
パラメータ
- lParam1
- ウィンドウのハンドル。
- lParam2
- ゼロ。
既定処理
このイベントは DirectShow で内部的に使用される。フィルタ グラフ マネージャはこのイベントをアプリケーションには送信しない。アプリケーションは、このイベントの既定処理をオーバーライドできない。
注意
ビデオ レンダラが接続されたら、レンダラは、アップストリーム出力ピンが IMediaEventSink インターフェイスをサポートするかどうかをチェックする。サポートされる場合、レンダラはこのイベントをアップストリーム フィルタに送信する。
フィルタがアプリケーションにテキスト文字列を渡している。
パラメータ
- lParam1
- BSTR 型の文字列。
- lParam2
- BSTR 型の文字列。
既定処理
なし。
注意
規約により、最初のパラメータにはタイプ情報 (Text など)を格納し、2 番目のパラメータにはテキスト文字列を格納する。
グラフがファイルを開いている、またはファイルを開き終えた。
パラメータ
- lParam1
- グラフがファイルのオープンを開始する場合は TRUE、グラフがファイルのオープンを行っていない場合は FALSE。
- lParam2
- ゼロ。
既定処理
なし。
注意
フィルタは、ファイルを開くのに時間がかかる場合、このイベントを送信できる(ファイルがネットワーク上にある場合など)。アプリケーションはこのイベントを使ってユーザー インターフェイスを調整する。
現在のところ、DirectShow に含まれるフィルタはいずれも、このイベントを送信しない。
ビデオ パレットが変更された。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ゼロ。
既定処理
なし。
注意
ビデオ レンダラは、ストリーム内でパレットの変更を検出した場合、このイベントを送信する。
ポーズ要求が完了した。
パラメータ
- lParam1
- 移行結果を示す HRESULT 値。この値が S_OK である場合、フィルタ グラフは現在ポーズ状態にある。
- lParam2
- ゼロ。
既定処理
なし。
注意
フィルタ グラフ マネージャは、非同期ポーズ コマンドが完了したときに、このイベントを送信する。
品質管理のため、グラフがサンプルを削除した。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ゼロ。
既定処理
なし。
注意
フィルタは、品質コントロール メッセージへの応答としてサンプルを削除する場合、このイベントを送信する。イベントが送信されるのは、品質レベルを調整する場合のみであり、サンプルを削除するたびに送信されるわけではない。詳細については、「品質コントロールの管理」を参照すること。
ビデオ レンダラが再描画を要求している。
パラメータ
- lParam1
- ビデオ レンダラの入力ピンの IPin インターフェイスへのポインタ、または NULL。
- lParam2
- ゼロ。
既定処理
多くの場合、lParam1 パラメータは、ビデオ レンダラの入力ピンを指定する。この場合、フィルタ グラフ マネージャは、そのピンに接続された出力ピンを探し、IMediaEventSink インターフェイスがあるかどうかを問い合わせる。出力ピンが IMediaEventSink をサポートする場合、フィルタ グラフ マネージャは EC_REPAINT イベント コードを指定して IMediaEventSink::Notify を呼び出す。これにより、アップストリーム フィルタは、最後のサンプルを再送信する機会を得ることができる。
lParam1 が NULL である場合、出力ピンが IMediaEventSink をサポートしない場合、または Notify メソッドが失敗した場合は、フィルタ グラフ マネージャ自体が EC_REPAINT イベントを処理する。その動作は、グラフの状態により次のいずれかになる。
- 実行中:イベントを無視する(レンダラがストリーム内の次のサンプルを受信する)。
- ポーズ:グラフの現在位置をシークする。その際に、フィルタはフラッシュされ、データは再び待ち行列に入れられる。
- 停止:グラフをポーズおよび停止する。その際にデータは再び待ち行列に入れられる。
既定では、フィルタ グラフ マネージャはこのイベントをアプリケーションには送信しない。
注意
ビデオ レンダラは、WM_PAINT メッセージを受け取り、表示するデータがないときに、このメッセージを送信する。
新しいセグメントが開始した。
パラメータ
- lParam1
- セグメントの開始以降の累積ストリーム時間を示す REFERENCE_TIME 値へのポインタ。
- lParam2
- セグメント番号 (ゼロから開始) を示す DWORD 値。
既定処理
このイベント通知はアプリケーションに送信されない。
注意
フィルタがセグメントの最後で EC_END_OF_SEGMENT を送信する予定である場合は、セグメントの最初でこのイベントを送信する。フィルタ グラフ マネージャは、このイベント通知を使って、セグメントの最後でいくつの EC_END_OF_SEGMENT 通知を受け取ることになるかを計算する。
既定では、フィルタはセグメントの最後に EC_END_OF_SEGMENT イベントを送信しないので、このイベントを送信するべきではない。詳細については、「AM_SEEKING_Segment」および「IMediaSeeking::SetPositions」を参照すること。
フィルタ グラフが破棄前にシャットダウンしている。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ゼロ。
既定処理
このイベント通知はアプリケーションに送信されない。フィルタ グラフ マネージャは、PID に対してこのイベントを送信し、グラフがシャットダウンすることを通知するアプリケーションは、このイベントの既定処理をオーバーライドできない。
入力ピンでオーディオ デバイス エラーが発生した。
パラメータ
- lParam1
- エラーが発生したときにデバイスがどのようにアクセスされていたかを示す、SNDDEV_ERR 列挙型の DWORD 値。
- lParam2
- サウンド デバイス呼び出しから返されたエラーを示す DWORD 値。
既定処理
なし。
出力ピンでオーディオ デバイス エラーが発生した。
パラメータ
- lParam1
- エラーが発生したときにデバイスがどのようにアクセスされていたかを示す、SNDDEV_ERR 列挙型の DWORD 値。
- lParam2
- サウンド デバイス呼び出しから返されたエラーを示す DWORD 値。
既定処理
なし。
フィルタは十分なデータを受け取っていない。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ゼロ。
既定処理
このイベントはアプリケーションに送信されない。フィルタ グラフが実行中である場合、フィルタ グラフ マネージャはグラフをポーズし、ポーズが完了するまで待機する。その後、グラフを再び実行する。このイベントを送信するフィルタがポーズ状態への移行を完了するには、再開するのに十分なデータを受け取らなければならない。フィルタ グラフが実行中でない場合、フィルタ グラフ マネージャはこのイベントを無視する。
注意
到着するデータ量が少なすぎる場合に、パーサーまたはソース フィルタがこのイベントを送信できる。
コマ送りを実行しているフィルタが、指定数のコマ送りを完了した。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ゼロ。
既定処理
フィルタ グラフ マネージャは、グラフをポーズし、イベントをアプリケーションに渡す。
関連項目
IVideoFrameStep::Step
ストリーム制御停止コマンドが有効になった。
パラメータ
- pSender
- ストリームを開始したピンの IPin インターフェイスへのポインタ。
- dwCookie
- ユーザー定義の DWORD 値。
既定処理
なし。
注意
フィルタは、IAMStreamControl::StartAt メソッドへの応答としてこのイベントを送信する。このメソッドは、ストリーム送信を開始するピンの基準時間を指定する。ストリーム送信が実際に開始された時点で、フィルタはこのイベントを送信する。
pSender パラメータは、開始コマンドを実行するピンを指定する。実装方法により、このピンは、StartAt 呼び出しを受け取ったピンとは異なる場合がある。
dwCookie パラメータは、StartAt メソッドでアプリケーションにより指定される。このパラメータを使うと、アプリケーションは StartAt メソッドの複数呼び出しを追跡できる。
ストリーム制御停止コマンドが有効になった。
パラメータ
- pSender
- ストリームを停止したピンの IPin インターフェイスへのポインタ。
- dwCookie
- ユーザー定義の DWORD 値。
既定処理
なし。
注意
フィルタは、IAMStreamControl::StopAt メソッドへの応答としてこのイベントを送信する。このメソッドは、ストリーム送信を停止するピンの基準時間を指定する。ストリーム送信が実際に停止された時点で、フィルタはこのイベントを送信する。
pSender パラメータは、停止コマンドを実行するピンを指定する。実装方法により、このピンは、StopAt 呼び出しを受け取ったピンとは異なる場合がある。
dwCookie パラメータは、StopAt メソッドでアプリケーションにより指定される。このパラメータを使うと、アプリケーションは StopAt メソッドの複数呼び出しを追跡できる。
ストリーム内にエラーが発生した。ストリームは引き続き再生中である。
パラメータ
- lParam1
- 失敗した処理の HRESULT 値。
- lParam2
- DWORD 値、通常はゼロ。
既定処理
なし。アプリケーションはグラフを停止するかどうか決定しなければならない。
エラーのためストリームが停止した。
パラメータ
- lParam1
- 失敗した処理の HRESULT 値。
- lParam2
- DWORD 値、通常はゼロ。
既定処理
なし。
ユーザーが再生を強制終了した。
パラメータ
- lParam1
- ゼロ。
- lParam2
- ゼロ。
既定処理
なし。アプリケーションはグラフを停止するかどうか決定しなければならない。
注意
このイベント コードは、ユーザーが通常のグラフ再生を強制終了したことを通知する。たとえば、ビデオ レンダラは、ユーザーがビデオ ウィンドウを閉じた場合、このイベントを送信する。
このイベントの送信後、フィルタが停止してリセットされるまで、フィルタはすべてのサンプルを拒絶し、EC_REPAINT イベントを送信しない。
ネイティブ ビデオ サイズが変更された。
パラメータ
- lParam1
- 下位 WORD が新しい幅をピクセル単位で指定し、上位 WORD が新しい高さをピクセル単位で指定する。
- lParam2
- ゼロ。
既定処理
なし。
注意
ビデオ レンダラは、ネイティブ ビデオ サイズの変更を検出した場合、このイベントを送信する。
ビデオ レンダラが破棄またはグラフから削除された。
パラメータ
- lParam1
- ビデオ レンダラの IBaseFilter インターフェイスへのポインタ。
- lParam2
- ゼロ。
既定処理
フィルタ グラフ マネージャは、IResourceManager インターフェイスを介し、このウィンドウとフォーカスを解放する。アプリケーションにはイベント通知を送信しない。
注意
ビデオ レンダラは、フィルタ グラフを IBaseFilter::JoinFilterGraph メソッドに残すときに、このイベントを送信する(フィルタが破棄される時点で、フィルタ グラフ マネージャも破棄される可能性があるので、フィルタの破棄時にこのイベントを送信するのでは遅すぎる)。
このイベントにより、ほかのフィルタは、オーディオ デバイスなど、ウィンドウ フォーカスに依存するリソースを取得できる。