CCmdQueue クラス
CCmdQueue クラスは、CDeferredCommand オブジェクトのキュー、およびキューに入れられたコマンドの追加、削除、状態チェック、実行のためのメンバ関数を提供する基底クラスである。CCmdQueue オブジェクトは、IQueueCommand メソッドを実装するオブジェクトの一部である。フィルタ グラフ マネージャは、IQueueCommand メソッドを実装し、アプリケーションがフィルタ グラフに対するコマンドをキューに入れることができるようにする。IQueueCommand インターフェイスを実装するフィルタは、このクラスを直接使用する。CDeferredCommand オブジェクトを使う場合は、このクラスからキューを派生させなければならない。
同期には、粗いモードと正確なモードという 2 つのモードがある。粗いモードでは、アプリケーションは指定された時間まで待機した後、コマンドを実行する。正確なモードでは、アプリケーションは、その時間に表示するサンプルに対する処理が開始されるまで待機した後、コマンドを実行する。どちらを実装するかは、フィルタによって決まる。フィルタ グラフ マネージャは、フィルタ グラフ マネージャのキューに入れられるコマンドについて、常に粗いモードを実装する。
粗い同期が必要な場合、実行すべきコマンドがキューに入れられるまで待機した後、コマンドを実行することができる。これは、CCmdQueue::GetDueCommand を呼び出すことによって実行できる。複数の項目を待機している場合は、CCmdQueue::GetDueHandle からイベント ハンドルを取得し、通知済みになったら CCmdQueue::GetDueCommand を呼び出す。ストリーム タイムは、CCmdQueue::Run メンバ関数と CCmdQueue::EndRun メンバ関数の呼び出しの間でのみ進む。ハンドルが設定されていても、コマンドの準備ができているという保証はない。イベントが通知済みになるたびに、(タイムアウトを 0 にして) GetDueCommand メンバ関数を呼び出す。これによって、コマンドの準備ができていない場合は、E_ABORT を返すことができる。
正確な同期が必要な場合は、CCmdQueue::GetCommandDueFor メンバ関数を呼び出して、処理しようとしているサンプルをパラメータとして渡す。この場合、次の項目が返される。
- ストリーム タイム時またはその前に実行しなければならないストリーム タイム コマンド。
- ストリーム タイムのプレゼンテーション時またはその前に実行しなければならないプレゼンテーション タイム コマンド。これは、CCmdQueue::Run および CCmdQueue::EndRun メンバ関数の間でのみ行う。この範囲外の場合、ストリーム タイムからプレゼンテーション タイムへのマッピングが認識されない。
- 現在実行しなければならないプレゼンテーション タイム コマンド。
ポーズ モード時に処理される可能性のあるサンプルについて正確な同期が必要な場合は、ストリーム タイム コマンドを使わなければならない。
すべての場合において、コマンドは呼び出されるか取り消されるまでキューに残る。イベント ハンドルの設定およびリセットは、すべてこのキュー オブジェクトによって管理される。
プロテクト データ メンバ
m_bRunning | 実行状態のフラグ。実行中の場合は TRUE に設定される。 |
m_dwAdvise | 基準クロックからのアドバイズ識別子 (未処理のアドバイズがない場合は 0)。 |
m_evDue | コマンドを実行する時間を設定する。 |
m_listPresentation | プレゼンテーション タイムのキューに入れられたコマンドを格納する。 |
m_listStream | ストリーム タイムのキューに入れられたコマンドを格納する。 |
m_Lock | リストへのアクセスを保護する。 |
m_pClock | 現在の基準クロック。 |
m_StreamTimeOffset | m_bRunning が TRUE である場合のストリーム タイムのオフセットを格納する。 |
m_StreamTimeOffset | m_bRunning が TRUE である場合のストリーム タイムのオフセットを格納する。 |
メンバ関数
CCmdQueue | CCmdQueue オブジェクトを作成する。 |
CheckTime | 指定された時間になったかどうかを判断する。 |
GetDueHandle | 通知するイベント ハンドルを取得する。 |
オーバーライド可能なメンバ関数
EndRun | 停止またはポーズ モードに切り替える。 |
GetCommandDueFor | 指定された時間にスケジュールされている遅延コマンドを取得する。 |
GetDueCommand | 次に実行する予定のコマンドへのポインタを取得する。 |
Insert | CDeferredCommand オブジェクトをキューに追加する。 |
New | 実行するコマンドを初期化し、新しい CDeferredCommand オブジェクトを返す。 |
Remove | CDeferredCommand オブジェクトをキューから削除する。 |
Run | 実行モードに切り替える。 |
SetSyncSource | タイミングに使うクロックを設定する。 |
SetTimeAdvise | 基準クロックを使ってタイマ イベントを設定する。 |