#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(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(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; }