⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fxotalking.c

📁 基于嵌入式Linux平台的网络电话外部交换局会话功能代码段。
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -