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

📄 voip_adapter_configure.c

📁 telcobridges voip develop
💻 C
📖 第 1 页 / 共 5 页
字号:
	TBX_UINT32					un32DstTrunkNb;
	TBX_UINT32					un32DstMblPortNb;
	TBX_UINT32					un32DstMblStreamNb;
	TBX_UINT32					un32DstTimeSlot;
	TBX_UINT32					un32PathDescCount;
	TBX_CHAR					szErr[128];
	TBX_BOOL					fFullDuplex;

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Code section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	CODE
	{
		/* Initialize local variables */
		Result				= TBX_RESULT_OK;
		un32ConnectionIdx	= (TBX_UINT32)-1;
		un32ConnectionId	= 0;
		pVpGrp0Params		= &in_pAdapterContext->pTargetConfig->VpGrp0Params;
		pVpGrp1Params		= &in_pAdapterContext->pTargetConfig->VpGrp1Params;
		pVpGroup			= NULL;
		pStreamRes			= NULL;
		fFullDuplex			= TBX_TRUE;
		un32PathDescCount	= 0;

		/* Get free connection idx and reserved it */
		for( un32Index = 0; un32Index < VOIP_MAX_CONNECTION_IDX_PER_ADAPTER; un32Index++ )
		{
			un32Index2 = ((in_pAdapterContext->pTargetConfig->un32ConnectionIdxReservedLast + un32Index + 1) % VOIP_MAX_CONNECTION_IDX_PER_ADAPTER);
			if( in_pAdapterContext->pTargetConfig->aun32ConnectionIdxReserved[un32Index2] == 0 )
			{
				un32ConnectionIdx = un32Index2;
				break;
			}
		}

		if( un32Index >= VOIP_MAX_CONNECTION_IDX_PER_ADAPTER )
		{
			TBX_EXIT_ERROR( TBX_RESULT_NOT_FOUND, 0, "Failed to found free connection index!" );
		}

		if( in_pConnectionParams->Type == VOIP_CONNECTION_TYPE_0 )
		{
			/*
			 *	Connection type 0 (prompt or raw data file connection)
			 */

			/* Create new connection identifier */
			un32ConnectionId = VOIP_CREATE_CONNECTION_ID(VOIP_CONNECTION_TYPE_0, un32ConnectionIdx);

			/*
			 *	Create and fill new VP group context
			 */

			/* Get VP group context */
			pVpGroup = TBXPoolOfBuffersAlloc
			(
				in_pAdapterContext->pTargetConfig->hPoolOfVpGroups,
				(TBX_HASH_KEY)NULL
			);
			if( pVpGroup == NULL )
			{
				TBX_EXIT_ERROR( TBX_RESULT_FAIL, 0, "Maximum number of VP groups reached." );
			}

			/* Initialize voice processing resource context */
			pVpGroup->Common.hRes					= (TB640_VPGROUP_HANDLE)NULL;
			pVpGroup->Common.un32ConnectionId		= un32ConnectionId;
			pVpGroup->Common.fAllocated				= TBX_TRUE;

			#ifdef VOIP_PROMPT_USE_GROUP1
			{
				/*
				 *	Using voice processing group 1
				 */
				pVpGroup->GroupParams.GroupType			= TB640_VP_GROUP_TYPE_1;
				pVpGroup->GroupParams.Group0.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 = TBX_STREAM_PACKET_TYPE_PCMA;
					StreamParams.aPacketProtocol[un32Count].un8TxProtocolType = TBX_STREAM_PACKET_TYPE_PCMA;
					StreamParams.aPacketProtocol[un32Count++].un8RxProtocolType = TBX_STREAM_PACKET_TYPE_PCMA;

					memcpy( &pVpGroup->aRes[0].Params.Group1.Stream, &StreamParams, sizeof(StreamParams) );
				}
				pVpGroup->aRes[0].Params.Group1.Stream.Codec.CodecType			= TBX_STREAM_PACKET_TYPE_PCMA;
				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;
				}
				pVpGroup->aRes[0].Params.Group1.Stream.PacketDurationMs	= TBX_STREAM_PACKET_DURATION_20MS;

				/*
				 *	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 );

					memcpy( &pVpGroup->aRes[1].Params.Group1.Tdm, &TdmParams, sizeof(TdmParams) );
				}
			}
			#else
			{
				/*
				 *	Using voice processing group 0
				 */
				pVpGroup->GroupParams.GroupType			= TB640_VP_GROUP_TYPE_0;
				pVpGroup->GroupParams.Group0.GroupType	= TB640_VP_GROUP_TYPE_0;
				{
					TB640_VP_GROUP0_CONF_PARAMS				ConfParams;
					TB640_VP_GROUP0_FSK_RX_AUTO_PARAMS		FskRxParams;
					TB640_VP_GROUP0_CONF_PARAMS_DEFAULT( &ConfParams );
					TB640_VP_GROUP0_FSK_RX_AUTO_PARAMS_DEFAULT( &FskRxParams );

					memcpy (&pVpGroup->GroupParams.Group0.Conf, &ConfParams, sizeof(ConfParams));
					memcpy (&pVpGroup->GroupParams.Group0.FskRxAuto, &FskRxParams, sizeof(FskRxParams));
				}
				pVpGroup->un32NbResources										= 2;
				pVpGroup->aRes[0].Params.Group0.ResType							= TB640_VP_RES_TYPE_STREAM;
				pVpGroup->aRes[0].Params.Group0.un64UserContext1				= un32ConnectionId;
				pVpGroup->aRes[0].Params.Group0.un64UserContext2				= 0;
				TB640_VP_GROUP0_STREAM_PARAMS_DEFAULT(&(pVpGroup->aRes[0].Params.Group0.Stream));
				pVpGroup->aRes[0].Params.Group0.Stream.fPlaybackEnabled			= in_pConnectionParams->Type0.fPlaybackEnabled;
				pVpGroup->aRes[0].Params.Group0.Stream.fRecordEnabled			= in_pConnectionParams->Type0.fRecordEnabled;
				pVpGroup->aRes[0].Params.Group0.Stream.PacketType				= TBX_STREAM_PACKET_TYPE_PCMA;
				pVpGroup->aRes[0].Params.Group0.Stream.PacketDurationMs 		= TBX_STREAM_PACKET_DURATION_160MS;
				pVpGroup->aRes[0].Params.Group0.Stream.un32JitterBufferSize		= 3;
				pVpGroup->aRes[0].Params.Group0.Stream.Agc.fEnabled 			= TBX_FALSE;
				pVpGroup->aRes[0].Params.Group0.Stream.Tone.fGenerationEnabled	= TBX_FALSE;
				pVpGroup->aRes[0].Params.Group0.Stream.Tone.fDetectionEnabled 	= TBX_FALSE;
				pVpGroup->aRes[0].Params.Group0.Stream.Tone.DetectionTypeMask 	= 0;
				pVpGroup->aRes[0].Params.Group0.Stream.Tone.fSuppressionEnabled	= TBX_FALSE;
				pVpGroup->aRes[0].Params.Group0.Stream.Tone.CompleteSuppressMode= TB640_VP_GRP0_TONE_SUPPRESS_MODE_SILENCE;
				pVpGroup->aRes[0].Params.Group0.Stream.Tone.fCompleteSuppression= TBX_FALSE;
				pVpGroup->aRes[1].Params.Group0.ResType 						= TB640_VP_RES_TYPE_TDM;
				pVpGroup->aRes[1].Params.Group0.un64UserContext1 				= 0;
				pVpGroup->aRes[1].Params.Group0.un64UserContext2 				= 0;
				//TB640_VP_GROUP0_TDM_PARAMS_DEFAULT(&(pVpGroup->aRes[1].Params.Group0.Tdm));
				pVpGroup->aRes[1].Params.Group0.Tdm.Vad.fEnabled				= TBX_FALSE;
				pVpGroup->aRes[1].Params.Group0.Tdm.Agc.fEnabled 				= TBX_FALSE;
				pVpGroup->aRes[1].Params.Group0.Tdm.Tone.fGenerationEnabled 	= TBX_FALSE;
				pVpGroup->aRes[1].Params.Group0.Tdm.Tone.fDetectionEnabled 		= TBX_FALSE;
				pVpGroup->aRes[1].Params.Group0.Tdm.Tone.DetectionTypeMask		= 0;
				pVpGroup->aRes[1].Params.Group0.Tdm.Tone.fSuppressionEnabled 	= TBX_FALSE;
				pVpGroup->aRes[1].Params.Group0.Tdm.Tone.CompleteSuppressMode	= TB640_VP_GRP0_TONE_SUPPRESS_MODE_SILENCE;
				pVpGroup->aRes[1].Params.Group0.Tdm.Tone.fCompleteSuppression	= TBX_FALSE;
			}
			#endif

			/*
			 *	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;
			if( in_pConnectionParams->Type0.fPlaybackEnabled == TBX_TRUE &&
				in_pConnectionParams->Type0.fRecordEnabled == TBX_TRUE )
			{
				pStreamRes->Params.ResType		= TB640_RESOURCE_TYPE_FD;
			}
			else if( in_pConnectionParams->Type0.fPlaybackEnabled == TBX_TRUE )
			{
				pStreamRes->Params.ResType		= TB640_RESOURCE_TYPE_HD_SRC;
			}
			else
			{
				pStreamRes->Params.ResType		= TB640_RESOURCE_TYPE_HD_DST;
			}
			pStreamRes->Params.PacketType		= TBX_STREAM_PACKET_TYPE_PCMA;
			#ifdef VOIP_PROMPT_USE_GROUP1
			{
				pStreamRes->Params.PacketDurationMs	= TBX_STREAM_PACKET_DURATION_20MS;
				pStreamRes->Params.Interface		= TB640_STREAM_INTERFACE_TYPE_VOIP;
				pStreamRes->Params.un16FromNetworkIPPort	= in_pConnectionParams->Type0.un16RxIPPort;
				pStreamRes->Params.un16ToNetworkIPPort		= in_pConnectionParams->Type0.un16RxIPPort;
				pStreamRes->Params.fUseRtpOverRawIp	= TBX_FALSE;
				pStreamRes->Params.fUseRtcp			= TBX_FALSE;
				if( in_pConnectionParams->Type0.fRecordEnabled == TBX_TRUE )
				{
					strncpy(&pStreamRes->Params.szIPAddr0[0], &in_pConnectionParams->Type0.szStreamSocketIP[0], sizeof(pStreamRes->Params.szIPAddr0));
					pStreamRes->Params.szIPAddr0[ sizeof(pStreamRes->Params.szIPAddr0) - 1] = '\0';
					pStreamRes->Params.szIPAddr1[0] = '\0';
				}
				else
				{
					pStreamRes->Params.szIPAddr0[0] = '\0';
					pStreamRes->Params.szIPAddr1[0] = '\0';
				}
				pStreamRes->Params.RedundancyMode	= TBX_STREAM_NETWORK_REDUNDANCY_MODE_NONE;
				pStreamRes->Params.un8TosByte = 0;
			}
			#else
			{
				pStreamRes->Params.PacketDurationMs	= TBX_STREAM_PACKET_DURATION_160MS;
				pStreamRes->Params.Interface		= TB640_STREAM_INTERFACE_TYPE_BASE;
				pStreamRes->Params.un16FromNetworkIPPort	= in_pConnectionParams->Type0.un16RxIPPort;
				pStreamRes->Params.un16ToNetworkIPPort		= in_pConnectionParams->Type0.un16TxIPPort;

⌨️ 快捷键说明

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