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


/*-------------------------------------------------------------------------
 * syneventloop.c - syneventloop, synprocessevent
 *-------------------------------------------------------------------------
 */

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

#define DEBUG(x)
/*------------------------------------------------------------------------
 * syneventloop - loop to receive events needed by the synchronization 
 * layer.
 *------------------------------------------------------------------------
 */
void
syneventloop(struct synsession *pssn)
{

	char buf[1024];
	struct event *pe;
	int eventlen;

	/*
	 * Initialize by setting signal handler, then signal condition to
	 * indicate that initialization is complete. This code prevents
	 * rtpctl from sending a SIGTERM *before* the handler is installed.
	 */
	pthread_mutex_lock(&pssn->ssn_eventthrmutex);

	signal(SIGTERM, nullfcn);
	pssn->ssn_eventthrstat = THR_RUNNING;
	pthread_cond_signal(&pssn->ssn_cond);

	pthread_mutex_unlock(&pssn->ssn_eventthrmutex);

	pe = (struct event *) buf;
  
	while(TRUE) {
		eventlen = eventqnext(&pssn->ssn_events, pe, sizeof(buf));

		/*
		 * Check if a SIGTERM has been received.
		 * If so, return.
		 */
		pthread_mutex_lock(&pssn->ssn_eventthrmutex);
		if (pssn->ssn_eventthrstat == THR_TERMINATE) {
			pssn->ssn_eventthrstat = THR_NOTRUNNING;
			pthread_cond_signal(&pssn->ssn_cond);
			pthread_mutex_unlock(&pssn->ssn_eventthrmutex);
			return;
		}
		pthread_mutex_unlock(&pssn->ssn_eventthrmutex);

		if (eventlen == ERROR)
			continue;

		synprocessevent(pssn, pe, eventlen);
	}
}

/*------------------------------------------------------------------------
 * synprocessevent - process an event
 *------------------------------------------------------------------------
 */
int
synprocessevent(struct synsession *pssn, struct event *pevent, int eventlen)
{

#ifdef RTPLIB_SYNCHRONIZE
	char cname[256];
#endif /* RTPLB_SYNCHRONIZE */

	switch(pevent->ev_type) {
	case EVENT_RTP:
	case EVENT_RTP_HEAD:
		synnewdata(pssn, pevent->ev_ssrc);
		break;
    
	case EVENT_RTCP_BYE:
	case EVENT_PARTICIPANT_TIMEOUT:
	case EVENT_PARTICIPANT_ENCODING:
		synstreamoff(pssn, pevent->ev_ssrc);
		break;

	case EVENT_PARTICIPANT_SEQGAP:
		synrebuffer(pssn, pevent->ev_ssrc);
		break;
    
	case EVENT_RTCP_SDES_CNAME:
	case EVENT_RTCP_SR:
#ifdef RTPLIB_SYNCHRONIZE
		rtpctl(pssn->ssn_session, RTP_CTL_STREAM_GETCNAME, cname, 256, pevent->ev_ssrc);
		synsynchronize(pssn, cname);

		/*
		 * Turn off the sender report event. We only needed the first SR
		 * to map the media time to the sender's wallclock.
		 */
		if (pevent->ev_type == EVENT_RTCP_SR)
			eventqfilterssrc(&pssn->ssn_events, EVENT_RTCP_SR, pevent->ev_ssrc, FALSE);
#endif /* RTPLIB_SYNCHRONIZE */
		break;
	}
	return OK;
}