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

📄 voip_raw_data_file.c

📁 telcobridges voip develop
💻 C
📖 第 1 页 / 共 5 页
字号:
	IN		PVOIP_RAW_DATA_FILE_CONTEXT	in_pRawDataFileContext
)
{
	TBX_BOOL			fFreeContext;
	TBX_RESULT			Result;
									
	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Code section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	CODE
	{
		/* Initialize local variables */
		fFreeContext = TBX_TRUE;

		if( in_pRawDataFileContext->RecordContext.hRecord != (TBX_STREAM_LIB_PLAY_HANDLE)TBX_HANDLE_INVALID )
		{
			if( !in_pRawDataFileContext->RecordContext.fStopping )
			{
				in_pRawDataFileContext->RecordContext.fStopping = TBX_TRUE;
				/* Free record resource */
				TBXStreamStop( g_pContext->hStreamLib, in_pRawDataFileContext->RecordContext.hRecord );
				TbxCliToolsLogPrint
				(
					g_pContext->CliContext.hCliTools, TRACE_LEVEL_ALWAYS, FBLUE,
					"Stopping record on RawDataFile %s.\n",
					in_pRawDataFileContext->Params.szRawDataFileResName
				);

			}
			fFreeContext = TBX_FALSE;
		}
		if( in_pRawDataFileContext->PlayContext.hPlay != (TBX_STREAM_LIB_PLAY_HANDLE)TBX_HANDLE_INVALID )
		{
			if( !in_pRawDataFileContext->PlayContext.fStopping )
			{
				in_pRawDataFileContext->PlayContext.fStopping = TBX_TRUE;
				/* Free play resource */
				TBXStreamStop( g_pContext->hStreamLib, in_pRawDataFileContext->PlayContext.hPlay );
				TbxCliToolsLogPrint
				(
					g_pContext->CliContext.hCliTools, TRACE_LEVEL_ALWAYS, FBLUE,
					"Stopping play on RawDataFile %s.\n",
					in_pRawDataFileContext->Params.szRawDataFileResName
				);
			}
			fFreeContext = TBX_FALSE;
		}
		
		if( fFreeContext )
		{
			TbxCliToolsLogPrint
			(
				g_pContext->CliContext.hCliTools, TRACE_LEVEL_ALWAYS, FBLUE,
				"RawDataFile %s has been cleared.\n",
				in_pRawDataFileContext->Params.szRawDataFileResName
			);

			if( in_pRawDataFileContext->RecordContext.pFile )
			{
				fclose( in_pRawDataFileContext->RecordContext.pFile );
				in_pRawDataFileContext->RecordContext.pFile = NULL;
			}
			if( in_pRawDataFileContext->PlayContext.pData )
			{
				free( in_pRawDataFileContext->PlayContext.pData );
				in_pRawDataFileContext->PlayContext.pData = NULL;
			}

			/* Remove from hash tables */
			Result = TBXHashRemove( in_pAdapterContext->CurrentConfig.hRawDataFileNameHash, (TBX_HASH_KEY)in_pRawDataFileContext->Params.szRawDataFileResName, NULL );
			if( TBX_RESULT_FAILURE( Result ) )
			{
			    TBX_EXIT_ERROR( Result, 0, "could not remove RawDataFile context from name hash table!" );
			}
			Result = TBXHash64Remove( in_pAdapterContext->CurrentConfig.hRawDataFileIdHash64, in_pRawDataFileContext->un64Id, NULL );
			if( TBX_RESULT_FAILURE( Result ) )
			{
			    TBX_EXIT_ERROR( Result, 0, "could not remove RawDataFile context from id hash table!" );
			}

			TBXPoolOfBuffersFree( in_pAdapterContext->CurrentConfig.hPoolOfRawDataFiles, in_pRawDataFileContext );

		}
		else
		{
			in_pRawDataFileContext->fCleanupPending = TBX_TRUE;
			TBX_EXIT_SUCCESS (TBX_RESULT_OPERATION_INCOMPLETE);
		}


		/* End of the code (skip to cleanup) */
		TBX_EXIT_SUCCESS (TBX_RESULT_OK);
	}

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Error handling section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	ERROR_HANDLING
	{
		VoipCliAdapterStatePrint
		(
			in_pAdapterContext,
			TRACE_LEVEL_ERROR,
			"VOIPRawDataFileClearContext:%s (Result 0x%X)\n",
			TBX_ERROR_DESCRIPTION,
			(int)TBX_ERROR_RESULT
		);
	}

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Cleanup section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	CLEANUP
	{
	}

	RETURN;
}


