📄 voip_adapter_configure.c
字号:
/*
* 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 + -