Example #1
0
	// OnRtpHandler
	virtual void onReceiveEvent(CRTPData::pointer receiveData, DoRtpHandler::pointer pDoRtpHandler, void * rtpParam)
	{
		BOOST_ASSERT (receiveData.get() != 0);
		if (m_commHandler.get() != NULL)
		{
			// ?
			unsigned long destIp = receiveData->destip();
			unsigned int  destPort = receiveData->destport();
			u_long remoteAddrHash = destIp + destPort;

			cgcRemote::pointer pCgcRemote;
			if (!m_mapCgcRemote.find(remoteAddrHash, pCgcRemote, false))
			{
				pCgcRemote = cgcRemote::pointer(new CcgcRemote(destIp, destPort, (CRemoteHandler*)this, m_pDoRtpHandler));
				m_mapCgcRemote.insert(remoteAddrHash, pCgcRemote);
			}else if (pCgcRemote->isInvalidate())
			{
				m_mapCgcRemote.remove(remoteAddrHash);
				pCgcRemote = cgcRemote::pointer(new CcgcRemote(destIp, destPort, (CRemoteHandler*)this, m_pDoRtpHandler));
				m_mapCgcRemote.insert(remoteAddrHash, pCgcRemote);
			}else
			{
				((CcgcRemote*)pCgcRemote.get())->SetRemote(destIp, destPort);
			}
			CRtpRemoteInfo::pointer pEventData = CRtpRemoteInfo::create(CCommEventData::CET_Recv);
			pEventData->setRemote(pCgcRemote);
			pEventData->setRemoteId(pCgcRemote->getRemoteId());
			pEventData->recvdata(receiveData);
			m_listMgr.add(pEventData);
		}
	}
void CConferenceInfo::doAudioProc(void)
{
	bool bGetTempMember = false;
	CLockMap<CConferenceMember*, CMemberData::pointer> toSendMembers;
	CLockList<CMemberData::pointer> memberTemps;

	while (!m_killed)
	{
		CMemberData::pointer memberData;
		if (bGetTempMember)
		{
			if (!memberTemps.front(memberData, true))
			{
				bGetTempMember = false;
				continue;
			}

		}else if (!m_datasa.front(memberData, true))
		{
#ifdef WIN32
			Sleep(20);
#else
			usleep(20000);
#endif
			continue;
		}

		CConferenceMember * pDataConferenceMember = (CConferenceMember*)memberData->getRtpParam();
		if (pDataConferenceMember->getClosed() || pDataConferenceMember->getAudioHandler() == 0 || pDataConferenceMember->getVideoHandler() == 0)
		{
			continue;
		}

		BOOST_ASSERT (pDataConferenceMember->getAudioHandler().get() == memberData->getDoRtpHandler().get());

		if (toSendMembers.exist(pDataConferenceMember))
		{
			if (toSendMembers.size() < (unsigned int)countAudioMember())
			{
				setToMemberFront(memberTemps, memberData);
				bGetTempMember = false;
				continue;
			}

			sendAudioFrame(toSendMembers);
			toSendMembers.clear(false);
		}

		toSendMembers.insert(pDataConferenceMember, memberData);
		bGetTempMember = !memberTemps.empty();
	}

}
Example #3
0
	bool eraseIsInvalidated(void)
	{
		boost::mutex::scoped_lock lock(m_mapCgcRemote.mutex());
		CLockMap<unsigned long, cgcRemote::pointer>::iterator pIter;
		for (pIter=m_mapCgcRemote.begin(); pIter!=m_mapCgcRemote.end(); pIter++)
		{
			cgcRemote::pointer pCgcRemote = pIter->second;
			if (pCgcRemote->isInvalidate())
			{
				m_mapCgcRemote.erase(pIter);
				return true;
			}
		}
		return false;
	}
void CConferenceInfo::sendAudioFrame(const CLockMap<CConferenceMember*, CMemberData::pointer> & audios)
{
	if (audios.empty()) return;

	boost::mutex::scoped_lock lock(m_members.mutex());
	CLockMap<void*, CConferenceMember::pointer>::iterator iter;
	for (iter=m_members.begin(); iter!= m_members.end(); iter++)
	{
		// member don't receive audio
		if (!iter->second->getAudioRecv())
			continue;

		int timestamp = 0;
		if (mix_member_frame(iter->second, audios, timestamp))
		{
			DoRtpHandler::pointer pDoRtpHandler = iter->second->getAudioHandler();

			long sendSize = 0;
			unsigned char * tempBuffer = 0;
			encode_audio(pDoRtpHandler->doGetMediaType(), iter->second->audioBuffer(), &tempBuffer, sendSize);

			//int timestamp = 0;			
			pDoRtpHandler->doSendData(tempBuffer, sendSize, timestamp);
			delete[] tempBuffer;
		}
	}

}
Example #5
0
void CRtp::stopRtp(DoRtpHandler::pointer handler)
{
	CRtpProxy::pointer rtpProxy;
	if (m_rtpProxy.find(handler.get(), rtpProxy, true))
	{
		//handler->doSetRtpHandler(0);
		rtpProxy->DestroySession();
		handler->doSetRtpHandler(0);
	}
}
Example #6
0
DoRtpHandler::pointer CRtp::startRtp(unsigned short rtpPort)
{
	DoRtpHandler::pointer nullResult;
	CRtpProxy::pointer rtpProxy = CRtpProxy::create();
	CRtpProxy::InitComm();
	if (rtpProxy->InitSession(rtpPort) != 0)
		return nullResult;

	DoRtpHandler * handler = (DoRtpHandler*)rtpProxy.get();
	m_rtpProxy.insert(handler, rtpProxy);
	return rtpProxy;
	//return handler;
}
bool CConferenceInfo::mix_member_frame(CConferenceMember::pointer member, const CLockMap<CConferenceMember*, CMemberData::pointer> & audios, int & outTimestamp)
{
	BOOST_ASSERT (member.get() != 0);

	if (member->getClosed()) return false;

	bool result = false;
	bool first = true;
	boost::mutex::scoped_lock lock(const_cast<boost::mutex&>(audios.mutex()));
	CLockMap<CConferenceMember*, CMemberData::pointer>::const_iterator iter;
	for (iter=audios.begin(); iter!= audios.end(); iter++)
	{
		if (iter->second->getRtpParam() == member.get())
			continue;

		if (iter->second->isSilence())
			continue;

		result = true;
		member->audioBuffer()->remalloc(iter->second->getRtpData()->size());

		if (first)
		{
			first = false;
			member->audioBuffer()->set(iter->second->getRtpData()->data(), iter->second->getRtpData()->size());
		}else
		{
			mix_slinear_frames((char*)const_cast<void*>(member->audioBuffer()->buffer()), (const char*)iter->second->getRtpData()->data(), iter->second->getRtpData()->size()/2);
		}

		if (iter->second->getRtpData()->timestamp() > (unsigned int)outTimestamp)
			outTimestamp = iter->second->getRtpData()->timestamp();
	}

	return result;
}
Example #8
0
	virtual void finalService(void)
	{
		if (!m_bServiceInited) return;

		cgcObject::pointer eventPointer = theAppAttributes->removeAttribute(EVENT_ATTRIBUTE, this);
		CIDEvent * pIDEvent = (CIDEvent*)eventPointer.get();
		if (pIDEvent != NULL)
		{
			for (unsigned int i=pIDEvent->m_nCurIDEvent; i<pIDEvent->m_nCurIDEvent+pIDEvent->m_nCapacity; i++)
				theApplication->KillTimer(i);
		}

		m_mapCgcRemote.clear();
		m_listMgr.clear();

		DoRtpHandler::pointer pDoRtpHandlerTemp = m_pDoRtpHandler;
		m_pDoRtpHandler.reset();
		m_rtpService->stopRtp(pDoRtpHandlerTemp);
		m_bServiceInited = false;
		CGC_LOG((LOG_INFO, _T("**** [%s:%d] Stop succeeded ****\n"), serviceName().c_str(), m_commPort));
	}
Example #9
0
static bool testLockMap()
{
    CLockMap<int, std::string> map;
    typedef CLockMap<int, std::string>::guard_type guard_type;
    std::string s;
    for(int i = 0;i < 100;++i){
        s.push_back('a' + i % 26);
        if(!map.insertL(make_pair(i, s))){
            cerr<<"map.insertL(value_type={"<<i<<", '"<<s<<"'}) failed\n";
            return false;
        }
    }
    if(map.Size() != 100){
        cerr<<"1: map.Size()="<<map.Size()<<" is not 100\n";
        return false;
    }
    for(int i = 100;i < 200;++i){
        s.push_back('a' + i % 26);
        if(!map.insertL(i, s)){
            cerr<<"map.insertL("<<i<<", '"<<s<<"') failed\n";
            return false;
        }
    }
    if(map.Size() != 200){
        cerr<<"map.Size()="<<map.Size()<<" is not 200\n";
        return false;
    }
    for(int i = 200;i > 100;--i){
        int j = i - 1;
        {
            guard_type g(map.GetLock());
            if(s != map[j]){
                cerr<<"map["<<j<<"]='"<<map[j]<<"' is not '"<<s<<"'\n";
                return false;
            }
        }
        map.eraseL(j);
        if(!s.empty())
            s.resize(s.size() - 1);
    }
    if(map.Size() != 100){
        cerr<<"2: map.Size()="<<map.Size()<<" is not 100\n";
        return false;
    }
    for(int i = 100;i > 0;--i){
        int j = i - 1;
        std::string v;
        if(!map.pickL(j, v)){
            cerr<<"map.pickL("<<j<<") return false\n";
            return false;
        }
        if(s != v){
            cerr<<"map["<<j<<"]='"<<v<<"' is not '"<<s<<"'\n";
            return false;
        }
        if(!s.empty())
            s.resize(s.size() - 1);
    }
    if(map.Size() != 0){
        cerr<<"map.Size()="<<map.Size()<<" is not 0\n";
        return false;
    }
    return true;
}