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

📄 voip_raw_data_file.c

📁 telcobridges voip develop
💻 C
📖 第 1 页 / 共 5 页
字号:
/*--------------------------------------------------------------------------------------------------------------------------------
 |
 |	Project:    	VOIP sample
 |
 |	Filename:   	voip_stream_server.c
 |
 |	Copyright:  	TelcoBridges 2002-2004, All Rights Reserved
 |
 |	Description:	This file contains the code that handles communication with the stream server
 |
 |	Notes:      	Tabs = 4
 |
 *-------------------------------------------------------------------------------------------------------------------------------
 |
 |	Revision:   	$Revision: 1.1 $
 |
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Includes
 *------------------------------------------------------------------------------------------------------------------------------*/

#include "voip_includes.h"


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Forward declarations
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Defines
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Types
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Versioning
 *------------------------------------------------------------------------------------------------------------------------------*/

#ifdef WIN32
	/*@unused@*/ static char g_szFileVersion [] = "$Revision: 1.1 $";
#endif


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Global variables
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Macros
 *------------------------------------------------------------------------------------------------------------------------------*/


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Function Prototypes
 *------------------------------------------------------------------------------------------------------------------------------*/

static TBX_RESULT	VoipRawDataFileStartPlayInternal( PVOIP_RAW_DATA_FILE_PLAY_CONTEXT );
static TBX_RESULT	VoipRawDataFileStopPlayInternal( PVOIP_RAW_DATA_FILE_PLAY_CONTEXT	);
static TBX_RESULT	VoipRawDataFileClearInternal( PVOIP_RAW_DATA_FILE_PLAY_CONTEXT );
static TBX_HASH_KEY	VoipRawDataFileGetKey( PTBX_VOID, PTBX_VOID );
static TBX_RESULT	VoipRawDataFileStartRecordInternal( PVOIP_RAW_DATA_FILE_RECORD_CONTEXT );
static TBX_RESULT	VoipRawDataFileStopRecordInternal( PVOIP_RAW_DATA_FILE_RECORD_CONTEXT	);
//static TBX_RESULT	VoipRawDataFileClearInternal( PVOIP_RAW_DATA_FILE_RECORD_CONTEXT );


/*--------------------------------------------------------------------------------------------------------------------------------
 |  Implementation
 *------------------------------------------------------------------------------------------------------------------------------*/

