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