ENDPT_410_HapiCnxEventProcess

来源:互联网 发布:淘宝dreamweaver教程 编辑:程序博客网 时间:2024/05/29 07:19
cnx = GetCnxStateFromVHD( hapiEvt->handle );//获取线路对象switch( hapiEvt->eventId )case HAPI_CDIS_HDLCDETECT://检测到V21 HDLC信号int reason = EPEVTREASON_V21flag;logEvent = VRG_TRUE;endptState = GetEndptState( cnx->lineId );//获取线路对象EcanProcessStm( endptState, ECANEVT_HDLC );//回音消除状态机处理//保存最后传真事件if ( cnx->dataMode == EPDATAMODE_T38_MUTE )    {    cnx->lastFaxEvent = EPFAX_EVT_HDLC;    }//上报传真事件,T38模式下只上报一次if ( ( cnx->dataMode == EPDATAMODE_T38_MUTE ) ||( cnx->dataMode == EPDATAMODE_T38 ) )if ( cnx->bNotifyFaxCall == VRG_FALSE )(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_FAX, &reason, sizeof(reason), -1 );cnx->bNotifyFaxCall = VRG_TRUE;else(*endptConfig.notify)( endptState->endptArchive, -1, EPEVT_FAX, &reason, sizeof(reason), -1 );case HAPI_CDIS_DETECT://传真、MODEM事件被检测到logEvent = VRG_TRUE;endptState = GetEndptState( cnx->lineId );if( hapiEvt->op1 & CDIS_CNG )//检测到CNG信号reason = EPEVTREASON_CNG;//如果设置不关心CNG事件,则设置为空标记,后面将根据这个标记不上报事件if ( cnx->bCngDetEnabled == VRG_FALSE )evt = EPEVT_NULL;elseevt = EPEVT_FAX;EcanProcessStm(endptState, ECANEVT_CNG);//回音消除状态机处理if ( cnx->dataMode == EPDATAMODE_T38_MUTE )cnx->lastFaxEvent = EPFAX_EVT_CNG_INGRESS;//保存最后传真事件cnx->bNotifyFaxCall = VRG_TRUE;//用于T38模式,控制只上报一次传真事件else if ( hapiEvt->op1 & CDIS_PHASE_REVERSAL )//检测到相位反转的应答信号evt = EPEVT_MODEM;reason = EPEVTREASON_prANS;EcanProcessStm(endptState, ECANEVT_PHREV);//回音消除状态机处理else if ( hapiEvt->op1 & CDIS_V18_DETECT )//检测到V18信号if ( hapiEvt->op2.val == CDIS_V18ASCII )//V18相关的都不清楚if ( cnx->bBell103Enabled == VRG_FALSE )// 我们当前没有开启logEvent = VRG_FALSE;else//停止自适应JBhdspSendCmdAsync( endptState->lineVhdHdl,HAPI_CODEC_STOP_ADAPT_CMD, HSCMDDATA, 1, 0 );EcanProcessStm(endptState, ECANEVT_BELL103);//回音消除状态机处理elseevt = EPEVT_TDD;EcanProcessStm(endptState, ECANEVT_V18);//回音消除状态机处理//不同V18声音映射不同V18事件if( hapiEvt->op2.val == CDIS_V18ASCII )reason = EPEVTREASON_BELLTONE;else if( hapiEvt->op2.val == CDIS_V18BAUDOT )reason = EPEVTREASON_BAUDOT;else if( hapiEvt->op2.val == CDIS_V18PREAMBLE )reason = EPEVTREASON_V21tone;else if( hapiEvt->op2.val == CDIS_V18BAUDOT_SHORT )reason = EPEVTREASON_BAUDOT_SHORT;else if ( hapiEvt->op1 & CDIS_CUSTOMTONE_DETECT )//自定义声音检测到evt = EPEVT_CUSTOMTONE;reason = EPEVTREASON_CUSTTONE_INGRESS;else if ( hapiEvt->op1 & CDIS_MACHINE )//检测到CED信号evt = EPEVT_MODEM;reason = EPEVTREASON_ANS;EcanProcessStm(endptState, ECANEVT_MACHINE);//回音消除状态机处理//检测到低声音能量else if ( hapiEvt->op1 & (CDIS_LOW_ENERGY | CDIS_EXT_LOW_ENERGY) )EcanProcessStm(endptState, ECANEVT_LOWEN);//回音消除状态机处理//如果是外部声音低能量,则上报VBD停止事件,否则上报低能量事件if ( hapiEvt->op1 & CDIS_EXT_LOW_ENERGY )evt = EPEVT_VBD_STOP;intData = (int)EVEVTVDBSTOP_EXTLOWENERGY;elseevt = EPEVT_LOWENERGY;else if( hapiEvt->op1 & CDIS_BELL103_DETECT )//BELL103事件,不懂if ( cnx->bBell103Enabled == VRG_FALSE )logEvent = VRG_FALSE;else////停止自适应JBhdspSendCmdAsync( endptState->lineVhdHdl, HAPI_CODEC_STOP_ADAPT_CMD,HSCMDDATA, 1, 0 );EcanProcessStm(endptState, ECANEVT_BELL103); //回音消除状态机处理//如果这前事件标记不为NULL,是上报等处理if ( evt != EPEVT_NULL )//上报事件data = reason;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, evt, (void *)&data, sizeof(data), intData );//如果检测到传真事件,当前是T38模式,则上报VBD停止if( (evt == EPEVT_FAX) && VRG_DATA_MODE_T38( cnx->dataMode ) )(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_VBD_STOP, NULL, 0, -1 );case HAPI_CDIS_EGRESS_DETECT://外部的传真、MODEM事件被检测到endptState = GetEndptState( cnx->lineId );if( hapiEvt->op1 & CDIS_CNG )//如果是CNG信号reason = EPEVTREASON_EGRESS_CNG;evt = (cnx->bCngDetEnabled == VRG_FALSE) ? EPEVT_NULL : EPEVT_FAX;EcanProcessStm(endptState, ECANEVT_CNG);//回音消除状态机处理else if ( hapiEvt->op1 & CDIS_PHASE_REVERSAL )//相位反转信号evt = EPEVT_MODEM;reason = EPEVTREASON_EGRESS_prANS;EcanProcessStm(endptState, ECANEVT_PHREV);//回音消除状态机处理else if ( hapiEvt->op1 & CDIS_MACHINE )//检测到CED信号evt = EPEVT_MODEM;reason = EPEVTREASON_EGRESS_ANS;EcanProcessStm(endptState, ECANEVT_MACHINE);//回音消除状态机处理else if ( hapiEvt->op1 & CDIS_V18_DETECT )//V18信号,和上面本地类似,这块不懂if ( hapiEvt->op2.val == CDIS_V18ASCII )if ( cnx->bBell103Enabled == VRG_FALSE )logEvent = VRG_FALSE;elsehdspSendCmdAsync( endptState->lineVhdHdl,HAPI_CODEC_STOP_ADAPT_CMD, HSCMDDATA, 1, 0 );EcanProcessStm(endptState, ECANEVT_BELL103);elseevt = EPEVT_TDD;if( hapiEvt->op2.val == CDIS_V18BAUDOT_SHORT )reason = EPEVTREASON_EGRESS_BAUDOT_SHORT;else if ( hapiEvt->op1 & CDIS_CUSTOMTONE_DETECT )//检测到自下义声音evt = EPEVT_CUSTOMTONE;reason = EPEVTREASON_CUSTTONE_EGRESS;//检测到低能量else if ( hapiEvt->op1 & (CDIS_LOW_ENERGY | CDIS_EXT_LOW_ENERGY) )EcanProcessStm(endptState, ECANEVT_LOWEN); //回音消除状态机处理//检测到BELL103信号,和上面本地侧类似,不懂BELL103是什么else if( hapiEvt->op1 & CDIS_BELL103_DETECT )if ( cnx->bBell103Enabled == VRG_FALSE )logEvent = VRG_FALSE;elsehdspSendCmdAsync( endptState->lineVhdHdl,HAPI_CODEC_STOP_ADAPT_CMD, HSCMDDATA, 1, 0 );EcanProcessStm(endptState, ECANEVT_BELL103);//上报事件if ( evt != EPEVT_NULL )data = reason;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, evt, (void *)&data, sizeof(data), intData );case HAPI_PTE_TONE_ON_EVT://检测到网络侧DTMF ON按键endptState = GetEndptState( cnx->lineId );//获取线路对象VRG_UINT8    tone = hapiEvt->op2.val & 0xFF;if ( tone >= HAPI_PTE_DTMFDMAXDGT )//检测到长按键,上报上长按键事件(*endptConfig.notify)( endptState->endptArchive, -1, EPEVT_DTMFL, NULL, 0, -1 );else//将网络侧DTMF按键转换为本地侧事件const EPZPTEDIGIT2EPEVTMAP *digitMap = ntDigit2epevtMap;while(( digitMap->digit != tone ) &&( digitMap->digit != HAPI_PTE_DTMFDDGTERROR ))digitMap++;//上报事件,并处理回音消除状态机if(( digitMap->digit != HAPI_PTE_DTMFDDGTERROR ) && (digitMap->epEvent != EPEVT_NULL))(*endptConfig.notify)( endptState->endptArchive, -1, digitMap->epEvent, NULL, 0, EPDTMFACT_TONEON);ClassEvent( endptState, hapiEvt );//基于资源对象上的INBAND DTMF生成完成指示事件。(有些扩展通道如DECT没有INBAND// DTMF,需要调用signal命令基于资源对象生成,这里是上报生成后的事件指示。case HAPI_PTE_TONE_GEN_EVT:endptState = GetEndptState( cnx->lineId );..//获取ENDPT对象//当线路VHD与资源VHD断开时,并且当前资源对象上没有活动信号音时,才上报//INBAND DTMF完成事件if ( (cnx->bSBDisconnect == VRG_TRUE) && (cnx->activeSignal == VRG_FALSE) )toneGenEvtp = (HAPI_PTE_TONEGENEVT *)hapiEvt->op2.ref;if (toneGenEvtp->slotNum == 0xFFFF)(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_INGRESS_DTMF, NULL, 0, -1 );else//否则更新RTP 收发模式cnx->activeSignal = VRG_FALSE;SetRtpMode( cnx, cnx->mode );//网络服务类型变更通知事件。case HAPINET_MODE:switch (hapiEvt->op1)//不清楚这三者的差别case NETMODE_IDLE:case NETMODE_CALLSETUP:case NETMODE_DATARELAY:cnx->vbData.bEnabled = VRG_FALSE;//标记为非VBDcase NETMODE_PACKETVOICE://开始传送语音数据包//如果当前开启VBD,则上报VBD停止事件,并告知原因为PAYLOAD切换if( cnx->vbData.bEnabled == VRG_TRUE )data = EPEVTREASON_PTSW;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_VBD_STOP, (void*)&data, sizeof(data), -1 );//复位VBD标记为否cnx->vbData.bEnabled = VRG_FALSE;case NETMODE_FAXRELAY://开启传送T38cnx->vbData.bEnabled = VRG_FALSE;//设置VBD开启为否case NETMODE_VOICEBANDDATA://开始传送VBD//通知上层VBD启动事件,并告知原因为PAYLOAD切换if( cnx->vbData.bEnabled == VRG_FALSE )data = EPEVTREASON_PTSW;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_VBD_START, (void *)&data, sizeof(data), -1 );cnx->vbData.bEnabled = VRG_TRUE;//设置VBD开启//显示一些语音编解码相关统计信息打印,各种信息不懂case HAPI_NET_VOICESTATS_EVT:hdspVhdDisplayVoiceStatsRaw( hapiEvt->handle, hapiEvt->op2.ref );case HAPI_FAXR_CALLEND_EVT://T38传真结束事件// EPEVT_T38_STOP为成功结束// EPEVT_T38_FAILURE为失败结束if ( hapiEvt->op2.val & HAPI_FAXR_CALL_SUCCESS )(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_T38_STOP, NULL,0, -1 );else(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_T38_FAILURE,NULL, 0, -1 );case HAPI_FAXR_V21_PREAMBLE_EVT://检测到T38 V21前导信号//如果先前没有检测到CNG或没上报,则这里通知上层检测到T38 FAX事件,原因//为V21信号if ( cnx->bNotifyFaxCall == VRG_FALSE )data = EPEVTREASON_V21flag;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_FAX, (void *)&data, sizeof(data), -1 );//如果在T38模式,则上报VBD停止事件,原因为V21信号if( VRG_DATA_MODE_T38( cnx->dataMode ) )data = EPEVTREASON_V21flag;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_VBD_STOP, (void *)&data, sizeof(data), -1 );case HAPI_FAXR_DEBUGRXTONE_EVT://检测到T38 CNG或CED声音事件//上报T38传真事件,原因为CNGif ( hapiEvt->op1 == HSFAXRCNG )data = EPEVTREASON_CNG;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_FAX, (void *)&data, sizeof(data), -1 );//上报T38 MODEM事件,原因为应答音(注意BCM驱动对于传真的应答事件也//用MODEM类型来上报)if ( hapiEvt->op1 == HSFAXRCED )data = EPEVTREASON_ANS;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_MODEM, (void *)&data, sizeof(data), -1 );//这几个事件代码归在一起处理,处理动作仅仅是将logEvent变量改为VRG_TRUE,用于下//面打印处理。没有功能代码,仅按字面文字意思写一下事件。case HAPI_CODEC_VOICERATE_EVT://编码速率改变事件case HAPINET_VOICERATE://网络侧编码速率改变事件case HAPINET_EXCEPTION://网络侧异常事件case HAPINET_HEARTBEAT://网络模块内部心跳事件case HAPI_NET_FAXRATE_EVT://网络侧传真速率改变事件case HAPI_NET_FAXSTATS_EVT://网络侧传真统计信息case HAPI_FAXR_BM_DEBUG_EVT://不清楚case HAPI_VFAX_NOCARRIER_EVT://传真无载波事件case HAPI_RTP_EGRESS_ERROR_EVT://外部来的RTP错误事件case HAPI_RTP_EGRESS_SSRC_COLLISION_EVT://外部来的RTP SSRC字段冲突事件//这几个事件代码归在一起处理,处理动作仅仅是将logEvent变量改为VRG_FALSE,用于下//面打印处理。没有功能代码,仅按字面文字意思写一下事件。case HAPI_RTP_EGRESS_DTMF_EVT://接收外部的DTMF事件case HAPI_RTP_INGRESS_RTCP_REPORT_EVT://发送 RTCP报告事件case HAPI_RTP_EGRESS_RTCP_REPORT_EVT://发送RTCP报告事件case HAPI_RTP_BYE_EVT://接收RTCP BYE事件case HAPI_RTP_SID_INGRESS_EVT://不清楚case HAPI_RTP_THRESHOLD_MONITOR_EVT://RTP阀值监控事件//仅列举了一段示例代码,打印相关监控信息if (thresholdEvt->monitorID == HAPI_RTP_MONITOR_SL || thresholdEvt->monitorID ==HAPI_RTP_MONITOR_NL)VRG_LOG_INFO(( VRG_LOG_MOD_EPT, "CNX %d -- ID: %u, zone %u, current %d, threshold %d", cnx->lineId, thresholdEvt->monitorID, thresholdEvt->currentZone, thresholdEvt->currentValue.sValue, thresholdEvt->thresholdValue.sValue));elseVRG_LOG_INFO(( VRG_LOG_MOD_EPT, "CNX %d -- ID: %u, zone %u, current %u, threshold %u", cnx->lineId, thresholdEvt->monitorID, thresholdEvt->currentZone, thresholdEvt->currentValue.uValue, thresholdEvt->thresholdValue.uValue));//检测到外部媒体从语音切为VBDcase HAPI_CODEC_EGRESS_VOICE_TO_VBD_DETECT_EVT://上报VBD开始事件,原因为PAYLOAD切换data = EPEVTREASON_PTSW;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_VBD_START, (void *)&data, sizeof(data), -1 );//检测到外部媒体从VBD切为语音case HAPI_CODEC_EGRESS_VBD_TO_VOICE_DETECT_EVT://上报VBD停止事件,原因为PAYLOAD切换data = EPEVTREASON_PTSW;(*endptConfig.notify)( endptState->endptArchive, cnx->cnxId, EPEVT_VBD_STOP, (void *)&data, sizeof(data), -1 );//如果之前上面一些事件设置logEvent标记,则触发事件信息打印,及部分事件的简单功//能调用。上面大部分事件对于logEvent标记的设置,如果需要知道对应事件是否设置//logEvent标记,则查看代码。if ( logEvent )HapiCnxEventPostProcess( hapiEvt );cnx = GetCnxStateFromVHD( hapiEvt->handle );//获取资源对象//根据不同事件ID,填充事件名称evtStr字符串switch( hapiEvt->eventId )CASE_PROCESS_HAPI_EVT( HAPINET_MODE                      )……//如果是编码速率改变事件,则记载当前事件描述信息(编解码类型、编码类型//、VAD类型)if (  ( hapiEvt->eventId == HAPI_CODEC_VOICERATE_EVT  ) || ( hapiEvt->eventId == HAPINET_VOICERATE         ) )codecIndex = HAPI_PKT_GETVC( hapiEvt->op1 );      while ( ( pAlgsMap->algsCode != codecIndex ) && ( pAlgsMap->algsCode !=HAPI_PKT_VC_VOICE_NOCODE ) )      {         pAlgsMap++;    }vadIndex = hapiEvt->op1 >> VPC_VADSHIFT;strPrintf( evtDescriptionStr,  sizeof( evtDescriptionStr ),  "(%s: %s %s)",                 hapiEvt->op2.val?"dec":"enc",pAlgsMap->algsName,  vadtypes[vadIndex] );//如果当前事件为检测到HDLC或检测到CNG,并且当时设置为T38静音模式时//,则标记T38静音标记if ( ( hapiEvt->eventId == HAPI_CDIS_HDLCDETECT ) ||(( hapiEvt->eventId == HAPI_CDIS_DETECT ) && ( hapiEvt->op1 & CDIS_CNG )&& ( cnx->bCngDetEnabled == VRG_TRUE )) )if ( cnx->dataMode == EPDATAMODE_T38_MUTE )cnx->bMuteT38 = VRG_TRUE;//如果从语音切为VBD,则关闭VAD,否则如果从VBD切为语音,则开启VBDif ( hapiEvt->eventId == HAPINET_MODE )switch( hapiEvt->op1 )case NETMODE_VOICEBANDDATA:if ( cnx->silence )plcType = vrgEndptRetrievePlcSettings( cnx->codecType );vad = HAPI_GVAD_MODE_OFF;cng = cnx->comfortNoise;if ((cnx->VadMode != vad) ||(cnx->CngMode != cng) ||(cnx->PlcMode != plcType))hdspVhdSetVadCngPlc( cnx->vhdhdl, vad, cng, plcType );cnx->VadMode = vad;cnx->CngMode = cng;cnx->PlcMode = plcType;case NETMODE_PACKETVOICE:if ( cnx->vhdMode == NETMODE_VOICEBANDDATA )if ( cnx->silence )plcType = vrgEndptRetrievePlcSettings( cnx->codecType );vad = HAPI_GVAD_MODE_TRANSPARENT;cng = cnx->comfortNoise;if ((cnx->VadMode != vad) ||(cnx->CngMode != cng)||(cnx->PlcMode != plcType))hdspVhdSetVadCngPlc( cnx->vhdhdl, vad, cng, plcType );cnx->VadMode = vad;cnx->CngMode = cng;cnx->PlcMode = plcType;//如果事件为RTP外部错误事件,则将事件描述填充为ERRORif ( hapiEvt->eventId == HAPI_RTP_EGRESS_ERROR_EVT )if ( hapiEvt->op1 )strPrintf( evtDescriptionStr, sizeof( evtDescriptionStr ), "ERROR" );//如果事件为RTP外部SSRC冲突事件,则事件描述填充冲突的SSRC号if ( hapiEvt->eventId == HAPI_RTP_EGRESS_SSRC_COLLISION_EVT )strPrintf( evtDescriptionStr, sizeof( evtDescriptionStr ), "SSRC (%d)",(hapiEvt->op1 << 16)+(hapiEvt->op2.val) );bosTimeGetMs( &timeStamp );//获取时间戳//打印事件信息   VRG_LOG_NOTICE(( VRG_LOG_MOD_EPT, "'%s' (0x%x), cnx:%d, line:%d, hdl:0x%x, op1:0x%x, op2:0x%x %s ts: %u ",  evtStr,  hapiEvt->eventId,  cnx->cnxId,  cnx->lineId, hapiEvt->handle,  hapiEvt->op1,  hapiEvt->op2.val,  evtDescriptionStr,  timeStamp ));//释放内存资源if ( hapiEvt->reqId == HSEVTEXTDATA &&hapiEvt->op2.ref != NULL && hapiEvt->op1 != 0 )free(hapiEvt->op2.ref);

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做了拔罐后背疼怎么办 拔罐拔出血水后怎么办 拨了罐浑身疼怎么办 拔完火罐洗澡疼怎么办 拔罐之后脊背疼怎么办? 五个月的狗胆小怎么办 电脑颜色不正常分辨率调不了怎么办 宝宝认人怎么办 五个月 新生儿42天听力筛查未通过怎么办 幼儿大便干燥拉不下粑粑怎么办 宝宝大便干燥拉粑粑带浓血怎么办 新生儿便秘4天了怎么办 写卷子的题目不认识怎么办? 2个月小猫尿床怎么办 安全教案鱼刺卡住了怎么办 被鱼刺卡住怎么办安全教案 小班健康教案生病了怎么办 被蜜蜂蛰了怎么办教案 走丢了怎么办大班反思 小孩吃了硬物怎么办 小孩吞了硬物怎么办 小学二年级孩子成绩不好怎么办 二年级孩子成绩不好怎么办 一年级学的不好二年级怎么办 17个月宝宝夜奶怎么办 小孩吃积食了吐怎么办 11个宝宝不会爬怎么办 5岁宝宝严重挑食怎么办 孩子吃菜口味重怎么办? 孩子挑食不吃菜不吃肉怎么办 微信新的朋友回复频繁怎么办 忘了闺蜜生日怎么办 把闺蜜生日忘了怎么办 忘了闺蜜的生日怎么办 一岁宝宝不吃菜怎么办 幼儿园教案虫子爬进耳朵怎么办 鼻子出血怎么办幼儿说课 英语记不住发音不准怎么办 幼儿园孩子拼音记不住怎么办 孩子总是记不住东西怎么办 走丢了怎么办小班教案