/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  VoipStreamLibOpen		:	This function initializes the stream library.
 |
 |  io_pszRawDataFileIp0		:	First IP address of the stream server to use with this application
 |  io_pszRawDataFileIp1		:	Second IP address of the stream server to use with this application
 |
 |  Note						:	~
 |
 |  Return						:	TBX_RESULT_OK if the function succeeded
 |									Other error code if the function could not complete properly.
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT
VoipStreamLibOpen(
	IN		PTBX_CHAR	io_pszRawDataFileIp0,
	IN		PTBX_CHAR	io_pszRawDataFileIp1 )
{
	PVOIP_CLI_CONTEXT					pCliContext;
	TBX_RESULT							Result;

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

		memset( &g_pContext->StreamLibParam, 0, sizeof( g_pContext->StreamLibParam ) );
		g_pContext->StreamLibParam.un32StructVersion		= 1;
		g_pContext->StreamLibParam.pFctLogTrace				= VoipCliToolsLogPrint;
		g_pContext->StreamLibParam.pCtxLogTrace				= g_pContext->CliContext.hCliTools;
		g_pContext->StreamLibParam.pFctStderr				= VoipCliToolsErrPrint;
		g_pContext->StreamLibParam.pCtxStderr				= g_pContext->CliContext.hCliTools;
		g_pContext->StreamLibParam.pFctStopConfirmCallback	= VoipStreamLibStopConfirmCallback;
		g_pContext->StreamLibParam.pFctGetDataCallback		= NULL;
		g_pContext->StreamLibParam.pFctGetDataAddrCallback	= VoipStreamLibGetDataAddrCallback;
		g_pContext->StreamLibParam.pFctSavePacketCallback	= NULL;
		g_pContext->StreamLibParam.pFctSaveDataCallback		= VoipStreamLibSaveDataCallback;
		g_pContext->StreamLibParam.un32BufferSize			= TBX_STREAM_LIB_PACKET_SIZE_MAX * 50;
		g_pContext->StreamLibParam.un32AudioPayloadSize		= TBX_STREAM_LIB_PACKET_SIZE_MAX;
		g_pContext->StreamLibParam.un32Align				= 1;
		g_pContext->StreamLibParam.un32MaxPlaybacks			= 2048;
		g_pContext->StreamLibParam.fPacketReceiveEnabled	= TBX_TRUE;
		g_pContext->StreamLibParam.un16StreamPollingPort	= 0;	/* Use default value */
		g_pContext->StreamLibParam.un16FlowControlPort		= 0;	/* Use default value */

		Result = TBXStreamOpenLib (&g_pContext->StreamLibParam, &g_pContext->hStreamLib);
		if( TBX_RESULT_FAILURE( Result ) )
		{
		    TBX_EXIT_ERROR( Result, 0, "Failed to initialize stream lib!" );
		}
		

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

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Error handling section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	ERROR_HANDLING
	{
		/* Print the error to the user */
		TbxCliToolsLogPrint(
			pCliContext->hCliTools,
			TRACE_LEVEL_ERROR,
			NULL,
			"VoipStreamLibOpen: %s (Result 0x%08X, %s, line %d\n",
			TBX_ERROR_DESCRIPTION,
			TBX_ERROR_RESULT,
			__FILE__,
			TBX_ERROR_LINE);
	}

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

	RETURN;
}
/*-------------------------------------------------------------------------------------------------------------------------------
 |
 |  VoipStreamLibClose		:	This function closes the stream library.
 |
 |
 |  Note						:	~
 |
 |  Return						:	TBX_RESULT_OK if the function succeeded
 |									Other error code if the function could not complete properly.
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT
VoipStreamLibClose()
{
	PVOIP_CLI_CONTEXT					pCliContext;
	TBX_RESULT							Result;

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


		Result = TBXStreamCloseLib (g_pContext->hStreamLib);
		if( TBX_RESULT_FAILURE( Result ) )
		{
		    TBX_EXIT_ERROR( Result, 0, "Failed to initialize stream lib!" );
		}
		

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

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Error handling section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	ERROR_HANDLING
	{
		/* Print the error to the user */
		TbxCliToolsLogPrint(
			pCliContext->hCliTools,
			TRACE_LEVEL_ERROR,
			NULL,
			"VoipStreamLibOpen: %s (Result 0x%08X, %s, line %d\n",
			TBX_ERROR_DESCRIPTION,
			TBX_ERROR_RESULT,
			__FILE__,
			TBX_ERROR_LINE);
	}

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

	RETURN;
}

