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 ); //保存部分连接配置选项