📄 synctl.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 + -