/*--------------------------------------------------------------------------------------------------------------------------------
 |
 |  VoipStreamLibStopConfirmCallback		:	Sample TBX Stream library 'stop confirm' callback.
 |
 |	in_hPlay								:	Handle of the playback that has stopped.
 |	in_un64UserContext						:	User context for that port passed when called TBXStreamPlay()
 |											
 |  Note									:	~
 |											
 |  Return									:	TBX_RESULT_API_OK
 |												TBX_RESULT_API_NULL_PARAM
 |												TBX_RESULT_API_NOT_ENOUGH_MEMORY
 |												TBX_RESULT_API_INVALID_TRANSPORT_TYPE
 |												TBX_RESULT_API_GATEWAY_NOT_FOUND
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT VoipStreamLibStopConfirmCallback(
	IN		TBX_STREAM_LIB_HANDLE		in_hLib,
	IN		TBX_STREAM_LIB_PLAY_HANDLE	in_hPlay,
	IN		TBX_UINT64					in_un64UserContext )
{
	TBX_RESULT							Result;
	PVOIP_EVT_OP_STREAMING_STOP_CONFIRMED	pEvt;
	TBX_MSG_HANDLE						hMsg;
	TBX_UINT32							un32MsgSize;
	PVOIP_CLI_CONTEXT					pCliContext;
	TBX_ADAPTER_HANDLE					hAdapter;

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Code section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	CODE
	{
		/* Initialize local variables */
		Result		= TBX_RESULT_OK;
		pCliContext	= &g_pContext->CliContext;
		pEvt		= NULL;

		hAdapter = (TBX_ADAPTER_HANDLE) (in_un64UserContext >> 32) & 0xFFFFFFFF;

		TbxCliToolsLogPrint
		(
			g_pContext->CliContext.hCliTools,
			TRACE_LEVEL_2, NULL,
			"VoipStreamLibStopConfirmCallback\n"
		);
		/* Allocate a message buffer */
		un32MsgSize = sizeof(*pEvt);
		Result = TBXGetMsg (g_pContext->hTbxLib, un32MsgSize , &hMsg);
		if (TBX_RESULT_FAILURE (Result))
		{
			TBX_EXIT_ERROR (Result, 0, "Failed to get message buffer.");
		}

		/* Clear the buffer... */
		memset (TBX_MSG_PAYLOAD_POINTER (hMsg), 0, TBX_MSG_PAYLOAD_MAX_LENGTH_GET (hMsg));

		/* Set the message header */
		TBX_FORMAT_MSG_HEADER
		(
			hMsg,
			VOIP_MSG_ID_OP_STREAM_STOP_CONFIRMED,
			TBX_MSG_TYPE_REQUEST,
			un32MsgSize,
			TBX_HOSTLIB_ADAPTER_HANDLE,
			hAdapter,
			0
		);

		/* Fill the request */

		pEvt = (PVOIP_EVT_OP_STREAMING_STOP_CONFIRMED) TBX_MSG_PAYLOAD_POINTER (hMsg);
		pEvt->un32MsgVersion		= 1;
		pEvt->hPlay					= in_hPlay;
		pEvt->un64Id				= in_un64UserContext;

		/* Send the message */
		Result	= TBXSendMsg (g_pContext->hTbxLib, hMsg, NULL);
		hMsg	= TBX_HANDLE_INVALID;
		pEvt	= NULL;

		if (TBX_RESULT_FAILURE (Result))
		{
			TBX_EXIT_ERROR (Result, 0, "Failed to send message buffer.");
		}

		/* End of the code (skip to cleanup) */
		TBX_EXIT_SUCCESS (TBX_RESULT_OK);
	}

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Error handling section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	ERROR_HANDLING
	{
		TbxCliToolsLogPrint
			
		(
			pCliContext->hCliTools,
			TRACE_LEVEL_ERROR, NULL,
			"VoipStreamLibStopConfirmedCallback: %s, result 0x%08X\n",
			TBX_ERROR_DESCRIPTION,
			(int)TBX_ERROR_RESULT
		);
	}

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Cleanup section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	CLEANUP
	{
	}

	RETURN;
}

