修改三方通话功能,在发起三方通话时,先保持住主叫,然后再拉回主叫到会议

PlaySoundReq.cpp 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include "StdAfx.h"
  2. #include "PlaySoundReq.h"
  3. #include "ProxyExten.h"
  4. #include "ControlShell.h"
  5. #include "ProxyShell.h"
  6. #include "MC.h"
  7. CPlaySoundReq::CPlaySoundReq(CProxyShell* pParent, CPduEntity& ReqPdu) : CReqBase(pParent, ReqPdu)
  8. {
  9. }
  10. CPlaySoundReq::~CPlaySoundReq(void)
  11. {
  12. }
  13. /*****************************************************************
  14. **【函数名称】 request
  15. **【函数功能】 发出请求(命令方式)
  16. **【参数】
  17. **【返回值】
  18. ****************************************************************/
  19. bool CPlaySoundReq::request( void )
  20. {
  21. // 初始化放音内容
  22. PlayVoiceContent content;
  23. memset(&content, 0, sizeof(PlayVoiceContent));
  24. content.nModel = (PlayVoiceMode)m_ReqPdu.GetDataInt(3);
  25. content.nDtmfCount = m_ReqPdu.GetDataInt(9);
  26. content.nDtmfPeriod = m_ReqPdu.GetDataInt(10);
  27. content.nTts = m_ReqPdu.GetDataInt(4); // TTS类型
  28. content.nTtsDigitMode = m_ReqPdu.GetDataInt(5); // TTS数字播报模式
  29. content.nTtsSpeed = m_ReqPdu.GetDataInt(7); // TTS语速
  30. content.nTtsVolume = m_ReqPdu.GetDataInt(8); // TTS音量
  31. content.cDtmfEnd = m_ReqPdu.GetDataString(11).GetAt(0);
  32. sprintf_s(content.szFileName, MAX_PATH, _T("%s"), m_ReqPdu.GetDataString(12));
  33. // 放音启动日志
  34. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 线路[%lu]放音收号, FileName = %s, Mode = %lu"),
  35. m_pHostLine->lineId(), content.szFileName, content.nModel);
  36. // 启动放音
  37. return CMC::GetInstance().playSound(m_pHostLine->devId(), &content);
  38. }
  39. /*****************************************************************
  40. **【函数名称】 cancel
  41. **【函数功能】 操作取消(命令方式)
  42. **【参数】
  43. **【返回值】
  44. ****************************************************************/
  45. bool CPlaySoundReq::cancel( long InstanceCancel )
  46. {
  47. // 放音停止日志
  48. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 线路[%lu]取消放音收号"), m_pHostLine->lineId());
  49. m_InstanceCancel = InstanceCancel;
  50. CMC::GetInstance().playStop(m_pHostLine->devId());
  51. end(false, NULL);
  52. // 返回
  53. return true;
  54. }
  55. /*****************************************************************
  56. **【函数名称】 hangUp
  57. **【函数功能】 操作中挂机(命令方式)
  58. **【参数】
  59. **【返回值】
  60. ****************************************************************/
  61. bool CPlaySoundReq::hangUp( long InstanceHangUp )
  62. {
  63. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 线路[%lu]放音收号因挂机取消"), m_pHostLine->lineId());
  64. return CMC::GetInstance().playStop(m_pHostLine->devId());
  65. }
  66. /*****************************************************************
  67. **【函数名称】 end
  68. **【函数功能】 操作完成
  69. **【参数】 IsSucceed 操作是否成功
  70. lpData 随路数据
  71. **【返回值】
  72. ****************************************************************/
  73. void CPlaySoundReq::end( bool IsSucceed, LPCTSTR lpData )
  74. {
  75. if(IsSucceed)
  76. {
  77. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{LineReq}: 线路[%lu]放音收号成功"), m_pHostLine->lineId());
  78. }
  79. else
  80. {
  81. LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{LineReq}: 线路[%lu]放音收号失败"), m_pHostLine->lineId());
  82. } // end if
  83. // 返回执行结果
  84. if(m_InstanceCancel != 0)
  85. {
  86. m_pParent->notifyReqResult(m_ReqPdu, m_InstanceCancel, !IsSucceed, lpData);
  87. } // end if
  88. m_pParent->onLineReqEnd(this, IsSucceed, lpData);
  89. }
  90. /*****************************************************************
  91. **【函数名称】 onDevChEvent
  92. **【函数功能】 线路向上层发送的设备主动事件
  93. **【参数】 pEventLine 触发事件的线路
  94. EvtType 事件类型
  95. lpContent 事件内容
  96. **【返回值】
  97. *****************************************************************/
  98. void CPlaySoundReq::onDevChEvent( CVirtualProxy* pEventLine, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent )
  99. {
  100. if(EvtType == DEV_CH_EVT_PLAY_END)
  101. {
  102. if(lpContent == CONST_ERR_PLAY_AUDIO)
  103. end(false, NULL);
  104. else
  105. end(true, lpContent);
  106. }
  107. }
  108. /*****************************************************************
  109. **【函数名称】 onLineStateChanged
  110. **【函数功能】 线路状态变化事件响应接口
  111. **【参数】 pEventLine 状态变化的线路实体指针
  112. LineState 线路当前状态
  113. Call 主呼叫ID
  114. SubCall 子呼叫ID
  115. lpCallerNum 主叫号码
  116. lpCalleeNum 被叫号码
  117. **【返回值】
  118. ****************************************************************/
  119. void CPlaySoundReq::onLineStateChanged( CVirtualProxy* pEventLine, VIRTUAL_LINE_STATE LineState, long Call, long SubCall, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  120. {
  121. // 正在放音时外线挂机
  122. if(LineState == VIRTUAL_LINE_STATE_FREE)
  123. end(false, NULL);
  124. }