📄 fxotalking.c
字号:
ptAttrib->mtCallInfo[dwIdx].dwReceiveNumber == 0 &&
ptMsgReq->u.tDtmfCode.dwDtmfValue == 0 ) {
// 外线打进后禁止呼叫国内/国际长途
break;
}
#ifdef AUTOTEST
chDtmf = ptMsgReq->u.tDtmfCode.dwDtmfValue;
vPutDriver( dwChannel, eACTION_FXO_SEND_DTMF, &( chDtmf ), 1 );
#else
dwIdx = eFirstcall;
ptr = ptAttrib->mtCallInfo[dwIdx].mchReceiveNumber;
ptr[ptAttrib->mtCallInfo[dwIdx].dwReceiveNumber++] = ptMsgReq->u.tDtmfCode.dwDtmfValue;
if ( ptAttrib->mtCallInfo[dwIdx].dwReceiveNumber >= MAX_DTMF_SAVED ) {
ptAttrib->mtCallInfo[dwIdx].dwReceiveNumber = MAX_DTMF_SAVED - 1;
chDtmf = ptMsgReq->u.tDtmfCode.dwDtmfValue;
vPutDriver( dwChannel, eACTION_FXO_SEND_DTMF, &( chDtmf ), 1 );
} else {
printf( "eDtmfCode, %d\n", ptAttrib->boolSendDtmfEnable );
if ( ptAttrib->boolSendDtmfEnable ) {
// send all dtmfcodes received before
vFxoSendDtmfCode( dwChannel );
}
}
#endif
break;
case eTransfer:
// call will be transfer to new callee
dwIdx = eFirstcall;
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eSetup;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSetup );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tSetup.boolTransfer = TRUE;
tCcUaMsg.u.tSetup.dwCallee = ptMsgReq->u.tTransfer.dwCallee;
tCcUaMsg.u.tSetup.dwCaller = m_tModuleInfo.port.dwTelno[dwChannel];
if ( ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee == m_tModuleInfo.port.dwTelno[dwChannel] ) {
tCcUaMsg.u.tSetup.dwTransferNumber = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCaller;
} else {
tCcUaMsg.u.tSetup.dwTransferNumber = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee;
}
strcpy( tCcUaMsg.u.tSetup.cDispName, ptAttrib->mtCallInfo[dwIdx].tSetup.cDispName );
ptAttrib->mtCallInfo[dwIdx].tSetup = tCcUaMsg.u.tSetup;
tCcUaMsg.hdr.dwCcIdx = ptAttrib->eActiveCall;
ptAttrib->mtCallInfo[dwIdx].dwUaIdx = (DWORD)-1;
tCcUaMsg.hdr.dwUaIdx = (DWORD)-1;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT212, mdwTimeoutLength[eT212] );
vChangeCCStatus( dwChannel, eFxo_calling );
break;
default:
break;
}
break;
case eMsgFromDriver:
printf("fxotalking,%d\n",ptEvent->dwEventType);
switch( ptEvent->dwEventType ) {
case eEVENT_FX_CODEC_ERR:
vChangeCodec( dwChannel );
break;
case eEVENT_FXO_DIAL_TONE:
if ( ptAttrib->boolSendDtmfEnable == FALSE ) {
ptAttrib->boolSendDtmfEnable = TRUE;
// send all dtmfcodes received before
dwIdx = eFirstcall;
// ptAttrib->mtCallInfo[dwIdx].dwReceivePtr = 0;
vFxoSendDtmfCode( dwChannel );
}
break;
case eEVENT_DTMF_CODE:
#ifdef AUTOTEST
#else
dwIdx = eFirstcall;
ptr = ptAttrib->mtCallInfo[dwIdx].mchCallNumber;
ptr[ptAttrib->mtCallInfo[dwIdx].dwCallNumber++] = ptEvent->chBuffer[0];
if ( ptAttrib->mtCallInfo[dwIdx].dwCallNumber >= MAX_DTMF_SAVED ) {
ptAttrib->mtCallInfo[dwIdx].dwCallNumber = MAX_DTMF_SAVED - 1;
}
// if ( ptAttrib->dwInputFxsNumber ) { // 汇接
// if ( ( ptr[0] == 0 && ptAttrib->dwInputFxsGrade < INLAND_REMOTE_CALL )
// || ( ptr[0] == 0 && ptr[1] == 0 && ptAttrib->dwInputFxsGrade < OVERSEAS_CALL
// && ptAttrib->mtCallInfo[dwIdx].dwCallNumber > 1 ) ) {
// 长途呼叫必须要有长途权限
// no authorization to start a remote call
// memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
// tCcUaMsg.hdr.eMsgType = eRelease;
// tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tRls );
// tCcUaMsg.hdr.dwChannel = dwChannel;
// dwIdx = eFirstcall;
// tCcUaMsg.u.tRls.eReason = eRls_NoRight;
// tCcUaMsg.u.tRls.dwCaller = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCaller;
// tCcUaMsg.u.tRls.dwCallee = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee;
// tCcUaMsg.hdr.dwCcIdx = dwIdx;
// tCcUaMsg.hdr.dwUaIdx = ptAttrib->mtCallInfo[dwIdx].dwUaIdx;
// vSendMsgToUA( &tCcUaMsg );
// vSetTimer( dwChannel, eT107, mdwTimeoutLength[eT107] );
// vChangeCCStatus( dwChannel, eFxo_disconnect );
// break;
// }
// }
printf( "ptAttrib->mtCallInfo[dwIdx].boolDtmfTransferReady is %d\n", ptAttrib->mtCallInfo[dwIdx].boolDtmfTransferReady );
if ( ptAttrib->mtCallInfo[dwIdx].boolDtmfTransferReady ) {
vTransferDtmfCode( dwChannel, ptEvent->chBuffer[0] );
}
#if 0
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eDtmfCode;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tDtmfCode );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tDtmfCode.dwDtmfValue = ptEvent->chBuffer[0];
dwIdx = eFirstcall;
// tCcUaMsg.u.tDtmfCode.dwSrcNumber = m_tModuleInfo.port.iTelno[dwChannel];
// if ( ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee == tCcUaMsg.u.tDtmfCode.dwSrcNumber ) {
// tCcUaMsg.u.tDtmfCode.dwDestNumber = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCaller;
// } else {
// tCcUaMsg.u.tDtmfCode.dwDestNumber = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee;
// }
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = ptAttrib->mtCallInfo[dwIdx].dwUaIdx;
vSendMsgToUA( &tCcUaMsg );
#endif
#endif
break;
case eEVENT_BUSY_TONE:
ptAttrib->eFxoPartnerType=eFxscall;//add by lwd
if (ptAttrib->eFxoPartnerType !=eUnknown || ptAttrib->boolInConference ) {
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eRelease;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tRls );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tRls.eReason = eRls_Busy;
dwIdx = eFirstcall;
tCcUaMsg.u.tRls.dwCaller = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCaller;
tCcUaMsg.u.tRls.dwCallee = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = ptAttrib->mtCallInfo[dwIdx].dwUaIdx;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT107, mdwTimeoutLength[eT107] );
vChangeCCStatus( dwChannel, eFxo_disconnect );
break;
}
if ( ptAttrib->eFxoPartnerType == eUnknown ) {
ptAttrib->boolBusyToneSave = TRUE;
break;
}
break;
case eEVENT_SCE_TOO_LONG:
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eRelease;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tRls );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tRls.eReason = eRls_Busy;
dwIdx = eFirstcall;
tCcUaMsg.u.tRls.dwCaller = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCaller;
tCcUaMsg.u.tRls.dwCallee = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = ptAttrib->mtCallInfo[dwIdx].dwUaIdx;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT107, mdwTimeoutLength[eT107] );
vChangeCCStatus( dwChannel, eFxo_disconnect );
break;
case eEVENT_SCE_OFF:
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eSceOff;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSceOff );
tCcUaMsg.hdr.dwChannel = dwChannel;
dwIdx = eFirstcall;
tCcUaMsg.u.tSceOff.dwCaller = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCaller;
tCcUaMsg.u.tSceOff.dwCallee = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = ptAttrib->mtCallInfo[dwIdx].dwUaIdx;
vSendMsgToUA( &tCcUaMsg );
break;
case eEVENT_SCE_ON:
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eSceOn;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tSceOn );
tCcUaMsg.hdr.dwChannel = dwChannel;
dwIdx = eFirstcall;
tCcUaMsg.u.tSceOn.dwCaller = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCaller;
tCcUaMsg.u.tSceOn.dwCallee = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = ptAttrib->mtCallInfo[dwIdx].dwUaIdx;
vSendMsgToUA( &tCcUaMsg );
break;
default:
break;
}
break;
case eMsgFromTimer:
switch( ptTimer->dwTimerType ) {
case eT119:
dwIdx = eFirstcall;
ptAttrib->dwFxoStatusEnquiryCounter ++;
if ( ptAttrib->dwFxoStatusEnquiryCounter <= MAX_FXO_ENQUIRY ) {
// send a enquiry message to other side
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eFxoStatusEnquiry;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tFxoStatusEnquiry );
tCcUaMsg.hdr.dwChannel = dwChannel;
if ( ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee == m_tModuleInfo.port.dwTelno[dwChannel] ) {
tCcUaMsg.u.tFxoStatusEnquiry.iFxoNumber = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCaller;
} else {
tCcUaMsg.u.tFxoStatusEnquiry.iFxoNumber = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee;
}
tCcUaMsg.u.tFxoStatusEnquiry.dwSendFxoNumber = m_tModuleInfo.port.dwTelno[dwChannel];
tCcUaMsg.u.tFxoStatusEnquiry.dwStatus = eFxo_talking;
tCcUaMsg.u.tFxoStatusEnquiry.eCurrentSceType = eSceTypeOff;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = ptAttrib->mtCallInfo[dwIdx].dwUaIdx;
vSendMsgToUA( &tCcUaMsg );
#ifdef FXO_CONTROL
vSetTimer( dwChannel, eT119, mdwTimeoutLength[eT119] );
#endif
} else {
// 收不到对方的回应,按挂机处理
vPutDriver( dwChannel, eACTION_SCE_ON, NULL, 0 );
break;
memset( (char *)&tCcUaMsg, 0, sizeof(tCcUaMsg) );
tCcUaMsg.hdr.eMsgType = eRelease;
tCcUaMsg.hdr.length = sizeof( tCcUaMsg.hdr ) + sizeof( tCcUaMsg.u.tRls );
tCcUaMsg.hdr.dwChannel = dwChannel;
tCcUaMsg.u.tRls.eReason = eRls_Busy;
dwIdx = eFirstcall;
tCcUaMsg.u.tRls.dwCaller = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCaller;
tCcUaMsg.u.tRls.dwCallee = ptAttrib->mtCallInfo[dwIdx].tSetup.dwCallee;
tCcUaMsg.hdr.dwCcIdx = dwIdx;
tCcUaMsg.hdr.dwUaIdx = ptAttrib->mtCallInfo[dwIdx].dwUaIdx;
vSendMsgToUA( &tCcUaMsg );
vSetTimer( dwChannel, eT107, mdwTimeoutLength[eT107] );
vChangeCCStatus( dwChannel, eFxo_disconnect );
}
break;
case eT116:
if ( ptAttrib->boolSendDtmfEnable == FALSE ) {
ptAttrib->boolSendDtmfEnable = TRUE;
// send all dtmfcodes received before
dwIdx = eFirstcall;
// ptAttrib->mtCallInfo[dwIdx].dwReceivePtr = 0;
vFxoSendDtmfCode( dwChannel );
}
break;
default:
break;
}
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -