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