// 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(); } }
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; } } }
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); } }
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; }
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)); }
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; }