实现可插拔终端

可插拔终端实现的一般要求如下:

  • 可插入终端的基础流式处理代码应与所需 MSP 的功能匹配。
  • 终端必须使用 DirectShow 筛选器来与大多数 MSP 一起使用, () 上假设这一点。
  • 对于大多数 MSP,音频终端必须支持 8 kHz 16 位单声道线性 PCM。
  • 终端应通过实现 IMarshal 来启用自由线程封送。 终端可以通过调用 COM API CoCreateFreeThreadedMarshaler 并将 IMarshal 聚合到返回的指针来执行此操作。 终端对象的析构函数应调用 IMarshal-Release>
  • 终端应实现或聚合适合的任何其他特定于终端的接口。
  • 终端实现必须是线程安全的。
  • 终端实现必须为 ITTerminalControl 的定义#include Termmgr.h。 这是除了 Windows 2000 SP1 下的 TAPI 3 或 TAPI 3 应用程序所需的常用 include 和 libs。

接口和方法实现说明:

终端必须实现 ITTerminal (双接口 - vtable + IDispatch) 。

ITTerminal::get_TerminalClass

终端必须返回你选择的用于标识终端类型的 GUID 的 BSTR 表示形式。 通过 SysAllocString 分配 BSTR。 若要从 GUID 转换为 BSTR,请调用 StringFromCLSIDSysAllocStringCoTaskMemFree

ITTerminal::get_TerminalType

如果应用程序实现终端,终端通常应返回TT_DYNAMIC。 返回TT_STATIC也适用,如果终端对应于硬件设备,则返回此值可能合适;但是,这样做可能会让用户感到困惑,因为 MSP 的静态终端枚举中不存在静态终端。

ITTerminal::get_State

如果终端实现不任意限制终端可以同时连接到的流数,则终端应始终返回TS_NOTINUSE。

否则,终端实现会任意限制终端一次可以连接到的流数。 在这种情况下,终端应保留它连接到的流数。 终端应在成功的 ITTerminalControl::ConnectTerminal 调用中递增此内部计数,并在成功的 ITTerminalControl::D isconnectTerminal 调用时递减该计数。 在 ITTerminal::get_State 中,如果此计数等于一次可以选择终端的最大流数,则它应返回TS_INUSE;否则,它应返回TS_NOTINUSE。 请注意,如果限制为 1,则计数可以是布尔值或TERMINAL_STATE值。

ITTerminal::get_Name

终端应返回其选择的 BSTR 名称,通过 SysAllocString 分配。 此名称应该对用户有意义,并且应进行本地化。

ITTerminal::get_MediaType

终端应返回其媒体类型,TAPIMEDIATYPE_AUDIO或TAPIMEDIATYPE_VIDEO。

ITTerminal::get_Direction

终端返回指示终端方向的TERMINAL_DIRECTION枚举值。 例如,如果终端是双向 (桥) ,则必须返回TD_BIDIRECTIONAL。

终端必须仅) 实现 ITTerminalControl (vtable。

ITTerminalControl::get_AddressHandle

应用程序提供的终端应始终返回 NULL 作为地址句柄。 这向 MSP 指示此终端不是在特定 MSP 地址对象上创建的。

ITTerminalControl::ConnectTerminal

在此调用中,终端会将其筛选器 () 添加到给定图形,并将它们相互连接(如果适用)。 然后,终端应返回引脚 () 由终端公开的指定流方向。

不支持并发连接到多个流的终端会将内部变量设置为在成功完成此方法时TS_INUSE。

终端可以使用此调用中的 dwTerminalDirection 参数来确定要连接到的流的方向。 这是双向终端所必需的。

注意

通常 (MSP 基类和所有已知 MSP) 中,如果终端从单个 ConnectTerminal 调用返回多个引脚,MSP 流代码将使连接失败。 这很好,因为在连接期间返回多个引脚的终端需要 MSP 对终端有专业知识才能有效地利用额外的引脚。

 

ITTerminalControl::CompleteConnectTerminal

终端应仅返回S_OK。 如果需要,终端还可以执行连接后初始化。

ITTerminalControl::D isconnectTerminal

终端应执行所需的一切操作来断开终端与图形其余部分的连接。 这通常涉及从图形中删除所有终端的筛选器,并将终端状态设置为TS_NOTINUSE。

ITTerminalControl::RunRenderFilter

终端应仅返回E_NOTIMPL。

ITTerminalControl::StopRenderFilter

终端应仅返回E_NOTIMPL。