Шлюзы управления потоком в AVStream
AVStream использует шлюзы логики в качестве механизма потока управления. Каждый шлюз логики представлен структурой KSGATE .
AVStream инициализирует каждый фильтр или закрепление одним шлюзом AND. Затем мини-диск может использовать этот механизм, чтобы определить, когда конкретный объект может обрабатывать данные. Чтобы получить контрольный шлюз обработки для контакта, мини-driver вызывает KsPinGetAndGate. Чтобы получить контрольный шлюз обработки для фильтра, вызовите KsFilterGetAndGate.
Чтобы создать новые шлюзы логики, мини-диск вызывает KsGateInitializeAnd или KsGateInitializeOr. Вы можете использовать выходные данные одного шлюза в качестве входных данных для другого шлюза, перенаправляя таким образом переходы состояния. Для этого укажите параметр NextOrGate или NextAndGate в этих вызовах.
Чтобы закрыть существующие входные данные для шлюза логики, можно вызвать KsGateTurnInputOff. Мини-диск может выполнить этот вызов, чтобы остановить и закрыть активный пин-код или приостановить обработку на неопределенный период времени.
Аналогичным образом вызовите KsGateTurnInputOn , чтобы открыть существующие входные данные для определенного шлюза.
Когда поток готов к обработке, он пытается захватить на входе шлюза AND, который управляет обработкой объекта обработки. Для этого мини-диск вызывает KsGateCaptureThreshold.
Если шлюз AND открыт, AVStream отключает входные данные для шлюза и начинается обработка. Так как шлюз теперь закрыт во время обработки, ни один другой поток не может захватить входные данные шлюза. Одновременно обрабатывать данные может только один поток.
Чтобы проверка состояние шлюза, не изменяя его, мини-диск может вызвать KsGateGetStateUnsafe. Однако обратите внимание, что эта функция не обрабатывает синхронизацию.
Чтобы удалить шлюз логики, вызовите KsGateTerminateAnd или KsGateTerminateOr. Удаляемые ворота должны находиться в начале цепочки ворот.
Чтобы подключить контакт в качестве входных данных к шлюзу логики, а затем подключить тот же шлюз логики, что и входные данные, к шлюзу И фильтра, вызовите KsPinAttachAndGate или KsPinAttachOrGate.
Определение состояния шлюза
Для шлюза AND значение элемента Count структуры KSGATE равно 1 за вычетом количества отключенных входных данных:
Count = 1 - (количество отключенных входов)
Если это значение меньше или равно нулю, шлюз закрывается. Если это значение больше нуля, шлюз открыт.
Для шлюза ИЛИ значение элемента Count в KSGATE — это количество входных данных для шлюза:
Count = ( количество входных данных)
Если это значение равно нулю, шлюз закрывается. Если значение Count больше нуля, шлюз открыт.
Вентили AND имеют допустимый диапазон Count , который составляет один или меньше; Допустимый диапазон count для шлюзов OR равен нулю или больше. Не устанавливайте для параметра Count недопустимые значения; AVStream не проверяет, установлен ли вентиль в допустимое состояние.