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