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 ゲートの有効な カウント 範囲は 1 以下です。OR ゲートの有効な カウント 範囲は 0 以上です。 Count を無効な値に設定しないでください。AVStream は、ミニドライバーがゲートを有効な状態に設定したことを確認しません。