/*--------------------------------------------------------------------------------------------------------------------------------
 |
 |  VoipRawDataFilePlayAlloc	:	Function that allocates the runtime context to play a raw data file
 |
 |	in_un16Port					:	UDP port to use for stream
 |	in_pszIpAddress0			:
 |	in_pszPathName				:
 |	in_pun32PromptId			:
 |	in_un32NbRepeat				:	Number of time the raw data file will restart playing
 |
 |  Note						:	
 |
 |  Return						:	The allocated raw data file context, or NULL if out of resources
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT VoipRawDataFilePlayAlloc(
	IN		PVOIP_RAW_DATA_FILE_CONTEXT	in_pRawDataFileContext,
	IN		TBX_UINT16					in_un16Port,
	IN		PTBX_CHAR					in_pszIpAddress0,
	IN		PTBX_CHAR					in_pszPathName,
	IN		TBX_UINT32					in_un32NbRepeat)
{
	PVOIP_CLI_CONTEXT					pCliContext;
	PVOIP_RAW_DATA_FILE_PLAY_CONTEXT	pPlayContext;

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Code section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	CODE
	{
		/* Initialize local variables */
		pCliContext = &g_pContext->CliContext;
		pPlayContext = &in_pRawDataFileContext->PlayContext;

		TbxCliToolsLogPrint(
			pCliContext->hCliTools,
			TRACE_LEVEL_1, NULL,
			"Raw data file: Allocating play context for 0x%08X\n",
			in_pRawDataFileContext->Params.szRawDataFileResName );

		/* Initialize the raw data file context */
		memset( pPlayContext, 0, sizeof(*pPlayContext) );

		pPlayContext->fAllocated					= TBX_TRUE;
		pPlayContext->un64Id						= in_pRawDataFileContext->un64Id;
		pPlayContext->un32RepeatCount				= in_un32NbRepeat;
		pPlayContext->un32CurrentRepetition			= 1;
		pPlayContext->un16Port						= in_un16Port;
		strncpy( pPlayContext->szIpAddress0,		in_pszIpAddress0, sizeof(pPlayContext->szIpAddress0) );
		pPlayContext->szIpAddress0[sizeof(pPlayContext->szIpAddress0) - 1] = '\0';

		strncpy( pPlayContext->szPathName,			in_pszPathName, ( sizeof(pPlayContext->szPathName) - 1 ) );
		pPlayContext->fPlaying						= TBX_FALSE;
		/* Keep current time to know "where" to start raw data files playback from */
		pPlayContext->un32StartTime					= g_pContext->un32TimerCurrentTime;

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

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  Error handling section
	 *--------------------------------------------------------------------------------------------------------------------------*/
	ERROR_HANDLING
	{
		/* Print the error to the user */
		TbxCliToolsLogPrint(
			pCliContext->hCliTools,
			TRACE_LEVEL_ERROR,
			NULL,
			"VoipRawDataFileAlloc: %s (Result 0x%08X, %s, line %d)\n",
			TBX_ERROR_DESCRIPTION,
			TBX_ERROR_RESULT,
			__FILE__,
			TBX_ERROR_LINE);
	}

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

	RETURN;
}

/*--------------------------------------------------------------------------------------------------------------------------------
 |
 |  VoipRawDataFileStartPlay	:	Start playing an audio file for the specified raw data file
 |
 |	in_un32PromptId				:	Prompt context
 |
 |  Note						:	~
 |
 |  Return						:	TBX_RESULT_OK if the function succeeded
 |									Other error code if the function could not complete properly.
 |
 *------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT VoipRawDataFileStartPlay(
	IN		PVOIP_RAW_DATA_FILE_PLAY_CONTEXT	in_pPlayContext )
{
	TBX_RESULT							Result = TBX_RESULT_OK;
	PVOIP_CLI_CONTEXT					pCliContext;
	FILE*								pFile;
	TBX_UINT32							un32ByteRead;
	TBX_UINT32							un32FileSize;
	TBX_CHAR							szErr[128];

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

		/* Validate current state */
		if
		( 
			in_pPlayContext->fStarting	||
			in_pPlayContext->fPlaying	||
			in_pPlayContext->fStopping
		)
		{
			TBX_EXIT_ERROR( TBX_RESULT_INVALID_STATE, 0, "Invalid state to start raw data file play!" );
		}

		in_pPlayContext->un32StartTime = g_pContext->un32TimerCurrentTime;

		/* Get data */
		/* Try to open data file */
		pFile = fopen( in_pPlayContext->szPathName, "rb" );
		if( !pFile )
		{
			sprintf( szErr, "Could not open data file %s.", in_pPlayContext->szPathName );
			TBX_EXIT_ERROR (TBX_RESULT_INVALID_PARAM, 0,szErr );
		}
		
		/* Get file size */
		fseek( pFile, 0, SEEK_END );
		un32FileSize = ftell( pFile );

⌨️ 快捷键说明

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