AVStream のフロー制御ゲート
AVStream では、制御フロー メカニズムとしてロジック ゲートが使用されます。 各ロジック ゲートは、KSGATE 構造体で表されます。
AVStream は、各フィルターまたはピンを 1 つの AND ゲートで初期化します。 ミニドライバーは、このメカニズムを使用して、その特定のオブジェクトがデータを処理できるタイミングを判断できます。 ピンの処理コントロール ゲートを取得するために、ミニドライバーは KsPinGetAndGate を呼び出します。 フィルターの処理コントロール ゲートを取得するには、KsFilterGetAndGate を呼び出します。
新しいロジック ゲートを作成するために、ミニドライバーは KsGateInitializeAnd または KsGateInitializeOr を呼び出します。 あるゲートの出力を別のゲートへの入力として使用して、状態遷移を転送することができます。 これを行うには、これらの呼び出しで NextOrGate または NextAndGate パラメーターを指定します。
ロジック ゲートへの既存の入力を閉じるには、KsGateTurnInputOff を呼び出します。 ミニドライバーは、アクティブなピンを停止して閉じたり、無期限に処理を中断したりするために、この呼び出しを行う場合があります。
同様に、KsGateTurnInputOn を呼び出して、特定のゲートへの既存の入力を開きます。
スレッドは、処理の準備ができると、処理オブジェクトの処理を制御する AND ゲートのオン入力のキャプチャを試みます。 これを行うには、ミニドライバーは KsGateCaptureThreshold を呼び出します。
AND ゲートが開いている場合、AVStream はゲートへの入力をオフにし、処理を開始します。 処理中はゲートが閉じているので、他のスレッドはゲートのオン入力をキャプチャできません。 一度にデータを処理できるスレッドは 1 つだけです。
ゲートの状態を変更せずにチェックするために、ミニドライバーは KsGateGetStateUnsafe を呼び出すことができます。 ただし、この関数は同期を処理しないことに注意してください。
ロジック ゲートを削除するには、KsGateTerminateAnd または KsGateTerminateOr を呼び出します。 削除するゲートは、ゲート チェーンの先頭にある必要があります。
入力としてピンをロジック ゲートに接続し、入力と同じロジック ゲートをフィルターの AND ゲートに接続するには、KsPinAttachAndGate または KsPinAttachOrGate を呼び出します。
ゲートの状態の決定
AND ゲートの場合、KSGATE 構造体の Count メンバーの値は、1 からオフ入力の数を引いた値です。
Count = 1 - (オフ入力の数)
この値が 0 以下の場合、ゲートは閉じられます。 この値が 0 より大きい場合、ゲートは開いています。
OR ゲートの場合、KSGATE の Count メンバーの値は、ゲートへのオン入力の数です。
Count = (オン入力の数)
この値が 0 の場合、ゲートは閉じられます。 Count が 0 より大きい場合、ゲートは開いています。
AND ゲートの有効な Count 範囲は 1 以下です。OR ゲートの有効な Count 範囲は 0 以上です。 Count を無効な値に設定しないでください。AVStream は、ミニドライバーがゲートを有効な状態に設定したことを確認しません。