////////////////////////////////////////////////////////////////////////// // XMS_EVT_CLEARCALL event handler (call dropped by local or remote) void OnClearCall(Acs_Evt_t *pAcsEvt) { Acs_CallControl_Data *pCallEvt = (Acs_CallControl_Data *)FetchEventData(pAcsEvt); TRACE(_T("Device[%02d][%02d][%02d] call cleared (ret=%d)\n"), pAcsEvt->m_DeviceID.m_s8ModuleID, pAcsEvt->m_DeviceID.m_s16DeviceMain, pAcsEvt->m_DeviceID.m_s16ChannelID, pCallEvt->m_s32AcsEvtErrCode); // if has Voice Device binded, unbind it int iDeviceIP = pAcsEvt->m_DeviceID.m_s16ChannelID; int iDeviceVoc = g_deviceVoIP[iDeviceIP].iVoiceDevice; if (iDeviceVoc != -1) { MixerControlParam_t paramMixer = {0}; // send SetParam command RetCode_t ret = XMS_ctsSetParam(g_acsHandle, &g_deviceVoIP[iDeviceIP].device, VOIP_PARAM_RTPMIXER, sizeof(paramMixer), ¶mMixer); g_deviceVoIP[iDeviceIP].iVoiceDevice = -1; g_deviceVoc[iDeviceVoc].iVoIPDevice = -1; g_pDlg->refreshListIP(iDeviceIP); g_pDlg->refreshListVoc(iDeviceVoc); } }
////////////////////////////////////////////////////////////////////////// // XMS_EVT_OPEN_DEVICE event handler void OnOpenDevice(Acs_Evt_t *pAcsEvt) { TRACE(_T("Device[%02d][%02d][%02d] opened (ret=%d)\n"), pAcsEvt->m_DeviceID.m_s8ModuleID, pAcsEvt->m_DeviceID.m_s16DeviceMain, pAcsEvt->m_DeviceID.m_s16ChannelID, pAcsEvt->m_u32EsrParam); switch (pAcsEvt->m_DeviceID.m_s16DeviceMain) { case XMS_DEVMAIN_VOIP: case XMS_DEVMAIN_VOICE: case XMS_DEVMAIN_CONFERENCE: g_pDlg->enableDevice(&pAcsEvt->m_DeviceID); break; } #ifdef TEST_ACCESS // test for set slot access if (pAcsEvt->m_DeviceID.m_s16DeviceMain == XMS_DEVMAIN_VOIP && pAcsEvt->m_DeviceID.m_s16ChannelID == 29) { DJ_U8 u8AccessFlag = 0x22; XMS_ctsSetParam(g_acsHandle, &g_deviceVoIP[29].device, VOIP_PARAM_ACCESS, 1, &u8AccessFlag); } #endif }
int UnBindOneVoice(VOIP_STRUCT *pOneVOIP) { MixerControlParam_t paramMixer = {0}; RetCode_t r = -1; if (pOneVOIP == NULL) return r; r = XMS_ctsSetParam(g_acsHandle, &pOneVOIP->deviceID, VOIP_PARAM_RTPMIXER, sizeof(paramMixer), ¶mMixer); return r; }
int BindOneFreeVoice(VOIP_STRUCT *pOneVOIP, const DeviceID_t &FreeVocDevID) { MixerControlParam_t paramMixer = {0}; RetCode_t r = -1; if (pOneVOIP == NULL) return r; paramMixer.m_u8SRC1_Ctrl = XMS_MIXER_FROM_PLAY; paramMixer.m_u16SRC_ChID1 = FreeVocDevID.m_s16ChannelID; // send SetParam command r = XMS_ctsSetParam(g_acsHandle, &pOneVOIP->deviceID, VOIP_PARAM_RTPMIXER, sizeof(paramMixer), ¶mMixer); return r; }
int PSTNToVOIPCallout(char* pCallerNum, char* pCalledNum, DeviceID_t* pVoipDev, INTERFACE_STRUCT* pOneInterface) { RetCode_t ret = -1; VOIP_STRUCT *pOneVOIP = NULL; DeviceID_t FreeVocDeviceID; MixerControlParam_t VocCmdP = {0}; CmdParamData_Voice_t VocMixParam = {0}; VoIPCallPrivate_t voipCallParam = {0}; int iPreCnt = 0; int iRoutCnt = 0; _ASSERT(pCallerNum != NULL); _ASSERT(pCalledNum != NULL); _ASSERT(pVoipDev != NULL); _ASSERT(pOneInterface != NULL); voipCallParam.m_PrivateData.m_u32DataSize = sizeof(VoIPCallPrivate_t); voipCallParam.m_s32Protocol = XMS_VOIP_PROTOCOL_SIP; strncpy(voipCallParam.m_s8CallerUserID, pCallerNum, sizeof(voipCallParam.m_s8CallerUserID)); char cfg_MapIP[255] = {0}; if (outRout == NULL) { sprintf(cfg_MapIP,"%s",pubOutVoipAddress); strncpy(voipCallParam.m_s8CalleeAddress, cfg_MapIP, sizeof(voipCallParam.m_s8CallerAddress)); voipCallParam.m_s32CalleePort = pubOutVoipPort; } else { int bRout = 0; for (iRoutCnt = 1; iRoutCnt <= cfg_routCnt; iRoutCnt++) { if (bRout == 1) break; for (iPreCnt = 0; iPreCnt < 10; iPreCnt++) { if (strlen(outRout[iRoutCnt].phonePreNum[iPreCnt]) > 0) { if (strncmp(outRout[iRoutCnt].phonePreNum[iPreCnt], pCalledNum, strlen(outRout[iRoutCnt].phonePreNum[iPreCnt])) == 0) { strncpy(voipCallParam.m_s8CalleeAddress, outRout[iRoutCnt].outBAddr.proxyAddr, sizeof(voipCallParam.m_s8CallerAddress)); voipCallParam.m_s32CalleePort = outRout[iRoutCnt].outBAddr.proxyPort; bRout = 1; break; } } } } if (bRout == 0) { sprintf(cfg_MapIP,"%s",pubOutVoipAddress); strncpy(voipCallParam.m_s8CalleeAddress, cfg_MapIP, sizeof(voipCallParam.m_s8CallerAddress)); voipCallParam.m_s32CalleePort = pubOutVoipPort; } } if (g_logfp != NULL) { char mTemp[512]={0}; char mCurrTime[50]={0}; getCurrTime(mCurrTime); sprintf(mTemp,"%s IPCALLOUT In PSTNToVOIPCallOut: DSP:%d Ch:%d AcsHandle:%d, FlowType:%d FlowChannelID:%d CalleAddress:%s Port:%d Caller:%s Called:%s \n\r", mCurrTime, pVoipDev->m_s8ModuleID, pVoipDev->m_s16ChannelID, g_acsHandle, pVoipDev->m_CallID.m_s32FlowType, pVoipDev->m_CallID.m_s32FlowChannel, voipCallParam.m_s8CalleeAddress, voipCallParam.m_s32CalleePort, pCallerNum, pCalledNum); fwrite(mTemp,strlen(mTemp),1,g_logfp); fflush(g_logfp); } pOneVOIP = &M_OneVOIP(*pVoipDev); ret = XMS_ctsMakeCallOut(g_acsHandle, pVoipDev, pCallerNum, pCalledNum, (PrivateData_t *)&voipCallParam); if(ret > 0) { FreeVocDeviceID=pOneVOIP->pVoiceDeviceID; VocCmdP.m_u8SRC1_Ctrl = XMS_MIXER_FROM_INPUT; VocCmdP.m_u16SRC_ChID1 = pOneVOIP->pVoiceDeviceID.m_s16ChannelID; //如果不屏蔽这两行,会造成DTMF播放死循环 // VocCmdP.m_u8SRC2_Ctrl = XMS_MIXER_FROM_PLAY; // VocCmdP.m_u16SRC_ChID2 = pOneVOIP->pVoiceDeviceID.m_s16ChannelID; ret = XMS_ctsSetParam(g_acsHandle, &pOneVOIP->deviceID, VOIP_PARAM_RTPMIXER, sizeof(VocCmdP), &VocCmdP); /* VocMixParam.m_u8InputCtrlValid=1; //使能输入控制参数 VocMixParam.m_VocInputControl.m_u8AgcEnable=0;// inputContol使能自动增益 VocMixParam.m_VocInputControl.m_u8AgcMode = 0 ;//设为ALS模式 VocMixParam.m_VocInputControl.m_u16FixGain=1024; VocMixParam.m_VocInputControl.m_u8EcEnable=0;//禁止回声抑制 VocMixParam.m_VocInputControl.m_u8TadEnable=1; //启动语音TONE音抑制使能 VocMixParam.m_VocInputControl.m_u8EcRefType=0; */ VocMixParam.m_u8GtdCtrlValid = 1; VocMixParam.m_VocGtdControl.m_u8DTMFEnable = 1; VocMixParam.m_VocGtdControl.m_u8FSKEnable = 1; VocMixParam.m_VocGtdControl.m_u8ChannelEnable = 1; VocMixParam.m_VocGtdControl.m_u8GTDEnable = 1; unsigned char gtdID[] = {"GHIJKLM"}; memcpy(VocMixParam.m_VocGtdControl.m_u8GTDID, gtdID, sizeof(VocMixParam.m_VocGtdControl.m_u8GTDID)); // EnableGtg(&pOneVOIP->pVoiceDeviceID); VocMixParam.m_u8OutputCtrlValid = 1; VocMixParam.m_VocOutputControl.m_u8OutputType = XMS_VOC_OUTPUT_FROM_MIXER; VocMixParam.m_VocOutputControl.m_u16FixGain = 1024; VocMixParam.m_VocOutputControl.m_MixerControl.m_u8SRC1_Ctrl = XMS_MIXER_FROM_PLAY; VocMixParam.m_VocOutputControl.m_MixerControl.m_u16SRC_ChID1 = pOneVOIP->pVoiceDeviceID.m_s16ChannelID; VocMixParam.m_VocOutputControl.m_MixerControl.m_u8SRC2_Ctrl = XMS_MIXER_FROM_IP; VocMixParam.m_VocOutputControl.m_MixerControl.m_u16SRC_ChID2 = pOneVOIP->deviceID.m_s16ChannelID; ret = XMS_ctsSetParam(g_acsHandle, &pOneVOIP->pVoiceDeviceID,VOC_PARAM_UNIPARAM, sizeof(VocMixParam), &VocMixParam); My_DualLink(&pOneInterface->deviceID, &pOneInterface->pVoiceDeviceID); XMS_ctsAlertCall(g_acsHandle,&pOneInterface->deviceID,NULL); DrawVOIP_VocInfo(pOneVOIP); } /* else { char mTemp[255]={0}; char mCurrTime[50]={0}; if (g_logfp != NULL) { getCurrTime(mCurrTime); sprintf(mTemp,"%s,PSTNToVOIP Faile!!,m_s16DeviceMain=%d,m_s16DeviceSub=%d,m_s8ModuleID=%d,m_s8MachineID=%d,m_s16ChannelID=%d,m_s32FlowType=%d,m_s32FlowChannel=%d\r", mCurrTime, pVoipDev->m_s16DeviceMain,pVoipDev->m_s16DeviceSub,pVoipDev->m_s8ModuleID, pVoipDev->m_s8MachineID,pVoipDev->m_s16ChannelID, pVoipDev->m_CallID.m_s32FlowType,pVoipDev->m_CallID.m_s32FlowChannel); fwrite(mTemp,strlen(mTemp),1,g_logfp); } // return ret; }*/ return ret; }