处理实时通信事件
一旦事件处理器被IRTCEventNotification接收端注册,那么接收和处理实时通信事件就非常简单了。 当实时通信事件被样例应用程序接收的时候,应用程序的事件处理程序发送一个消息到这个应用程序的消息处理程序。 OnRTCEvent()函数处理所有的由应用程序接收的所有的不同类型的事件。
| OnRTCEvent(UINT message, WPARAM wParam, LPARAM lParam) { // Based on the RTC_EVENT type, query for the // appropriate event interface and call a helper // method to handle the event switch ( wParam ) { …. …. …. case RTCE_MEDIA: { IRTCMediaEvent * pEvent = NULL; hr = pDisp->QueryInterface( IID_IRTCMediaEvent, (void **)&pEvent ); if (SUCCEEDED(hr)) { OnRTCMediaEvent(pEvent); SAFE_RELEASE(pEvent); } } break; …. …. …. } |
创建一个通信会话
在能够使用实时通信之前,必须创建和初始化一个通信会话。然后你就可以输入参与者的IP地址来开始通话了。也可以通过输入一个电子邮件地址或者一个电话号码来激活一个通信会话。然而,这个函数需要SIP注册服务器,这在本文讨论范围之外了。我们将在下篇文章中谈谈这个话题。
实时通信不支持多个视频会议会话同时运行,所以这个应用程序在初始化一个新的会话之前,必须首先检验目前没有运行视频会议会话。在第一个发行版本中,Windows实时通信客户端只支持多个电话到电话的通信会话,而不支持多个音频与视频或者只有音频的会议。
为了与另一台计算机通话,需要识别实时通信会话类型并创建一个使用IRTCSession接口的会话类型。下面的代码说明如何创建会话。
| HRESULT CAVDConfDlg::MakeCall(RTC_SESSION_TYPE enType, BSTR bstrURI) { ... // Create the session IRTCSession * pSession = NULL; hr = m_pClient->CreateSession(enType, NULL, NULL, 0, &pSession); // Add the participant to the session hr = pSession->AddParticipant(bstrURI, NULL, &m_Participant); ... return S_OK; } |
处理实时流会话事件
根据会话类型,可能有RTC媒体事件、音频强度事件、即时消息事件和会话状态改变等。
媒体事件
处理媒体事件需要取得媒体类型,然后取得事件类型和原因,然后把消息发送到会话窗口。 应用程序可以使用get_MediaType()方法接收用于音频、视频、T120和实时转送协议(RTP)事件的消息。 样例应用程序说明了如何检索媒体事件并且把它传送到媒体对话框。
| void CAVDConfDlg::OnRTCMediaEvent(IRTCMediaEvent *pEvent) { ... hr = pEvent->get_MediaType(&lMediaType); hr = pEvent->get_EventType(&enType); hr = pEvent->get_EventReason(&enReason); if ((m_AVDlg) && (m_AVDlg.GetState () != RTCSS_IDLE)) { // Deliver the media state to the session window m_AVDlg.DeliverMedia(lMediaType, enType, enReason); } } |
强度事件
强度事件是当扬声器或者麦克风设备的强度等级改变的时候发生的事件。 应用程序可以使用get_Direction ()函数获得改变的音频设备。 一旦设备被确定,应用程序可以取得当前的设备属性和处理改变。 应用程序可以通过一个滑动器控件或者音量表来向用户显示音量大小的改变。
| void CAVDConfDlg::OnRTCIntensityEvent(IRTCIntensityEvent *pEvent) { ... hr = pEvent->get_Direction(&enDevice); hr = pEvent->get_Level(&lLevel); hr = pEvent->get_Min(&lMin); hr = pEvent->get_Max(&lMax); if (m_AVDlg.GetState () != RTCSS_IDLE) { // Deliver the intensity state to the session window m_AVDlg.DeliverIntensity(enDevice, lLevel); } } |
即时消息事件
即时报文信息通过IRTCMessagingEvent接口在参与者之间传送。 当一个消息事件发生时,这个应用程序必须获得会话和事件类型并且取得会话相关的参与者,以便消息可以被发送到相应的参与者。 事件处理程序也可以处理参与者会话状态的任何改变。
| HRESULT CAVDConfDlg::OnRTCMessagingEvent(IRTCMessagingEvent *pEvent) { ... hr = pEvent->get_Session(&pSession); hr = pEvent->get_EventType(&enType); hr = pEvent->get_Participant(&pParticipant); if (enType == RTCMSET_MESSAGE) { hr = pEvent->get_MessageHeader(&bstrContentType); hr = pEvent->get_Message(&bstrMessage); // Deliver the message to the session window if (m_cMessageDlg) m_cMessageDlg.DeliverMessage(pParticipant, bstrContentType, bstrMessage); } else if (enType == RTCMSET_STATUS) { hr = pEvent->get_UserStatus(&enStatus); // Deliver the user status to the session window m_cMessageDlg.DeliverUserStatus(pParticipant, enStatus); } return S_OK; } |
会话状态改变事件
会话状态改变遵循和其他实时通信事件一样的过程。 会话状态改变可能包括设置一个新的音频/视频会话或者向客户端通知一条即时消息即将到来。下面的例程说明当一条通信会话请求被接收时发生了什么;一声铃声通知客户端请求到来,请求被应答,然后通信会话开始。
| Void CAVDConfDlg::OnRTCSessionStateChangeEvent(IRTCSessionStateChangeEvent *pEvent) { ... hr = pEvent->get_State(&enState); hr = pEvent->get_Session(&pSession); switch ( enState ) { case RTCSS_INCOMING: { ... // This event is called when an incoming call occurs RTC_SESSION_TYPE enType; hr = pSession->get_Type(&enType); // Ring the bell m_pClient->PlayRing(RTCRT_PHONE, VARIANT_TRUE); // Accept the session hr = pSession->Answer(); } } ... } |
共享应用程序
启动T120应用程序共享就象调用IRTCClient接口相关的StartT120Applet方法一样简单。
| hr = m_pClient->StartT120Applet ( RTCTA_APPSHARING ); |
支持白板
为了添加白板支持到应用程序中,需要使用RTCTA_WHITEBOARD枚举调用StartT120Applet方法。
hr = m_pClient->StartT120Applet ( RTCTA_WHITEBOARD );
结束会话
为了结束一个通信会话,所有运行的应用程序必须被关闭。然后实时通信客户端接口调用ShutDown()和完成结束通信会话的过程。
平台性能
使用实时通信的丰富客户端通信特点需要一个有合适性能的处理器。 在下面例程中,在运行实时通信性能的时候使用一个1 GHz的 Pentium? III处理器和一个2.2 GHz的Pentium 4来测定处理器使用率。 下面的表格给出了使用本文中提到的实时通信性能的处理器使用率的百分率。
| 任务 | 2.2-GHz 的Pentium 4处理器 (% CPU使用率)1 | 1.0-GHz的Pentium III 处理器 (% CPU 使用率)2 |
| 只使用音频/视频会议 | 9% | 22% |
| 添加应用程序(共享IE) | 10% | 35% |
| 添加白板 | 12% | 37% |
| 添加即时消息 | 12% | 37% |
注1 Pentium 4处理器平台配置:Intel Desktop Board D850MV; 256MB PC800 RDRAM,板载的声卡,nVidia GeForce 2 Ultra显卡;Windows XP Professional
注2 Pentium III 处理器平台配置:Intel Desktop Board VC820;256MB PC133 SDRAM,nVidia GeForce 2 Ultra显卡,Creative Sound Blaster Live声卡,Windows XP Professional
小结
在Windows XP下使用时实通信客户端应用程序接口已经大大的简化了开发通信工具的难度。 开发者可以快速地设计、定型和开发他们的通信应用程序。 现有的音频与视频会议应用程序可以通过添加丰富的通信性能而受益于实时通信。 使用实时通信应用程序接口开发应用程序也受益于一个统一通信协议。 这增加了你的应用程序与其它的正文信息和音频/视频会议应用程序的相互适应性。结合了Intel处理器和Microsoft Windows XP的强大功能的实时通信应用程序接口给你带来了一个终端通信经历的革命。
本文源代码下载专题:http://www.qqread.com/soft-engineering/z578186102.html
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Solaris基础知识入门 (4642篇文章)
- 热门通信技术专区 (2016篇文章)
- 通信技术专题 (2016篇文章)
- 程序员如何保证代码正确 (3次浏览)
- 配置管理变更的关键路径 (1次浏览)
- 关于tomcat配置文件 (0次浏览)
- 构架SOA应用的10条原则 (0次浏览)
- 访IBM副总裁:飞向SOA (0次浏览)
- 发挥 Tomcat 在 Geronimo 中强大功能 (0次浏览)
- 处理OpenOffice.org基于XML的文档格式 (0次浏览)
- XFire:轻松简单地开发Web Services (0次浏览)
- Windows或开源:企业级OS之争趋势如何? (0次浏览)
- 浅析软件项目进度管理中的积习流弊 (0次浏览)



