Handoffs
当应用程序具有通信会话的所有者 权限 时,应用程序可以选择将所有权移交给另一个应用程序。 切换操作通常用于允许更改呼叫的媒体类型。 新媒体类型的最高优先级应用程序应接受并处理调用。 媒体类型更改通常出于以下原因之一。
用户命令: 通过用户界面或窗口消息,应用程序会了解到本地用户想要更改媒体类型。 例如,用户已告诉新的目标应用程序 (尚未成为所有者) 获取用于传输数据的现有语音呼叫。 目标应用程序现在必须控制调用。 在这种情况下,当前所有者注意到所有者数量增加,然后放弃对呼叫的控制。 或者,用户可以指示呼叫的当前所有者将其交给可以处理新媒体类型的应用程序。
媒体类型更改: 服务提供商可以检测媒体类型更改。 例如,本地应用程序正在向呼叫方播放录制的语音消息。 在此消息期间,呼叫者自发地决定传输传真呼叫音,本地应用程序可以通过将媒体类型更改为传真并在必要时将呼叫移交给传真应用程序来做出相应的响应。 另一种工作方式是,监视应用程序启用媒体类型监视,当在呼叫中检测到它感兴趣的媒体类型时,它可以请求呼叫的所有权。 此机制使每个应用程序无需监视每个媒体类型的每个调用。
远程方命令: 远程方可以在现有调用期间以交互方式指示媒体类型的变化,例如,如果本地应用程序正在监视远程调用方的 DTMF 输入。 例如,通过此监视,调用方指示即将发送传真。 调用方可以控制本地应用程序的其他方式是使用在其他数据连接上接收的命令,以及通过 ISDN 用户信息消息接收的命令。
呼叫切换将具有以下结果之一:
- 该调用将 (SUCCESS) 向另一个应用程序发出。
- 移交应用程序本身是 TARGETSELF) (目标。
- 切换失败 (TARGETNOTFOUND) 。
如果接收接听呼叫的应用程序已具有呼叫的调用句柄,则使用此旧调用句柄。 否则,将创建新的调用句柄。 在任一情况下,应用程序最终都拥有调用的所有者权限。 每当移交应用程序与目标应用程序不同时,目标在会话状态消息中通知有关移交的信息,就像它正在接收新调用一样。
如果当前所有者应用程序被告知要更改媒体类型,则它通过将调用移交给用于目标媒体类型的应用程序来执行此操作。 定向接听和媒体类型接听中介绍了两种类型的呼叫切换。
并非所有服务提供商都支持使用此操作。
TAPI 2.x: 请参阅 lineHandoff,其中 lpszFileName 设置为直接切换的应用程序名称,或 dwMediaMode 设置为一种媒体类型以进行间接切换。
TAPI 3.x: 请参阅 ITBasicCallControl::HandoffDirect、 ITBasicCallControl::HandoffIndirect。
定向交接
当目标应用程序按名称知道原始应用程序时,将发生 定向切换 。 例如,在同一供应商编写的一组应用程序中会发生这种情况。 用户通常可以配置对定向切换的控制。 使用这种切换,如果指定的应用程序打开了调用所在的行,则会向指定应用程序发出调用。 忽略应用程序打开行时指定的媒体类型。 一个常见示例是同一呼叫中的语音呼叫后跟传真传输。 定向切换通常由同一开发人员的应用程序使用,这些应用程序也以其他方式链接。
将来的版本中还可以使用定向切换,作为仲裁多个应用程序等待相同媒体类型的传入调用过程的一部分,选择应用程序以基于数据链接或更高级别的协议检测而不是媒体类型来处理调用。 其用法的一个示例是传入数据调制解调器线路,其中包含远程接管、公告板、远程网络访问和远程电子邮件访问等应用程序,所有这些应用程序都同时等待呼叫。
媒体类型切换
当存在新的定向媒体类型时,通常当拥有的应用程序确定调用所需的媒体类型不存在或即将更改时,将发生媒体类型 切换 。
如果媒体类型 UNKNOWN 位处于打开状态,则依赖于媒体的切换过程可以是探测过程。 拥有的应用程序负责循环浏览媒体类型以查找优先级最高的应用程序。 TAPI 仅在初始传入呼叫中执行此循环以查找第一个所有者。 它不对切换操作执行此操作。 否则,切换与对应用程序调用的初始分配几乎相同。 区别在于,只能为间接 (媒体类型设置一种媒体类型) 切换。
由于只能指定单个媒体类型位,因此会为该媒体类型的最高优先级应用程序提供调用。 但是,可能会考虑多个媒体类型进行切换。 在这种情况下,移交应用程序应将可能媒体类型的最高优先级指定为参数。
如果应用程序在执行媒体类型切换时指定未知位,而切换失败,则表示当前未运行能够执行媒体类型确定的未知应用程序。 然后,正在移交的应用程序应尝试将调用移交给为下一个更高媒体类型注册的最高优先级应用程序。
接收应用程序现在负责呼叫。 现在,它会探测调用的实际媒体类型。 如果应用程序可以处理调用的媒体类型,则必须确保它是为该媒体类型注册的最高优先级应用程序。 如果是这样,它将保持调用并正常处理。 如果没有,它会将调用交给为该媒体类型注册的另一个应用程序。
但是,如果针对该媒体类型的探测失败,应用程序将再次探测,尝试剩余的媒体模式可能性。 它必须首先关闭当前媒体类型位,然后尝试使用其他类型进行另一个切换。
此探测和移交过程仍在继续,其余媒体类型将逐一消除。 在此过程中,其中一个应用程序可能会看到它处理的媒体类型正在调用,并且切换成功。
然后,应用程序应设置正确的媒体类型并清除所有其他媒体类型位。 这会通知其他感兴趣的应用程序正确的媒体类型。 这些其他应用程序会收到一条事件通知消息,指出呼叫的媒体类型已更改。