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

📄 voip_adapter_configure.c

📁 telcobridges voip develop
💻 C
📖 第 1 页 / 共 5 页
字号:

					/*
					 *	TDM T38 resource
					 */
					pVpGroup->aRes[1].Params.Group1.ResType 						= TB640_VP_RES_TYPE_TDM_T38;
					pVpGroup->aRes[1].Params.Group1.un64UserContext1 				= 0;
					pVpGroup->aRes[1].Params.Group1.un64UserContext2 				= 0;
				}
				else
				{
					/*
					 *	Using voice processing group 1 (voice)
					 */
					pVpGroup->GroupParams.GroupType			= TB640_VP_GROUP_TYPE_1;
					pVpGroup->GroupParams.Group1.GroupType	= TB640_VP_GROUP_TYPE_1;
					{
						TB640_VP_GROUP1_CONF_PARAMS	ConfParams;
						TB640_VP_GROUP1_CONF_PARAMS_DEFAULT( &ConfParams, 1 );

						memcpy( &pVpGroup->GroupParams.Group1.Conf, &ConfParams, sizeof(ConfParams) );
					}
					pVpGroup->un32NbResources = 2;

					/*
					 *	Stream resource
					 */
					pVpGroup->aRes[0].Params.Group1.ResType							= TB640_VP_RES_TYPE_STREAM;
					pVpGroup->aRes[0].Params.Group1.un64UserContext1				= un32ConnectionId;
					pVpGroup->aRes[0].Params.Group1.un64UserContext2				= 0;
					{
						TB640_VP_GROUP1_STREAM_PARAMS	StreamParams;
						TB640_VP_GROUP1_STREAM_PARAMS_DEFAULT( &StreamParams );

						/* Set all payload types to unused */
						for (un32Count=0; un32Count<TB640_VP_GROUP1_MAX_PAYLOAD_TYPES; un32Count++)
						{
							StreamParams.aPacketProtocol[un32Count].PacketType = TBX_STREAM_PACKET_TYPE_UNKNOWN;
							StreamParams.aPacketProtocol[un32Count].un8TxProtocolType = TBX_STREAM_PACKET_TYPE_UNKNOWN;
							StreamParams.aPacketProtocol[un32Count].un8RxProtocolType = TBX_STREAM_PACKET_TYPE_UNKNOWN;
						}

						/* Set the appropriate payload types required */
						un32Count = 0;
						StreamParams.aPacketProtocol[un32Count].PacketType = TBX_STREAM_PACKET_TYPE_RFC2833;
						StreamParams.aPacketProtocol[un32Count].un8TxProtocolType = TBX_STREAM_PACKET_TYPE_RFC2833;
						StreamParams.aPacketProtocol[un32Count++].un8RxProtocolType = TBX_STREAM_PACKET_TYPE_RFC2833;

						StreamParams.aPacketProtocol[un32Count].PacketType = TBX_STREAM_PACKET_TYPE_DTMF;
						StreamParams.aPacketProtocol[un32Count].un8TxProtocolType = TBX_STREAM_PACKET_TYPE_DTMF;
						StreamParams.aPacketProtocol[un32Count++].un8RxProtocolType = TBX_STREAM_PACKET_TYPE_DTMF;

						StreamParams.aPacketProtocol[un32Count].PacketType = TBX_STREAM_PACKET_TYPE_DTMF_AAL2;
						StreamParams.aPacketProtocol[un32Count].un8TxProtocolType = TBX_STREAM_PACKET_TYPE_DTMF_AAL2;
						StreamParams.aPacketProtocol[un32Count++].un8RxProtocolType = TBX_STREAM_PACKET_TYPE_DTMF_AAL2;

						StreamParams.aPacketProtocol[un32Count].PacketType = TBX_STREAM_PACKET_TYPE_COMFORT_NOISE;
						StreamParams.aPacketProtocol[un32Count].un8TxProtocolType = TBX_STREAM_PACKET_TYPE_COMFORT_NOISE;
						StreamParams.aPacketProtocol[un32Count++].un8RxProtocolType = TBX_STREAM_PACKET_TYPE_COMFORT_NOISE;

						StreamParams.aPacketProtocol[un32Count].PacketType = TBX_STREAM_PACKET_TYPE_SECONDARY_SID;
						StreamParams.aPacketProtocol[un32Count].un8TxProtocolType = TBX_STREAM_PACKET_TYPE_SECONDARY_SID;
						StreamParams.aPacketProtocol[un32Count++].un8RxProtocolType = TBX_STREAM_PACKET_TYPE_SECONDARY_SID;

						StreamParams.aPacketProtocol[un32Count].PacketType = in_pConnectionParams->Type1.SecondRes.PacketType;
						StreamParams.aPacketProtocol[un32Count].un8TxProtocolType = in_pConnectionParams->Type1.SecondRes.PacketType;
						StreamParams.aPacketProtocol[un32Count++].un8RxProtocolType = in_pConnectionParams->Type1.SecondRes.PacketType;

						if( pVpGrp1Params->fStreamParamsAvailable == TBX_TRUE )
						{
							/* Overwrite default stream parameters */
							StreamParams.PacketDurationMs	= pVpGrp1Params->StreamPacketDurationMs;
						}
						if( pVpGrp1Params->fStreamToneParamsAvailable == TBX_TRUE )
						{
							/* Overwrite default stream tone parameters */
							StreamParams.Tone.fGenerationEnabled = pVpGrp1Params->fStreamToneGenerationEnabled;
							StreamParams.Tone.fDetectionEnabled = pVpGrp1Params->fStreamToneDetectionEnabled;
							StreamParams.Tone.fDtmfSuppressionEnabled = pVpGrp1Params->fStreamToneDtmfSuppressionEnabled;
							StreamParams.Tone.fDtmfCompleteSuppression = pVpGrp1Params->fStreamToneDtmfCompleteSuppression;
							StreamParams.Tone.fDtmfToneRegeneration = pVpGrp1Params->fStreamToneDtmfToneRegeneration;
							StreamParams.fEnableRfc2833ToneRelay = pVpGrp1Params->fStreamToneEnableRfc2833ToneRelay;
						}
						if( pVpGrp1Params->fStreamJitterBufferParamsAvailable == TBX_TRUE )
						{
							/* Overwrite default stream jitter buffer parameters */
							StreamParams.JitterParams.un16DelayInitMsec = pVpGrp1Params->un16StreamJitterBufferDelayInitMsec;
							StreamParams.JitterParams.un16MinDelayMsec = pVpGrp1Params->un16StreamJitterBufferMinDelayMsec;
							StreamParams.JitterParams.un16MaxDelayMsec = pVpGrp1Params->un16StreamJitterBufferMaxDelayMsec;
							StreamParams.JitterParams.un16AdaptationPeriodMsec = pVpGrp1Params->un16StreamJitterBufferAdaptationPeriodMsec;
							StreamParams.JitterParams.un16DeletionThresholdMsec = pVpGrp1Params->un16StreamJitterBufferDeletionThresholdMsec;
							StreamParams.JitterParams.fSmoothDeletionMode = pVpGrp1Params->fStreamJitterBufferSmoothDeletionMode;
						}
						if( pVpGrp1Params->fStreamRtcpParamsAvailable == TBX_TRUE )
						{
							/* Overwrite default stream RTCP parameters */
							StreamParams.fUseRtcp = pVpGrp1Params->fStreamRtcpUseRtcp;
							StreamParams.fUseExtendedRtcp = pVpGrp1Params->fStreamRtcpUseExtendedRtcp;
						}

						memcpy( &pVpGroup->aRes[0].Params.Group1.Stream, &StreamParams, sizeof(StreamParams) );
					}
					pVpGroup->aRes[0].Params.Group1.Stream.Codec.CodecType			= in_pConnectionParams->Type1.SecondRes.PacketType;
					switch( pVpGroup->aRes[0].Params.Group1.Stream.Codec.CodecType )
					{
						case TBX_STREAM_PACKET_TYPE_G723:
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.G723.fUseHighRateCodec = TBX_FALSE;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.G723.fEnableDcRemoval	= TBX_FALSE;
							break;
						case TBX_STREAM_PACKET_TYPE_G726_16:
						case TBX_STREAM_PACKET_TYPE_G726_24:
						case TBX_STREAM_PACKET_TYPE_G726_32:
						case TBX_STREAM_PACKET_TYPE_G726_40:
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.G726.fUseIETFBitPacking = TBX_FALSE;
							break;
						case TBX_STREAM_PACKET_TYPE_AMR:
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Amr.SpeedRate = TBX_STREAM_AMR_RATE_12_2;
							break;
						case TBX_STREAM_PACKET_TYPE_SMV:
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Smv.CdmaParams.un8CodecMode		= 0;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Smv.CdmaParams.un8MaxRate			= 0x04;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Smv.CdmaParams.un8MinRate			= 0x01;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Smv.CdmaParams.un8Signaling		= 0;
							break;
						case TBX_STREAM_PACKET_TYPE_EVRC:
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Evrc.CdmaParams.un8CodecMode		= 0;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Evrc.CdmaParams.un8MaxRate			= 0x04;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Evrc.CdmaParams.un8MinRate			= 0x01;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Evrc.CdmaParams.un8Signaling		= 0;
							break;
						case TBX_STREAM_PACKET_TYPE_QCELP8:
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Qcelp8.CdmaParams.un8CodecMode		= 0;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Qcelp8.CdmaParams.un8MaxRate		= 0x04;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Qcelp8.CdmaParams.un8MinRate		= 0x01;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Qcelp8.CdmaParams.un8Signaling		= 0;
							break;
						case TBX_STREAM_PACKET_TYPE_QCELP13:
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Qcelp13.CdmaParams.un8CodecMode	= 0;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Qcelp13.CdmaParams.un8MaxRate		= 0x04;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Qcelp13.CdmaParams.un8MinRate		= 0x01;
							pVpGroup->aRes[0].Params.Group1.Stream.Codec.Qcelp13.CdmaParams.un8Signaling	= 0;
							break;
						default:
							/* No parameters to initialize for the other stream packet types */
							break;
					}

					/*
					 *	TDM resource
					 */
					pVpGroup->aRes[1].Params.Group1.ResType 						= TB640_VP_RES_TYPE_TDM;
					pVpGroup->aRes[1].Params.Group1.un64UserContext1 				= 0;
					pVpGroup->aRes[1].Params.Group1.un64UserContext2 				= 0;
					{
						TB640_VP_GROUP1_TDM_PARAMS	TdmParams;
						TB640_VP_GROUP1_TDM_PARAMS_DEFAULT( &TdmParams );

						if( pVpGrp1Params->fTdmToneParamsAvailable == TBX_TRUE )
						{
							/* Overwrite default TDM tone parameters */
							TdmParams.Tone.fGenerationEnabled = pVpGrp1Params->fTdmToneGenerationEnabled;
							TdmParams.Tone.fDetectionEnabled = pVpGrp1Params->fTdmToneDetectionEnabled;
							TdmParams.Tone.fDtmfSuppressionEnabled = pVpGrp1Params->fTdmToneDtmfSuppressionEnabled;
							TdmParams.Tone.fDtmfCompleteSuppression = pVpGrp1Params->fTdmToneDtmfCompleteSuppression;
							TdmParams.Tone.fDtmfToneRegeneration = pVpGrp1Params->fTdmToneDtmfToneRegeneration;
						}
						if( pVpGrp1Params->fTdmAgcParamsAvailable == TBX_TRUE )
						{
							/* Overwrite default TDM AGC parameters */
							TdmParams.Agc.fEnabled = pVpGrp1Params->fTdmAgcEnabled;
						}
						if( pVpGrp1Params->fTdmVadParamsAvailable == TBX_TRUE )
						{
							/* Overwrite default TDM VAD parameters */
							TdmParams.Vad.fEnabled = pVpGrp1Params->fTdmVadEnabled;
						}
						if( pVpGrp1Params->fTdmEchoParamsAvailable == TBX_TRUE )
						{
							/* Overwrite default TDM ECHO parameters */
							TdmParams.Echo.fEnable = pVpGrp1Params->fTdmEchoEnabled;
							TdmParams.Echo.un8WindowSizeMsec = pVpGrp1Params->un8TdmEchoWindowSizeMsec;
							TdmParams.Echo.un8TailLengthMsec = pVpGrp1Params->un8TdmEchoTailLengthMsec;
						}

						memcpy( &pVpGroup->aRes[1].Params.Group1.Tdm, &TdmParams, sizeof(TdmParams) );
					}
				}

				/*
				 *	Create and fill new stream resource context
				 */

				/* Get free stream resource context */
				pStreamRes = TBXPoolOfBuffersAlloc
				(
					in_pAdapterContext->pTargetConfig->hPoolOfStreamRes,
					(TBX_HASH_KEY)NULL
				);
				if( pStreamRes == NULL )
				{
					TBX_EXIT_ERROR (TBX_RESULT_FAIL, 0, "Maximum number of stream resources reached.");
				}

				/* Initialize stream resource context */
				pStreamRes->Common.hRes				= (TB640_RESOURCE_HANDLE)TBX_HANDLE_INVALID;
				pStreamRes->Common.un32ConnectionId	= un32ConnectionId;
				pStreamRes->Common.fAllocated		= TBX_TRUE;
				pStreamRes->Params.ResType			= TB640_RESOURCE_TYPE_FD;
				pStreamRes->Params.PacketType		= in_pConnectionParams->Type1.SecondRes.PacketType;
				if( in_pConnectionParams->Type1.SecondRes.GroupType == TB640_VP_GROUP_TYPE_0 )
				{
					pStreamRes->Params.PacketDurationMs	= TBX_STREAM_PACKET_DURATION_160MS;
					pStreamRes->Params.Interface		= TB640_STREAM_INTERFACE_TYPE_BASE;
					pStreamRes->Params.RedundancyMode	= TBX_STREAM_NETWORK_REDUNDANCY_MODE_DUPLICATE;
					pStreamRes->Params.fUseRtpOverRawIp	= TBX_TRUE;
					pStreamRes->Params.fUseRtcp			= TBX_FALSE;
					strncpy( pStreamRes->Params.szIPAddr0, in_pConnectionParams->Type1.SecondRes.szStreamSocketIP, sizeof(pStreamRes->Params.szIPAddr0) );
					pStreamRes->Params.szIPAddr0[ sizeof(pStreamRes->Params.szIPAddr0) - 1] = '\0';
					strncpy( pStreamRes->Params.szIPAddr1, in_pConnectionParams->Type1.SecondRes.szStreamSocketIP, sizeof(pStreamRes->Params.szIPAddr1) );
					pStreamRes->Params.szIPAddr1[ sizeof(pStreamRes->Params.szIPAddr1) - 1] = '\0';
					if( pVpGrp0Params->fStreamParamsAvailable == TBX_TRUE )
					{
						/* Overwrite default stream parameters */
						pStreamRes->Params.PacketDurationMs	= pVpGrp0Params->StreamPacketDurationMs;
					}
				}
				else if( in_pConnectionParams->Type1.SecondRes.PacketType == TBX_STREAM_PACKET_TYPE_IFP )
				{
					pStreamRes->Params.PacketDurationMs	= 0;
					pStreamRes->Params.Interface		= TB640_STREAM_INTERFACE_TYPE_VOIP;
					pStreamRes->Params.RedundancyMode	= TBX_STREAM_NETWORK_REDUNDANCY_MODE_NONE;
					pStreamRes->Params.fUseRtpOverRawIp	= TBX_FALSE;
					pStreamRes->Params.fUseRtcp			= TBX_FALSE;
					strncpy( pStreamRes->Params.szIPAddr0, in_pConnectionParams->Type1.SecondRes.szStreamSocketIP, sizeof(pStreamRes->Params.szIPAddr0) );
					pStreamRes->Params.szIPAddr0[ sizeof(pStreamRes->Params.szIPAddr0) - 1] = '\0';
					pStreamRes->Params.szIPAddr1[0] = '\0';
				}
				else
				{
					pStreamRes->Params.PacketDurationMs	= TBX_STREAM_PACKET_DURATION_30MS;
					pStreamRes->Params.Interface		= TB640_STREAM_INTERFACE_TYPE_VOIP;
					pStreamRes->Params.RedundancyMode	= TBX_STREAM_NETWORK_REDUNDANCY_MODE_NONE;
					pStreamRes->Params.fUseRtpOverRawIp	= TBX_FALSE;
					pStreamRes->Params.fUseRtcp			= TBX_FALSE;
					if( pVpGrp1Params->fStreamParamsAvailable == TBX_TRUE )
					{
						/* Overwrite default stream parameters */
						pStreamRes->Params.PacketDurationMs	= pVpGrp1Params->StreamPacketDurationMs;
					}
					if( pVpGrp1Params->fStreamRtcpParamsAvailable == TBX_TRUE )
					{
						/* Overwrite default stream RTCP parameters */
						pStreamRes->Params.fUseRtcp			= pVpGrp1Params->fStreamRtcpUseRtcp;
					}
					strncpy( pStreamRes->Params.szIPAddr0, in_pConnectionParams->Type1.SecondRes.szStreamSocketIP, sizeof(pStreamRes->Params.szIPAddr0) );
					pStreamRes->Params.szIPAddr0[ sizeof(pStreamRes->Params.szIPAddr0) - 1] = '\0';
					pStreamRes->Params.szIPAddr1[0] = '\0';
				}
				pStreamRes->Params.un16FromNetworkIPPort	= in_pConnectionParams->Type1.SecondRes.un16RxIPPort;
				pStreamRes->Params.un16ToNetworkIPPort		= in_pConnectionParams->Type1.SecondRes.un16TxIPPort;
				pStreamRes->Params.un8TosByte	= 0;
			}
			else if( in_pConnectionParams->Type1.SecondRes.Type == VOIP_RESOURCE_TYPE_RAW_DATA_FILE)
			{
				un32PathDescCount = 1;

				/* Find the raw data file context */
				TBXHashFind
				(
					in_pAdapterContext->pTargetConfig->hRawDataFileNameHash,
					(TBX_HASH_KEY) in_pConnectionParams->Type1.SecondRes.szRawDataFileResName,
					&pRawDataFileContext
				);
				if( !pRawDataFileContext )
				{
					sprintf( szErr, "Invalid raw data file name: %s", in_pConnectionParams->Type1.SecondRes.szRawDataFileResName );
					TBX_EXIT_ERROR (TBX_RESULT_NOT_FOUND, 0,szErr );
				}
				if( pRawDataFileContext->un32TdmConnectionId != 0 )
				{
					sprintf(	szErr,
								"Raw data file %s already connected (connId=%d)",
								in_pConnectionParams->Type1.SecondRes.szRawDataFileResName,
								pRawDataFileContext->un32ConnectionId );
					TBX_EXIT_ERROR (TBX_RESULT_NOT_FOUND, 0,szErr );
				}
				pRawDataFileContext->un32TdmConnectionId = un32ConnectionId;
				if( pRawDataFileContext->Params.Direction != VOIP_RAW_DATAFILE_DIRECTION_REC_PLAY )
				{
					fFullDuplex = TBX_FALSE;
				}
			}
			else
			{
				TBX_EXIT_ERROR(TBX_RESULT_FAIL, 0, "Unknown second connection types" );
			}

			/*
			 *	Create and fill new connection context

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -