www.pudn.com > RTP通用开发库(for Linux).rar > synclose.c


/*-------------------------------------------------------------------------
 * synclose.c - synclose
 *-------------------------------------------------------------------------
 */

#include 
#include 
#include 

/*------------------------------------------------------------------------
 * synclose - close a synchronization layer session
 *------------------------------------------------------------------------
 */

#define SYNCLOSE_SOURCESBUFSZ 128

int
synclose(struct synsession *pssn)
{
	
	ssrc_t	sources[SYNCLOSE_SOURCESBUFSZ];
	int		ssrccount, i;

	/*
	 * Cleanly stop any threads run at this layer for 
	 * this synchronization session.
	 */
	stopthread(&pssn->ssn_eventthr, &pssn->ssn_eventthrmutex, &pssn->ssn_cond, &pssn->ssn_eventthrstat);

#ifdef RTPLIB_SYNCHRONIZE
	stopthread(&pssn->ssn_recvthr, &pssn->ssn_recvthrmutex, &pssn->ssn_cond, &pssn->ssn_recvthrstat);
#endif /* RTPLIB_SYNCHRONIZE */

	/*
	 * Turn off all streams.
	 */
	while (TRUE) {
		ssrccount = synsources(pssn, sources, SYNCLOSE_SOURCESBUFSZ);
		if (ssrccount > 0) 
			for (i = 0; i < ssrccount; i++)
				synstreamoff(pssn, sources[i]);
		else
			break;
	}

	/*
	 * Release all resources, including the RTP layer session.
	 */
	htdestroy(pssn->ssn_ssrcs);

	rtpctl(pssn->ssn_session, RTP_CTL_REMEVENTQUEUE, (void *) &pssn->ssn_events, 0, 0);
	eventqdestroy(&pssn->ssn_events);

	pthread_mutex_destroy(&pssn->ssn_getstreammutex);
	pthread_mutex_destroy(&pssn->ssn_mutex);
	pthread_mutex_destroy(&pssn->ssn_eventthrmutex);
	pthread_mutex_destroy(&pssn->ssn_recvthrmutex);
	rtpclose(pssn->ssn_session);
  
	free(pssn);

	return OK;
}