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


/*-------------------------------------------------------------------------
 * rtpclose.c - rtpclose
 *-------------------------------------------------------------------------
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 

/*------------------------------------------------------------------------
 * rtpclose - close the rtp session pointed to by psn
 *------------------------------------------------------------------------
 */
int
rtpclose(struct session *psn)
{

	bool false = FALSE;

	/* 
	 * Stop threads cleanly.
	 */
	rtpctl(psn, RTP_CTL_RTCPRECVTHREAD, (char *) &false, 0, 0);
	rtpctl(psn, RTP_CTL_RTPRECVTHREAD, (char *) &false, 0, 0);
	rtpctl(psn, RTP_CTL_RTCPCYCLETHREAD, (char *) &false, 0, 0);

	/*
	 * Send RTCP bye message to group.
	 */
	rtcpsendbye(psn, "Leaving");

	/*
	 * Release all resources.
	 */
	close(psn->sn_rtpfd);
	close(psn->sn_rtcpfd);

	htdestroy(psn->sn_cnames);
	htdestroy(psn->sn_ssrcs);
  
	bufpooldestroy(&psn->sn_bpool);
	free(psn->sn_cyclesources);
	free(psn->sn_cyclebuf);

	/* assume no mutexes held at this point */
	pthread_cond_destroy(&psn->sn_cond);
	pthread_mutex_destroy(&psn->sn_mutex);
	pthread_mutex_destroy(&psn->sn_rtpthrmutex);
	pthread_mutex_destroy(&psn->sn_rtcpthrmutex);
	pthread_mutex_destroy(&psn->sn_rtcpcyclethrmutex);
	pthread_mutex_destroy(&psn->sn_getstreammutex);
	pthread_mutex_destroy(&psn->sn_cnamemutex);

	free(psn);
	return OK;
}