升龙物业 老版本 ocx IPO, 加密狗 转值班电话

Mixer.cpp 6.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. #include "StdAfx.h"
  2. #include "Mixer.h"
  3. #include "MC.h"
  4. #include "DspChannel.h"
  5. CMixer::CMixer(IMixerHost& Host) : m_Host(Host), m_pPlayDsp(NULL), m_pRecordDsp(NULL), m_pMonitorChan(NULL)
  6. {
  7. }
  8. CMixer::~CMixer(void)
  9. {
  10. }
  11. /*****************************************************************
  12. **【函数名称】 __attachDspCh
  13. **【函数功能】 关联放音DSP通道
  14. **【参数】
  15. **【返回值】 成功true,失败false
  16. ****************************************************************/
  17. bool CMixer::__attachPlayDsp( void )
  18. {
  19. CDspChannel* pDspCh = m_pPlayDsp;
  20. if(pDspCh == NULL)
  21. {
  22. pDspCh = CMC::GetInstance().allocDspCh(m_Host.node(), DEVICE_BRD_NO_ANY);
  23. ASSERT(pDspCh != NULL);
  24. if(pDspCh == NULL)
  25. return false;
  26. }
  27. if(ISX_nr_scroute(m_Host.mixHandle(), m_Host.normalType(), pDspCh->handle(), pDspCh->type(), SC_FULLDUP) == 0)
  28. {
  29. m_pPlayDsp = pDspCh;
  30. pDspCh->attach(this);
  31. return true;
  32. }
  33. return false;
  34. }
  35. /*****************************************************************
  36. **【函数名称】 __detachDsp
  37. **【函数功能】 解关联放音DSP通道
  38. **【参数】
  39. **【返回值】
  40. ****************************************************************/
  41. void CMixer::__detachPlayDsp( void )
  42. {
  43. if(m_pPlayDsp == NULL)
  44. return;
  45. m_pPlayDsp->attach(NULL);
  46. m_pPlayDsp->reset();
  47. ISX_nr_scunroute(m_Host.mixHandle(), m_Host.normalType(), m_pPlayDsp->handle(), m_pPlayDsp->type(), SC_FULLDUP);
  48. m_pPlayDsp = NULL;
  49. }
  50. /*****************************************************************
  51. **【函数名称】 __attachRecordDsp
  52. **【函数功能】 关联录音DSP通道
  53. **【参数】
  54. **【返回值】 成功true,失败false
  55. ****************************************************************/
  56. bool CMixer::__attachRecordDsp( void )
  57. {
  58. CDspChannel* pDspCh = m_pRecordDsp;
  59. if(pDspCh == NULL)
  60. {
  61. pDspCh = CMC::GetInstance().allocDspCh(m_Host.node(), DEVICE_BRD_NO_ANY);
  62. ASSERT(pDspCh != NULL);
  63. if(pDspCh == NULL)
  64. return false;
  65. }
  66. if(ISX_nr_scroute(m_Host.mixHandle(), m_Host.mixType(), pDspCh->handle(), pDspCh->type(), SC_HALFDUP) == 0)
  67. {
  68. m_pRecordDsp = pDspCh;
  69. pDspCh->attach(this);
  70. return true;
  71. }
  72. return false;
  73. }
  74. /*****************************************************************
  75. **【函数名称】 __detachDsp
  76. **【函数功能】 解关联录音DSP通道
  77. **【参数】
  78. **【返回值】
  79. ****************************************************************/
  80. void CMixer::__detachRecordDsp( void )
  81. {
  82. if(m_pRecordDsp == NULL)
  83. return;
  84. m_pRecordDsp->attach(NULL);
  85. m_pRecordDsp->reset();
  86. ISX_nr_scunroute(m_Host.mixHandle(), m_Host.mixType(), m_pRecordDsp->handle(), m_pRecordDsp->type(), SC_HALFDUP);
  87. m_pRecordDsp = NULL;
  88. }
  89. /*****************************************************************
  90. **【函数名称】 playSound
  91. **【函数功能】 放音
  92. **【参数】
  93. **【返回值】
  94. ****************************************************************/
  95. bool CMixer::playSound( PlayVoiceContent* pContent )
  96. {
  97. if(!__attachPlayDsp())
  98. return false;
  99. return m_pPlayDsp->playSound(pContent);
  100. }
  101. /*****************************************************************
  102. **【函数名称】 playTone
  103. **【函数功能】 播放信号音
  104. **【参数】 Type 信号音类型
  105. **【返回值】
  106. ****************************************************************/
  107. bool CMixer::playTone( int Type )
  108. {
  109. if(Type == CHANNEL_TONE_NULL)
  110. {
  111. if(m_pPlayDsp == NULL)
  112. return false;
  113. __detachPlayDsp();
  114. return true;
  115. }
  116. else
  117. {
  118. if(!__attachPlayDsp())
  119. return false;
  120. return m_pPlayDsp->playTone(Type);
  121. }
  122. }
  123. /*****************************************************************
  124. **【函数名称】 playStop
  125. **【函数功能】 停止放音
  126. **【参数】
  127. **【返回值】
  128. ****************************************************************/
  129. bool CMixer::playStop( void )
  130. {
  131. if(m_pPlayDsp == NULL)
  132. return false;
  133. __detachPlayDsp();
  134. return true;
  135. }
  136. /*****************************************************************
  137. **【函数名称】 startRecord
  138. **【函数功能】 开始录音
  139. **【参数】
  140. **【返回值】
  141. ****************************************************************/
  142. bool CMixer::startRecord( RecordContent* pContent )
  143. {
  144. ASSERT(pContent != NULL);
  145. if(m_pRecordDsp == NULL)
  146. if(!__attachRecordDsp())
  147. return false;
  148. return m_pRecordDsp->startRecord(pContent);
  149. }
  150. /*****************************************************************
  151. **【函数名称】 stopRecord
  152. **【函数功能】 停止录音
  153. **【参数】
  154. **【返回值】
  155. ****************************************************************/
  156. bool CMixer::stopRecord( void )
  157. {
  158. if(m_pRecordDsp == NULL)
  159. return false;
  160. return m_pRecordDsp->stopRecord();
  161. }
  162. /*****************************************************************
  163. **【函数名称】 release
  164. **【函数功能】 释放资源
  165. **【参数】
  166. **【返回值】
  167. ****************************************************************/
  168. void CMixer::release( void )
  169. {
  170. if(m_pMonitorChan != NULL)
  171. {
  172. ISX_nr_scunroute(m_Host.mixHandle(), m_Host.mixType(), m_pMonitorChan->handle(), m_pMonitorChan->type(), SC_HALFDUP);
  173. m_pMonitorChan = NULL;
  174. }
  175. __detachPlayDsp();
  176. __detachRecordDsp();
  177. }
  178. /*****************************************************************
  179. **【函数名称】 setupMonitor
  180. **【函数功能】 建立监听
  181. **【参数】
  182. **【返回值】
  183. ****************************************************************/
  184. bool CMixer::setupMonitor( CChannelResource* pMonitorParty )
  185. {
  186. ASSERT(pMonitorParty != NULL);
  187. ASSERT(m_pRecordDsp == NULL); // 录音DSP必须为空,否则混音线路的+R端非空闲,则无法实现监听
  188. if(ISX_nr_scroute(m_Host.mixHandle(), m_Host.mixType(), pMonitorParty->handle(), pMonitorParty->type(), SC_HALFDUP) == 0)
  189. {
  190. m_pMonitorChan = pMonitorParty;
  191. return true;
  192. }
  193. return false;
  194. }
  195. /*****************************************************************
  196. **【函数名称】 undoMonitor
  197. **【函数功能】 撤销监听
  198. **【参数】
  199. **【返回值】
  200. ****************************************************************/
  201. bool CMixer::undoMonitor( CChannelResource* pMonitorParty )
  202. {
  203. if(m_pMonitorChan != NULL)
  204. {
  205. ASSERT(m_pMonitorChan == pMonitorParty);
  206. ISX_nr_scunroute(m_Host.mixHandle(), m_Host.mixType(), m_pMonitorChan->handle(), m_pMonitorChan->type(), SC_HALFDUP);
  207. m_pMonitorChan = NULL;
  208. return true;
  209. }
  210. return false;
  211. }
  212. /*****************************************************************
  213. **【函数名称】 onPlayEnd
  214. **【函数功能】 放音完毕的处理函数
  215. **【参数】
  216. **【返回值】
  217. ****************************************************************/
  218. void CMixer::onPlayEnd( LPCTSTR lpDtmf )
  219. {
  220. //__detachPlayDsp(); 因为毅航设备DTMF检测不建议随机使用DSP通道,故中继线路转坐席之前如要放音则使用同一DSP通道
  221. m_Host.onPlayEnd(lpDtmf);
  222. }
  223. /*****************************************************************
  224. **【函数名称】 undoMonitor
  225. **【函数功能】 录音完毕的处理函数
  226. **【参数】
  227. **【返回值】
  228. ****************************************************************/
  229. void CMixer::onRecEnd( UINT TaskId )
  230. {
  231. __detachRecordDsp();
  232. m_Host.onRecEnd(TaskId);
  233. }
  234. /*****************************************************************
  235. **【函数名称】 undoMonitor
  236. **【函数功能】 Tone音完毕的处理函数
  237. **【参数】
  238. **【返回值】
  239. ****************************************************************/
  240. void CMixer::onToneEnd( int ToneTp )
  241. {
  242. __detachPlayDsp();
  243. m_Host.onToneEnd(ToneTp);
  244. }