Example #1
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;
	}
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;
}