/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  VoipHandleStreamStopConfirmed:	Handles a confirmation from the steam lib that a play or record has stopped.
 |
 |  io_pAdapterContext		:	Context of the adapter
 |	in_hMsg					:	Message received for this adapter
 |
 |  Note					:	~
 |
 |  Return					:	~
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT	VoipHandleStreamStopConfirmed(
	IN		PVOIP_ADAPTER_CONTEXT	in_pAdapterContext,
	IN		TBX_MSG_HANDLE			in_hMsg)
{
	PVOIP_EVT_OP_STREAMING_STOP_CONFIRMED	pEvent;
	PVOIP_RAW_DATA_FILE_CONTEXT				pRawDataFileContext;
	TBX_RESULT								Result;
										
	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Code section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	CODE
	{
		/* Initialize local variables */
		pEvent						= TBX_MSG_PAYLOAD_POINTER( in_hMsg );

		TBXHash64Find
		(
			in_pAdapterContext->CurrentConfig.hRawDataFileIdHash64,
			(TBX_HASH_64_KEY)pEvent->un64Id,
			&pRawDataFileContext
		);
		if( !pRawDataFileContext || !pRawDataFileContext->fAllocated )
		{
		    TBX_EXIT_ERROR( TBX_RESULT_FAIL, 0, "Could not find raw data file context!" );
		}

		if( !pRawDataFileContext || !pRawDataFileContext->fAllocated )
		{
			/* Stop confirmed for an unknown raw data file. Just clear the resource. */
			TBXStreamFree( g_pContext->hStreamLib, pEvent->hPlay );

			TBX_EXIT_ERROR( TBX_RESULT_FAIL, 0, "Could not find raw data file context!" );
		}

		VoipCliAdapterStatePrint
		(
			in_pAdapterContext,
			TRACE_LEVEL_2,
			"Stop confirmed from streamlib for raw data file %s on adapter %s.\n",
			pRawDataFileContext->Params.szRawDataFileResName,
			in_pAdapterContext->AdapterInfo.szSerialNumber
		);


		/* Update context */
		if( pEvent->hPlay == pRawDataFileContext->PlayContext.hPlay )
		{
			Result = TBXStreamFree( g_pContext->hStreamLib, pRawDataFileContext->PlayContext.hPlay );
			if( TBX_RESULT_FAILURE( Result ) )
			{
				VoipCliAdapterStatePrint
				(
					in_pAdapterContext,
					TRACE_LEVEL_ERROR,
					"Failed to free stream play resource for raw data file %d.\n",
					(unsigned int)pRawDataFileContext->un64Id
				);
			}
			pRawDataFileContext->PlayContext.hPlay = (TBX_STREAM_LIB_PLAY_HANDLE) TBX_HANDLE_INVALID;
			pRawDataFileContext->PlayContext.fStarting	= TBX_FALSE;
			pRawDataFileContext->PlayContext.fPlaying	= TBX_FALSE;
			pRawDataFileContext->PlayContext.fStopping	= TBX_FALSE;
		}

		if( pEvent->hPlay == pRawDataFileContext->RecordContext.hRecord )
		{
			Result = TBXStreamFree( g_pContext->hStreamLib, pRawDataFileContext->RecordContext.hRecord );
			if( TBX_RESULT_FAILURE( Result ) )
			{
				VoipCliAdapterStatePrint
				(
					in_pAdapterContext,
					TRACE_LEVEL_ERROR,
					"Failed to free stream record resource for raw data file %d.\n",
					(unsigned int)pRawDataFileContext->un64Id
				);
			}
			pRawDataFileContext->RecordContext.hRecord = (TBX_STREAM_LIB_PLAY_HANDLE) TBX_HANDLE_INVALID;
			pRawDataFileContext->RecordContext.fStarting = TBX_FALSE;
			pRawDataFileContext->RecordContext.fStopping = TBX_FALSE;
		}
		if( pRawDataFileContext->RecordContext.hRecord == (TBX_STREAM_LIB_PLAY_HANDLE) TBX_HANDLE_INVALID &&
			pRawDataFileContext->PlayContext.hPlay == (TBX_STREAM_LIB_PLAY_HANDLE) TBX_HANDLE_INVALID )
		{
			pRawDataFileContext->fActive = TBX_FALSE;

			if( !pRawDataFileContext->fCleanupPending )
			{
				VoipCliAdapterStatePrint
				(
					in_pAdapterContext,
					TRACE_LEVEL_2,
					"Raw data file %s has completed.\n",
					pRawDataFileContext->Params.szRawDataFileResName
				);
			}
			else
			{
				/* Free context */
				Result = VoipRawDataFileClearContext( in_pAdapterContext, pRawDataFileContext );
				pRawDataFileContext = NULL;
				if( TBX_RESULT_FAILURE( Result ) )
				{
				    TBX_EXIT_ERROR( Result, 0, "Error while freeing raw data file context!" );
				}
				
			}
		}

		/* End of the code (skip to cleanup) */
		TBX_EXIT_SUCCESS (TBX_RESULT_OK);
	}

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Error handling section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	ERROR_HANDLING
	{
		VoipCliAdapterStatePrint

⌨️ 快捷键说明

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