Реализация подключаемых терминалов
Общие требования для реализации подключаемого терминала:
- Базовый код потоковой передачи подключаемого терминала должен соответствовать возможностям нужных MSP.
- Терминал должен использовать фильтры DirectShow для работы с большинством MSP (это предполагается далее).
- Аудиоконфермы должны поддерживать 8 кГц 16-разрядный монолинейный PCM для большинства MSP.
- Терминал должен включить маршалинг свободного потока, реализовав IMarshal. Терминал может сделать это, вызвав COM API CoCreateFreeThreadedMarshaler и агрегируя IMarshal для возвращаемого указателя. Деструктор объекта терминала должен вызвать IMarshal-Release>.
- Терминал должен реализовывать или агрегировать любые дополнительные интерфейсы, относящиеся к терминалу, которые являются подходящими.
- Реализация терминала должна быть потокобезопасной.
- Реализация терминала должна #include Termmgr.h для определения ITTerminalControl. Это в дополнение к обычным включает и библиотеки, необходимые для приложений TAPI 3 или TAPI 3 в Windows 2000 с пакетом обновления 1 (SP1).
Примечания о реализации интерфейса и метода:
Терминал должен реализовывать ITTerminal (двойной интерфейс — vtable + IDispatch).
Терминал должен возвращать представление BSTR выбранного GUID, идентифицирующее тип терминала. Выделите BSTR с помощью SysAllocString. Чтобы преобразовать guid в BSTR, вызовите StringFromCLSID, SysAllocString и CoTaskMemFree.
Как правило, терминал должен возвращать TT_DYNAMIC, если приложение реализует терминал. Возврат TT_STATIC также будет работать, и возврат этого значения может быть уместным, если терминал соответствует аппаратному устройству; Однако это может запутать пользователей, так как статический терминал не будет присутствовать в перечислении статических терминалов MSP.
Если реализация терминала не ограничивает произвольное количество потоков, к которым терминал может быть подключен одновременно, терминал всегда должен возвращать TS_NOTINUSE.
В противном случае реализация терминала произвольно ограничивает количество потоков, к которым терминал может быть подключен за раз. В этом случае терминал должен вести подсчет количества потоков, к которому он подключен. Терминал должен увеличить это внутреннее число при успешном вызове ITTerminalControl::ConnectTerminal и уменьшать его при успешном вызове ITTerminalControl::D isconnectTerminal . В ITTerminal::get_State он должен возвращать TS_INUSE, если это число равно максимальному количеству потоков, в которых терминал может быть выбран за раз; в противном случае он должен возвращать TS_NOTINUSE. Обратите внимание, что если ограничение равно одному, счетчик может быть логическим или TERMINAL_STATE значением.
Терминал должен возвращать выбранное имя BSTR , выделенное через SysAllocString. Это имя должно быть значимым для пользователя и должно быть локализовано.
Терминал должен возвращать тип носителя TAPIMEDIATYPE_AUDIO или TAPIMEDIATYPE_VIDEO.
Терминал возвращает значение перечисления TERMINAL_DIRECTION, указывающее направление терминала. Если терминал является двунаправленным (например, мостом), он должен возвращать TD_BIDIRECTIONAL.
Терминал должен реализовывать ITTerminalControl (только vtable).
ITTerminalControl::get_AddressHandle
Предоставленный приложением терминал всегда должен возвращать значение NULL в качестве дескриптора адреса. Это указывает MSP, что этот терминал не был создан в определенном объекте адреса MSP.
ITTerminalControl::ConnectTerminal
При этом вызове терминал добавит свои фильтры к заданному графу и при необходимости подключит их друг к другу. Затем терминал должен вернуть контакты, предоставляемые терминалом для указанного направления потока.
Терминал, который не поддерживает параллельное подключение к нескольким потокам, установит внутреннюю переменную для TS_INUSE после успешного завершения этого метода.
Терминал может использовать параметр dwTerminalDirection из этого вызова, чтобы определить направление потока, к которому он подключается. Это необходимо для двунаправленных терминалов.
Примечание
Обычно (в базовых классах MSP и во всех известных MSP) код потока MSP завершается ошибкой подключения, если терминал возвращает несколько контактов из одного вызова ConnectTerminal . Это нормально, так как терминал, возвращающий несколько контактов во время подключения, требует от MSP специальных знаний о терминале, чтобы эффективно использовать дополнительные контакты.
ITTerminalControl::CompleteConnectTerminal
Терминал должен просто вернуть S_OK. Терминал также может выполнить инициализацию после подключения, если это необходимо.
ITTerminalControl::D isconnectTerminal
Терминал должен выполнять все действия, необходимые для отключения терминала от остальной части графа. Обычно это включает удаление всех фильтров терминалов из графа и установку состояния терминала в TS_NOTINUSE.
ITTerminalControl::RunRenderFilter
Терминал должен просто вернуть E_NOTIMPL.
ITTerminalControl::StopRenderFilter
Терминал должен просто вернуть E_NOTIMPL.