⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syneventloop.c

📁 linux环境下用纯c写的RTP协议的通用开发库
💻 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 + -