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

Meeting.cpp 3.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "StdAfx.h"
  2. #include "Meeting.h"
  3. #include "MeetingPool.h"
  4. #include "DspChannel.h"
  5. #include "MC.h"
  6. #include "OneLeg.h"
  7. CMeeting::CMeeting(CMeetingPool* pParent, int Id) : m_pParent(pParent), m_Id(Id)
  8. {
  9. ASSERT(pParent != NULL);
  10. }
  11. CMeeting::~CMeeting(void)
  12. {
  13. }
  14. /*****************************************************************
  15. **【函数名称】 __findAttendee
  16. **【函数功能】 查找与会者
  17. **【参数】
  18. **【返回值】
  19. ****************************************************************/
  20. CDspChannel* CMeeting::__findAttendee( COneLeg* pAttendee, bool IsRemove )
  21. {
  22. CDspChannel* pDspChan = NULL;
  23. LONG Key = reinterpret_cast<LONG>(pAttendee);
  24. if(m_AttendeeMap.Lookup(Key, pDspChan))
  25. {
  26. ASSERT(pDspChan != NULL);
  27. if(IsRemove)
  28. m_AttendeeMap.RemoveKey(Key);
  29. }
  30. return pDspChan;
  31. }
  32. /*****************************************************************
  33. **【函数名称】 accept
  34. **【函数功能】 接受与会者
  35. **【参数】
  36. **【返回值】
  37. ****************************************************************/
  38. bool CMeeting::accept( COneLeg* pAttendee, bool IsOneWay )
  39. {
  40. ASSERT(pAttendee != NULL);
  41. CDspChannel* pDspAttendee = __findAttendee(pAttendee, false);
  42. if(pDspAttendee != NULL)
  43. return false;
  44. pDspAttendee = m_pParent->allocDspChan();
  45. if(pDspAttendee == NULL)
  46. return false;
  47. // 通道与DSP之间建立连接
  48. if(!CMC::GetInstance().bridgeDevice(pAttendee->routeChannel(), pDspAttendee, true, false))
  49. return false;
  50. pDspAttendee->joinMeeting();
  51. // 加入会议
  52. MS_CDT cdt;
  53. cdt.chan_num = pDspAttendee->handle();
  54. cdt.chan_sel = MSPN_DXCH;
  55. cdt.chan_attr = IsOneWay ? MSPA_MODERECVONLY : MSPA_MODEFULLDUPLX;
  56. if(ISX_dcb_addtoconf(m_pParent->handle(), m_Id, &cdt) == 0)
  57. {
  58. m_AttendeeMap.SetAt(reinterpret_cast<LONG>(pAttendee), pDspAttendee);
  59. return true;
  60. }
  61. else
  62. {
  63. CMC::GetInstance().bridgeDevice(pAttendee->routeChannel(), pDspAttendee, false, false);
  64. pDspAttendee->quitMeeting();
  65. return false;
  66. }
  67. }
  68. /*****************************************************************
  69. **【函数名称】 remove
  70. **【函数功能】 删除与会者
  71. **【参数】
  72. **【返回值】
  73. ****************************************************************/
  74. bool CMeeting::remove( COneLeg* pAttendee )
  75. {
  76. ASSERT(pAttendee != NULL);
  77. CDspChannel* pDspAttendee = __findAttendee(pAttendee, true);
  78. if(pDspAttendee == NULL)
  79. return false;
  80. MS_CDT cdt;
  81. cdt.chan_num = pDspAttendee->handle();
  82. cdt.chan_sel = MSPN_DXCH;
  83. cdt.chan_attr = 0;
  84. ISX_dcb_remfromconf(m_pParent->handle(), m_Id, &cdt);
  85. pDspAttendee->reset();
  86. CMC::GetInstance().bridgeDevice(pAttendee->routeChannel(), pDspAttendee, false, false);
  87. pDspAttendee->quitMeeting();
  88. return true;
  89. }
  90. /*****************************************************************
  91. **【函数名称】 record
  92. **【函数功能】 为与会者录音
  93. **【参数】
  94. **【返回值】
  95. ****************************************************************/
  96. bool CMeeting::record( COneLeg* pAttendee, RecordContent* pContent, bool IsStop )
  97. {
  98. ASSERT(pAttendee != NULL);
  99. CDspChannel* pDspAttendee = __findAttendee(pAttendee, false);
  100. if(pDspAttendee == NULL)
  101. return false;
  102. if(IsStop)
  103. return pDspAttendee->stopRecord();
  104. else
  105. return pDspAttendee->startRecord(pContent);
  106. }
  107. /*****************************************************************
  108. **【函数名称】 mute
  109. **【函数功能】 静音
  110. **【参数】
  111. **【返回值】
  112. ****************************************************************/
  113. bool CMeeting::mute( COneLeg* pAttendee, bool IsOff )
  114. {
  115. ASSERT(pAttendee != NULL);
  116. CDspChannel* pDspAttendee = __findAttendee(pAttendee, false);
  117. if(pDspAttendee == NULL)
  118. return false;
  119. MS_CDT cdt;
  120. cdt.chan_num = pDspAttendee->handle();
  121. cdt.chan_sel = MSPN_DXCH;
  122. cdt.chan_attr = IsOff ? MSPA_MODEFULLDUPLX : MSPA_MODERECVONLY;
  123. return ISX_dcb_setcde(m_pParent->handle(), m_Id, &cdt) == 0;
  124. }