| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- #include "StdAfx.h"
- #include "Meeting.h"
- #include "MeetingPool.h"
- #include "DspChannel.h"
- #include "MC.h"
- #include "OneLeg.h"
- CMeeting::CMeeting(CMeetingPool* pParent, int Id) : m_pParent(pParent), m_Id(Id)
- {
- ASSERT(pParent != NULL);
- }
- CMeeting::~CMeeting(void)
- {
- }
- /*****************************************************************
- **【函数名称】 __findAttendee
- **【函数功能】 查找与会者
- **【参数】
- **【返回值】
- ****************************************************************/
- CDspChannel* CMeeting::__findAttendee( COneLeg* pAttendee, bool IsRemove )
- {
- CDspChannel* pDspChan = NULL;
- LONG Key = reinterpret_cast<LONG>(pAttendee);
- if(m_AttendeeMap.Lookup(Key, pDspChan))
- {
- ASSERT(pDspChan != NULL);
- if(IsRemove)
- m_AttendeeMap.RemoveKey(Key);
- }
- return pDspChan;
- }
- /*****************************************************************
- **【函数名称】 accept
- **【函数功能】 接受与会者
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CMeeting::accept( COneLeg* pAttendee, bool IsOneWay )
- {
- ASSERT(pAttendee != NULL);
- CDspChannel* pDspAttendee = __findAttendee(pAttendee, false);
- if(pDspAttendee != NULL)
- return false;
- pDspAttendee = m_pParent->allocDspChan();
- if(pDspAttendee == NULL)
- return false;
- // 通道与DSP之间建立连接
- if(!CMC::GetInstance().bridgeDevice(pAttendee->routeChannel(), pDspAttendee, true, false))
- return false;
- pDspAttendee->joinMeeting();
- // 加入会议
- MS_CDT cdt;
- cdt.chan_num = pDspAttendee->handle();
- cdt.chan_sel = MSPN_DXCH;
- cdt.chan_attr = IsOneWay ? MSPA_MODERECVONLY : MSPA_MODEFULLDUPLX;
- if(ISX_dcb_addtoconf(m_pParent->handle(), m_Id, &cdt) == 0)
- {
- m_AttendeeMap.SetAt(reinterpret_cast<LONG>(pAttendee), pDspAttendee);
- return true;
- }
- else
- {
- CMC::GetInstance().bridgeDevice(pAttendee->routeChannel(), pDspAttendee, false, false);
- pDspAttendee->quitMeeting();
- return false;
- }
- }
- /*****************************************************************
- **【函数名称】 remove
- **【函数功能】 删除与会者
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CMeeting::remove( COneLeg* pAttendee )
- {
- ASSERT(pAttendee != NULL);
- CDspChannel* pDspAttendee = __findAttendee(pAttendee, true);
- if(pDspAttendee == NULL)
- return false;
- MS_CDT cdt;
- cdt.chan_num = pDspAttendee->handle();
- cdt.chan_sel = MSPN_DXCH;
- cdt.chan_attr = 0;
- ISX_dcb_remfromconf(m_pParent->handle(), m_Id, &cdt);
- pDspAttendee->reset();
- CMC::GetInstance().bridgeDevice(pAttendee->routeChannel(), pDspAttendee, false, false);
- pDspAttendee->quitMeeting();
- return true;
- }
- /*****************************************************************
- **【函数名称】 record
- **【函数功能】 为与会者录音
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CMeeting::record( COneLeg* pAttendee, RecordContent* pContent, bool IsStop )
- {
- ASSERT(pAttendee != NULL);
- CDspChannel* pDspAttendee = __findAttendee(pAttendee, false);
- if(pDspAttendee == NULL)
- return false;
- if(IsStop)
- return pDspAttendee->stopRecord();
- else
- return pDspAttendee->startRecord(pContent);
- }
- /*****************************************************************
- **【函数名称】 mute
- **【函数功能】 静音
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CMeeting::mute( COneLeg* pAttendee, bool IsOff )
- {
- ASSERT(pAttendee != NULL);
- CDspChannel* pDspAttendee = __findAttendee(pAttendee, false);
- if(pDspAttendee == NULL)
- return false;
- MS_CDT cdt;
- cdt.chan_num = pDspAttendee->handle();
- cdt.chan_sel = MSPN_DXCH;
- cdt.chan_attr = IsOff ? MSPA_MODEFULLDUPLX : MSPA_MODERECVONLY;
- return ISX_dcb_setcde(m_pParent->handle(), m_Id, &cdt) == 0;
- }
|