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

📄 synctl.c

📁 linux环境下用纯c写的RTP协议的通用开发库
💻 C
字号:
/*------------------------------------------------------------------------- * synctl.c - synctl *------------------------------------------------------------------------- */#include <syn.h>#include <util.h>#include <signal.h>/*------------------------------------------------------------------------ * synctl - miscelaneous functions for synch layer session * Values are passed in and out by reference. The caller must ensure * that a pointer to the correct type (e.g., a bool * when expected) * is passed. *------------------------------------------------------------------------ */intsynctl(struct synsession *pssn, int command, char *arg, ssrc_t ssrc){	struct synstream *psstm;	mediatime_t      begin, end;#ifdef RTPLIB_SYNCHRONIZE	int              i;#endif /* RTPLIB_SYNCHRONIZE */	/*	 * Commands that do not refer to a particular stream.	 */	switch(command) {	case SYN_CTL_GETRTPSESSION:		*((struct session **) arg) = pssn->ssn_session;		return OK;#ifdef RTPLIB_SYNCHRONIZE	case SYN_CTL_ADDSYNCFD:	case SYN_CTL_REMSYNCFD:		if (pthread_mutex_lock(&pssn->ssn_mutex) != 0)			return ERROR; 		if (command == SYN_CTL_ADDSYNCFD) {   			for (i = 0; i < SYN_FDCNT; i++)				if (pssn->ssn_syncfds[i] == SYN_BADFD)					pssn->ssn_syncfds[i] = *((int *) arg);		}		if (command == SYN_CTL_REMSYNCFD) {			for (i = 0; i < SYN_FDCNT; i++)				if (pssn->ssn_syncfds[i] == *((int *) arg))					pssn->ssn_syncfds[i] = SYN_BADFD;		}		/* wake receive thread */		pthread_mutex_lock(&pssn->ssn_recvthrmutex);		if (pssn->ssn_recvthrstat == THR_RUNNING) {			pthread_kill(pssn->ssn_recvthr, SIGHUP);			pthread_mutex_unlock(&pssn->ssn_mutex);		}		pthread_mutex_unlock(&pssn->ssn_recvthrmutex);		return OK;#endif /* RTPLIB_SYNCHRONIZE */	} /* switch(command) */	/*	 * Commands that refer to a particular stream.	 */	psstm = syngetstream(pssn, ssrc);	if (psstm == NULL)		return ERROR;	switch(command) {	case SYN_CTL_STREAM_GETREADFLAGS:		*((int *) arg) = psstm->sstm_readflags;		break;	case SYN_CTL_STREAM_SETREADFLAGS:		psstm->sstm_readflags = *((int *) arg);		break;	case SYN_CTL_STREAM_ISBUFFERING:		*((bool *) arg) = psstm->sstm_buffering;		break;	case SYN_CTL_STREAM_GETCLKRT:		*((int *) arg) = psstm->sstm_clkrt;		break;	case SYN_CTL_STREAM_GETTYPE:		*((int *) arg) = psstm->sstm_type;		break;	case SYN_CTL_STREAM_GETLASTREAD:		*((mediatime_t *) arg) = psstm->sstm_lastread;		break;	case SYN_CTL_STREAM_GETPARAM:		*((void **) arg) = psstm->sstm_parameters;		break;    	case SYN_CTL_STREAM_GETLEEWAY:		/*		 * Convert timespec_t to microsec.		 */		*((unsigned int *) arg) = (psstm->sstm_leewayts.tv_sec * 100000) + (psstm->sstm_leewayts.tv_nsec / 1000);		break;    	case SYN_CTL_STREAM_SETLEEWAY:		/*		 * Convert from microsec to media time ticks.		 */		psstm->sstm_leeway = (mediatime_t) (((double) *((mediatime_t *) arg) * (double) psstm->sstm_clkrt) / 1000000.0);		/*		 * Convert from microsec to timespec		 */		psstm->sstm_leewayts = timeunflatten(*((mediatime_t *) arg), 1000000);		break;	case SYN_CTL_STREAM_GETJITTHRESH:		*((mediatime_t *) arg) = psstm->sstm_jitthresh;		break;	case SYN_CTL_STREAM_SETJITTHRESH:		psstm->sstm_jitthresh = *((mediatime_t *) arg);		break;    	case SYN_CTL_STREAM_GETBUFSPAN:		if (synbufspan(pssn, psstm, &begin, &end) == ERROR) {			synreleasestream(pssn, psstm);			return ERROR;		}		*((unsigned int *) arg) = end - begin;		break;	}  	synreleasestream(pssn, psstm);	return OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -