ENDPT_410_ProcessVrgEndptModifyConnection

state = GetEndptState( lineId );	//获取线路对象

//合法性模式校验
if (!IsCnxModeSupported(cnxParam->mode, dspNum))
	return ( EPSTATUS_UNSUPPORTED_MODE );

//合法性资源ID校验
for( cnxIndex = 0; cnxIndex < VRG_ENDPT_CFG_MAX_CNX_PER_ENDPT; cnxIndex++ )
	if ((state->cnx[cnxIndex]) && (state->cnx[cnxIndex]->cnxId == cnxId))
		break;
if (cnxIndex == VRG_ENDPT_CFG_MAX_CNX_PER_ENDPT)
	return ( EPSTATUS_CNX_UNKNOWN );

cnx = state->cnx[cnxIndex];	//获取资源对象

cnx->dataMode = cnxParam->dataMode;
if( cnxParam->dataMode == EPDATAMODE_VBD )	//如果当前为VBD模式
	//如果当前配置为动态JB时,给DSP设置静态JB值
	if(cnx->vrgVoiceJBFixed == VRG_FALSE)
		hdspVhdSetJitterBuffer( cnx->vhdhdl, VRG_TRUE, 0, cnxParam->JBMax,
		cnxParam->JBTarget, cnxParam->JBTarget, cnx->ajcCustomReg);
else if( ( cnxParam->dataMode == EPDATAMODE_NONE ) )	//如果当前为语音模式
	//给DSP设置动态JB值
hdspVhdSetJitterBuffer( cnx->vhdhdl, VRG_FALSE, 0, cnxParam->JBMax,
	cnxParam->JBTarget, cnxParam->JBTarget, cnx->ajcCustomReg);

//保存
cnx->vrgVoiceJBFixed = ( cnxParam->dataMode == EPDATAMODE_VBD );
cnx->vrgVoiceJBMin = 0;
cnx->vrgVoiceJBMax = cnxParam->JBMax;
cnx->vrgVoiceJBTarget = cnxParam->JBTarget;
cnx->vrgDataJBTarget  = cnxParam->JBTarget;

//如果当前已经在T38模式,并且设置了保持当前传真模式时,则不进行处理
if( (cnx->vhdMode == NETMODE_FAXRELAY) && (cnxParam->preserveFaxMode) )
	return ( EPSTATUS_SUCCESS );

//设置RTP payload映射表。该函数在《ENDPT_410_ProcessVrgEndptCreateConnection.doc》
//中有注释说明,这里不再说明。
SetRtpPayloadTypes( cnx, &cnxParam->cnxParmList );

//设置当前资源VHD与线路VHD或其它资源VHD的关联。该函数在
//《ENDPT_410_ProcessVrgEndptCreateConnection.doc》中有注释说明,这里不再说明。
UpdateSBMasks( state->cnx[cnxIndex], cnxParam->mode);

//根据上层设置回声消除开关
if (cnxParam->echocancel)
	EcanProcessStm(state, ECANEVT_MDCX_ON);
else
	EcanProcessStm(state, ECANEVT_MDCX_OFF);

//如果当前编码不支持10MS速率,但新的编码类型支持10MS速率
if ( IS_NON_10MS_CODEC(cnx->codecType) && 
(!( IS_NON_10MS_CODEC(cnxParam->cnxParmList.send.codecs[0].type))))
	//当前线路对象只关联一个资源对象时,复位当前呼叫
	vrgEndptResetBuildOut( lineId, state->lineVhdHdl );

switch( cnxParam->mode )
case EPCNXMODE_SNDO:	//仅发送
case EPCNXMODE_RCVO:	//仅接收
case EPCNXMODE_SNDRX:	//发送/接收
case EPCNXMODE_LOOP:	//环回测试
case EPCNXMODE_TEST:		//连续性测试,不明白
case EPCNXMODE_REPLCATE:	//重复性测试,不明白
case EPCNXMODE_CONF:		//会议模式
case EPCNXMODE_TRANSCODE:	//编码转换模式
	//如果当前首选发送编码非T38类型时
	if ( !( cnxParam->cnxParmList.send.codecs[0].type == CODEC_T38 || 
	cnxParam->cnxParmList.send.codecs[0].type == CODEC_T38_MUTE ) )
		//如果当前编码为VBD冗余,则设置VBD标记
		if( (cnxParam->cnxParmList.send.codecs[0].type == CODEC_RED) &&
		(state->cnx[cnxIndex]->vbData.bEnabled == VRG_FALSE) )
			state->cnx[cnxIndex]->vbData.bEnabled = VRG_TRUE;
		
		//如果当前正在T38模式,需要切到VBD模式,是设置VBD标记
		if( (cnx->dataMode != cnxParam->dataMode) && (cnx->vhdMode == 
		NETMODE_FAXRELAY) )
			state->cnx[cnxIndex]->vbData.bEnabled = VRG_TRUE;
		
		//因为上面是否设置了VBD标记,则控制设置为语音状态还是VBD状态,该函数
		//在《ENDPT_410_ProcessVrgEndptCreateConnection.doc》中有注释说明,这里不
//再说明。
		SetVoiceMode( state->cnx[cnxIndex], VM_ACTIVE );

case EPCNXMODE_INACT:	//去激活模式
	//如果当前在非语音状态,或者在T38状态
	if ( cnx->voiceMode != VM_ACTIVE || cnx->vhdMode == NETMODE_FAXRELAY )
		SaveConnectionOptions( cnx, cnxParam );	//保存部分连接配置选项
		return ( EPSTATUS_SUCCESS );
	else	//否则在语音状态
		//如果当前模式有变更,并且非回路测试模式,并且需要给远端放回铃音时
		if( (state->cnx[cnxIndex]->mode != cnxParam->mode) && (cnxParam->mode != 
		EPCNXMODE_LOOP) && cnx->activeSignal )
			cnxParam->mode = state->cnx[cnxIndex]->mode;	//维持先前连接模式
			SaveConnectionOptions( cnx, cnxParam );	//保存部分连接配置选项
		else
			//停止数据包收发,并保存部分连接配置选项。SetRtpMode函数在
			//《ENDPT_410_ProcessVrgEndptCreateConnection.doc》中有注释说明,这里不
			//再说明。
			SetRtpMode( state->cnx[cnxIndex], cnxParam->mode );
			SaveConnectionOptions( cnx, cnxParam );

//检测如果有连接选项改变
if ( ConnectionOptionsChanged( cnx, cnxParam ))
	//如果从T38状态切为非T38状态,则上报T38停止事件
	if ( ( cnx->codecType == CODEC_T38 || cnx->codecType == CODEC_T38_MUTE ) &&
	(!( cnxParam->cnxParmList.send.codecs[0].type == CODEC_T38 || 
	cnxParam->cnxParmList.send.codecs[0].type == CODEC_T38_MUTE )) )
		(*endptConfig.notify)( state->endptArchive, cnx->cnxId, EPEVT_T38_STOP, NULL, 0, -1 );
	
	//重新设置所有资源连接相关配置项。该函数在
//《ENDPT_410_ProcessVrgEndptCreateConnection.doc》中有注释说明,这里不再说明。
	SetConnectionOptions( cnx, cnxParam, VRG_FALSE );

//如果当前测试模式为TR57,并且为接收、发送模式,则设置当前状态为VBD状态
if (state->testMode == TESTMODE_TR57)
if ( cnxParam->mode == EPCNXMODE_SNDRX)
cnx->vbData.bEnabled = VRG_TRUE;
SetVoiceMode( cnx, VM_ACTIVE );

//如果当前在环路测试模式,或者当前需要向远端放回铃音,而不设置RTP收发模式
//否则需要重新设置RTP收发模式
if( (state->cnx[cnxIndex]->mode != cnxParam->mode) && (cnxParam->mode != 
EPCNXMODE_LOOP) && cnx->activeSignal )
	VRG_LOG_INFO(( VRG_LOG_MOD_EPT, "ENDPT %d: cnx %d - preserve RTP mode to %d"…)
else
	//设置RTP收发模式。该函数在《ENDPT_410_ProcessVrgEndptCreateConnection.doc》中
	//有注释说明,这里不再说明。
	SetRtpMode( state->cnx[cnxIndex], cnxParam->mode );

SaveConnectionOptions( cnx, cnxParam );	//保存部分连接配置选项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值