MiddleWares_YiHe 郑州颐和医院随访系统中间件

OpPlayAndDtmf.cpp 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #include "StdAfx.h"
  2. #include "OpPlayAndDtmf.h"
  3. #include "ChanTrunk.h"
  4. #include "OperationReactor.h"
  5. #include "FsProxy.h"
  6. #include "ChanExten.h"
  7. COpPlayAndDtmf::COpPlayAndDtmf(COperationReactor* pParent, LONG Instance) : COperation(pParent, Instance),m_Dtmf("")
  8. {
  9. m_bExecuteEnd = FALSE;
  10. m_bDtmfEnd = FALSE;
  11. m_bDtmfFinish = FALSE;
  12. ZeroMemory(&m_PlayContent, sizeof(m_PlayContent));
  13. }
  14. COpPlayAndDtmf::~COpPlayAndDtmf(void)
  15. {
  16. }
  17. /*****************************************************************
  18. **【函数名称】 _end
  19. **【函数功能】 操作完成
  20. **【参数】 IsSucceed 操作是否成功
  21. lpData 随路数据
  22. **【返回值】
  23. ****************************************************************/
  24. void COpPlayAndDtmf::_end( bool IsSucceed )
  25. {
  26. if(IsSucceed)
  27. {
  28. LOGGER(LOG_LEVEL_NORMAL, _T("{OpPlayAndDtmf}: 中继[%lu]放音收号成功, DTMF = %s"), m_pHostChan->no(), m_Dtmf);
  29. }
  30. else
  31. {
  32. LOGGER(LOG_LEVEL_WARNING, _T("{OpPlayAndDtmf}: 中继[%lu]放音收号失败, DTMF = %s"), m_pHostChan->no(), m_Dtmf);
  33. }
  34. // 返回执行结果
  35. if(m_InstanceCancel != FS_LINK_INSTANCE_INVALID)
  36. m_pParent->onOpResult(m_InstanceCancel, !IsSucceed);
  37. m_pParent->onOpResult(m_Instance, this, IsSucceed, m_Dtmf);
  38. }
  39. /*****************************************************************
  40. **【函数名称】 start
  41. **【函数功能】 执行操作
  42. **【参数】
  43. **【返回值】
  44. *****************************************************************/
  45. bool COpPlayAndDtmf::start( LineOpParam* pParam )
  46. {
  47. //修改为分机的通道
  48. if (m_pHostChan->state() == CHAN_LOGIC_STATE_TALKING && pParam == NULL)
  49. {
  50. m_bExecuteEnd = FALSE;
  51. m_bDtmfEnd = FALSE;
  52. m_bDtmfFinish = FALSE;
  53. // 初始化放音内容
  54. ZeroMemory(&m_PlayContent, sizeof(m_PlayContent));
  55. m_PlayContent.nModel = (PlayVoiceMode)2;
  56. lstrcpy(m_PlayContent.szFileName, "E:\\middleware_YiHe\\middleware_YiHe\\wav\\keep.mp3");
  57. //lstrcpy(m_PlayContent.szFileName, "E:\\midware\\ivr\\ivr_Rongji\\wav\\保持音.wav");
  58. //m_PlayContent.nDtmfCount = 1;
  59. //m_PlayContent.nDtmfPeriod = 0 ;
  60. //m_PlayContent.cDtmfEnd = '#';
  61. m_PlayContent.nTts = 1; // TTS类型
  62. //m_PlayContent.nTtsDigitMode = 1; // TTS数字播报模式
  63. m_PlayContent.nTtsSpeed = 50; // TTS语速
  64. m_PlayContent.nTtsVolume = 50; // TTS音量
  65. // 放音启动日志
  66. LOGGER(LOG_LEVEL_NORMAL, _T("{OpPlayAndDtmf}: 中继[%lu]放音收号, FileName = %s, Mode = %lu"),
  67. m_pHostChan->no(), m_PlayContent.szFileName, m_PlayContent.nModel);
  68. return CFsProxy::GetInstance().playAndDtmf(dynamic_cast<CChanExten*>(m_pHostChan), &m_PlayContent);
  69. //CFsProxy::GetInstance().ExtenPlayback(uniqueId(), dynamic_cast<CChanExten*>(m_pHostChan), &m_PlayContent);
  70. }
  71. // 当前的分机通道播放声音,之前的standby限制了cti中的与中继的通信消息传递
  72. /*if(m_pHostChan->state() != CHAN_LOGIC_STATE_STANDBY)
  73. return false;*/
  74. else
  75. {
  76. m_bExecuteEnd = FALSE;
  77. m_bDtmfEnd = FALSE;
  78. m_bDtmfFinish = FALSE;
  79. // 初始化放音内容
  80. ZeroMemory(&m_PlayContent, sizeof(m_PlayContent));
  81. m_PlayContent.nModel = (PlayVoiceMode)pParam->nParam1;
  82. lstrcpy(m_PlayContent.szFileName, pParam->szParam3);
  83. m_PlayContent.nDtmfCount = pParam->nParam7;
  84. m_PlayContent.nDtmfPeriod = pParam->nParam8;
  85. m_PlayContent.cDtmfEnd = pParam->szParam1[0];
  86. m_PlayContent.nTts = pParam->nParam2; // TTS类型
  87. m_PlayContent.nTtsDigitMode = pParam->nParam3; // TTS数字播报模式
  88. m_PlayContent.nTtsSpeed = pParam->nParam5; // TTS语速
  89. m_PlayContent.nTtsVolume = pParam->nParam6; // TTS音量
  90. // 放音启动日志
  91. LOGGER(LOG_LEVEL_NORMAL, _T("{OpPlayAndDtmf}: 中继[%lu]放音收号, FileName = %s, Mode = %lu"),
  92. m_pHostChan->no(), m_PlayContent.szFileName, m_PlayContent.nModel);
  93. return CFsProxy::GetInstance().playAndDtmf(dynamic_cast<CChanTrunk*>(m_pHostChan), &m_PlayContent);
  94. }
  95. }
  96. /*****************************************************************
  97. **【函数名称】 cancel
  98. **【函数功能】 取消操作
  99. **【参数】
  100. **【返回值】
  101. *****************************************************************/
  102. bool COpPlayAndDtmf::cancel( LONG InstanceCancel )
  103. {
  104. // 放音停止日志
  105. LOGGER(LOG_LEVEL_NORMAL, _T("{OpPlayAndDtmf}: 中继[%lu]取消放音收号"), m_pHostChan->no());
  106. m_InstanceCancel = InstanceCancel;
  107. if(CFsProxy::GetInstance().cancel(dynamic_cast<CChanTrunk*>(m_pHostChan)))
  108. {
  109. _end(false);
  110. return true;
  111. }
  112. else
  113. {
  114. return false;
  115. }
  116. }
  117. /*****************************************************************
  118. **【函数名称】 hangup
  119. **【函数功能】 操作中挂机
  120. **【参数】
  121. **【返回值】
  122. *****************************************************************/
  123. bool COpPlayAndDtmf::hangup( LONG InstanceHangup )
  124. {
  125. if(m_InstanceCancel != FS_LINK_INSTANCE_INVALID)
  126. return false;
  127. LOGGER(LOG_LEVEL_NORMAL, _T("{OpPlayAndDtmf}: 中继[%lu]放音收号中挂机"), m_pHostChan->no());
  128. m_InstanceCancel = InstanceHangup;
  129. if(CFsProxy::GetInstance().hangup(dynamic_cast<CChanTrunk*>(m_pHostChan)))
  130. {
  131. _end(false);
  132. return true;
  133. }
  134. else
  135. {
  136. return false;
  137. }
  138. }
  139. /*****************************************************************
  140. **【函数名称】 onHostChanDtmf
  141. **【函数功能】 关联通道DTMF处理
  142. **【参数】
  143. **【返回值】
  144. *****************************************************************/
  145. void COpPlayAndDtmf::onHostChanDtmf( LPCTSTR Dtmf )
  146. {
  147. ASSERT(Dtmf != NULL);
  148. m_Dtmf += Dtmf;
  149. if (m_PlayContent.nDtmfCount <= m_Dtmf.GetLength())
  150. {
  151. m_bDtmfEnd = TRUE; // 收号完成
  152. }
  153. if (m_bExecuteEnd == TRUE && m_bDtmfEnd == TRUE) // 如果 onChanAppExecuted 先执行完成
  154. {
  155. _end(true);
  156. return;
  157. }
  158. else if (m_bDtmfEnd == TRUE)
  159. {
  160. m_bDtmfFinish = TRUE;
  161. return;
  162. }
  163. }
  164. /*****************************************************************
  165. **【函数名称】 onHostChanStateUpdated
  166. **【函数功能】 关联通道状态更新处理
  167. **【参数】
  168. **【返回值】
  169. *****************************************************************/
  170. void COpPlayAndDtmf::onHostChanStateUpdated( CVirtualChan* pHostChan )
  171. {
  172. if (m_pHostChan == NULL) return;
  173. // by 将挂断操作标记修改为true
  174. if (m_pHostChan->state() == CHAN_LOGIC_STATE_FREE)
  175. _end(false);
  176. }
  177. /*****************************************************************
  178. **【函数名称】 onChanAppExecuted
  179. **【函数功能】 通道任务执行结束事件处理
  180. **【参数】
  181. **【返回值】
  182. *****************************************************************/
  183. void COpPlayAndDtmf::onChanAppExecuted( CVirtualChan* pHostChan, PAPP_EXEC_NOTIFY pNotify )
  184. {
  185. ASSERT(pNotify != NULL);
  186. if (pNotify == NULL)
  187. return;
  188. if (lstrcmp(pNotify->App, ESL_APP_PLAY_DTMF) == 0 || lstrcmp(pNotify->App, ESL_APP_PLAY) == 0)
  189. {
  190. if (m_PlayContent.nModel == PVM_PLAY_WAIT_DIGIT || m_PlayContent.nModel == PVM_WAIT_DIGIT)
  191. {
  192. if (m_bDtmfFinish == TRUE)
  193. {
  194. _end(true);
  195. return;
  196. }
  197. }
  198. else
  199. {
  200. _end(true);
  201. return;
  202. }
  203. m_bExecuteEnd = TRUE;
  204. return;
  205. }
  206. }