lineId = ((VRG_ENDPT_STATE *) endptState)->lineId;
dspNum = lineId / (VRG_ENDPT_CFG_NUM_ENDPT/VRG_GLOBAL_CFG_MAX_NUM_DSP);
//初始化ENDPT能力集
*capabilities = vrgEndptCap[dspNum];
state = GetEndptState( lineId ); //获取ENDPT对象
//能过配置获取来显类型
Provision( endptState, EPPROV_CIDSigProtocol, &capabilities->clidType );
//如果来显为DTMF,则获取启始和终止字符
if( capabilities->clidType == EPCLIDTYPE_DTMF )
Provision( endptState, EPPROV_CIDDtmfParms, &dtmfParms );
capabilities->clidData[0] = GetDigitEvent( (HAPI_PTE_DTMFDDGT)dtmfParms.startCode );
capabilities->clidData[1] = GetDigitEvent( (HAPI_PTE_DTMFDDGT)dtmfParms.endCode );
bLiteWeightCnx = VRG_FALSE; //标记轻量级资源
for ( i = PRIMARY_CNX_INDEX; i < VRG_ENDPT_CFG_MAX_CNX_PER_ENDPT; i++ )
//检查当前ENDPT是否有对应的资源对象,如果有则跳出
if ( state->cnx[i] && (state->cnx[i]->cnxId == CNX_IDLE) )
bLiteWeightCnx = state->cnx[i]->bLiteWeight;
break;
if ( i == VRG_ENDPT_CFG_MAX_CNX_PER_ENDPT ) //发现ENDPT对象没有对应的资源
//在ENDPT中找到第一个可用的资源对象
for ( i = 0; i < VRG_ENDPT_CFG_MAX_CNX_PER_ENDPT; i++ )
if ( state->cnx[i] == NULL )
break;
//无效的ENDPT关联,返回没有能力值
if ( state->cnx[i] != NULL )
resetCodecCap(capabilities->codecCap);
return ( EPSTATUS_SUCCESS );
//给ENDPT分配一个资源
for ( i = 0; i < VRG_ENDPT_CFG_NUM_CNX; i++ )
if ( (vrgCnxState[i].dspNum == dspNum) &&(vrgCnxState[i].cnxId == CNX_UNUSED) )
state->cnx[j] = &vrgCnxState[i];
state->cnx[j]->cnxId = CNX_IDLE;
bLiteWeightCnx = vrgCnxState[i].bLiteWeight;
break;
//无可用资源,返回无能力值
if ( i == VRG_ENDPT_CFG_NUM_CNX )
resetCodecCap(capabilities->codecCap);
return ( EPSTATUS_SUCCESS );
if ( bLiteWeightCnx ) //如果资源为轻量级,则去除所有高压缩编码支持
for (i = 0; i < CODEC_MAX_TYPES; i++)
if ( i != CODEC_PCMU && i != CODEC_PCMA && i != CODEC_NTE && i != CODEC_RED )
capabilities->codecCap[i] = CODEC_UNSUPPORTED;
//修改仅支持G729,不支持G729A
else if ( capabilities->codecCap[CODEC_G729A] == CODEC_SUPPORTED )
capabilities->codecCap[CODEC_G729A] = CODEC_UNSUPPORTED;
capabilities->codecCap[CODEC_G729] = CODEC_SUPPORTED;
ENDPT_410_ProcessVrgEndptCapabilities
最新推荐文章于 2013-09-23 07:50:14 发布