📄 syneventloop.c
字号:
/*------------------------------------------------------------------------- * syneventloop.c - syneventloop, synprocessevent *------------------------------------------------------------------------- */#include <syn.h>#include <event.h>#include <hash.h>#include <stdlib.h>#include <stdio.h>#include <signal.h>#include <util.h>#define DEBUG(x)/*------------------------------------------------------------------------ * syneventloop - loop to receive events needed by the synchronization * layer. *------------------------------------------------------------------------ */voidsyneventloop(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 *------------------------------------------------------------------------ */intsynprocessevent(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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -