📄 voip_stream_server.c
字号:
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CODE
{
/* Initialize local variables */
pCliContext = &g_pContext->CliContext;
pStreamServerContext = &g_pContext->StreamServerContext;
TBX_SEM_GET( pStreamServerContext->StreamServerSem, TBX_SEM_WAIT_FOREVER );
pStreamServerPromptContext = TBXPoolOfBuffersFind(
pStreamServerContext->hPoolOfPrompts,
(TBX_HASH_KEY)in_un32PromptId );
if( pStreamServerPromptContext == NULL )
{
TBX_EXIT_ERROR( TBX_RESULT_NOT_FOUND, 0, "Failed to found stream server prompt!" );
}
/* Validate current state */
if
(
pStreamServerPromptContext->fStarting ||
pStreamServerPromptContext->fPlaying ||
pStreamServerPromptContext->fStopping ||
!pStreamServerPromptContext->fSynched
)
{
TBX_EXIT_ERROR( TBX_RESULT_INVALID_STATE, 0, "Invalid state to start prompt play!" );
}
pStreamServerPromptContext->un32StartTime = g_pContext->un32TimerCurrentTime;
Result = VoipStreamServerStartPlayInternal( pStreamServerPromptContext );
if( TBX_RESULT_FAILURE( Result ) == TBX_TRUE )
{
TBX_EXIT_ERROR( Result, 0, "Failed to start prompt play!" );
}
/* 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,
"VoipStreamServerStartPlay: %s (Result 0x%08X, %s, line %d)\n",
TBX_ERROR_DESCRIPTION,
TBX_ERROR_RESULT,
__FILE__,
TBX_ERROR_LINE);
}
/*---------------------------------------------------------------------------------------------------------------------------
| Cleanup section
*--------------------------------------------------------------------------------------------------------------------------*/
CLEANUP
{
TBX_SEM_GIV( pStreamServerContext->StreamServerSem );
}
RETURN;
}
static TBX_RESULT VoipStreamServerStartPlayInternal(
IN PVOIP_STREAM_SERVER_PROMPT_CONTEXT in_pStreamServerPromptContext)
{
TBX_RESULT Result = TBX_RESULT_OK;
PVOIP_CLI_CONTEXT pCliContext;
STREAMSERVER_MSG PromptPlayMessage;
/*TBX_UINT32 un32ElapsedTimeMs;*/
PVOIP_STREAM_SERVER_CONTEXT pStreamServerContext;
/* Initialize local variables */
pCliContext = &g_pContext->CliContext;
pStreamServerContext = &g_pContext->StreamServerContext;
if( pStreamServerContext->fServerAvailable == TBX_TRUE )
{
memset( &PromptPlayMessage.ReqPlayPrompts, 0, sizeof(PromptPlayMessage.ReqPlayPrompts) );
PromptPlayMessage.Header.MessageType = STREAMSERVER_MSG_ID_REQ_PLAY_PROMPTS;
PromptPlayMessage.Header.un32UserContext = in_pStreamServerPromptContext->un32PromptId;
strncpy( PromptPlayMessage.ReqPlayPrompts.szStreamIp0, in_pStreamServerPromptContext->szIpAddress0, sizeof(PromptPlayMessage.ReqPlayPrompts.szStreamIp0) );
PromptPlayMessage.ReqPlayPrompts.szStreamIp0[sizeof(PromptPlayMessage.ReqPlayPrompts.szStreamIp0) - 1] = '\0';
strncpy( PromptPlayMessage.ReqPlayPrompts.szStreamIp1, in_pStreamServerPromptContext->szIpAddress1, sizeof(PromptPlayMessage.ReqPlayPrompts.szStreamIp1) );
PromptPlayMessage.ReqPlayPrompts.szStreamIp1[sizeof(PromptPlayMessage.ReqPlayPrompts.szStreamIp1) - 1] = '\0';
PromptPlayMessage.ReqPlayPrompts.un16StreamPort = in_pStreamServerPromptContext->un16Port;
PromptPlayMessage.ReqPlayPrompts.PacketDuration = TBX_STREAM_PACKET_DURATION_160MS;
PromptPlayMessage.ReqPlayPrompts.RedundancyMode = TBX_STREAM_NETWORK_REDUNDANCY_MODE_DUPLICATE;
PromptPlayMessage.ReqPlayPrompts.un32NbRepeat = in_pStreamServerPromptContext->un32NbRepeat;
/*
* Prepare the start offset according to the elapsed time since creation of this call
* (in case the playback has to be "restarted" after the stream server went down)
*/
// un32ElapsedTimeMs = TBX_GET_TICK() - in_pStreamServerPromptContext->un32StartTime;
// if( un32ElapsedTimeMs < 500 ) /* Ignore first 500ms which could be normal "delay" in the state machine */
PromptPlayMessage.ReqPlayPrompts.un32StartOffset = 0;
// else
// PromptPlayMessage.ReqPlayPrompts.un32StartOffset = un32ElapsedTimeMs;
/*
* Build a sequence of prompts to play
*/
PromptPlayMessage.ReqPlayPrompts.un32NbPrompts = 1;
strcpy( &PromptPlayMessage.ReqPlayPrompts.aszFileNames[0][0], in_pStreamServerPromptContext->szPathName );
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1,
NULL,
"Stream server: Starting play of '%s', port %u for prompt 0x%08X\n",
PromptPlayMessage.ReqPlayPrompts.aszFileNames[0],
(unsigned int)in_pStreamServerPromptContext->un16Port,
in_pStreamServerPromptContext->un32PromptId );
in_pStreamServerPromptContext->fStarting = TBX_TRUE;
in_pStreamServerPromptContext->fPlaying = TBX_FALSE;
in_pStreamServerPromptContext->fStopping = TBX_FALSE;
Result = StreamServerLibCommandSend
(
pStreamServerContext->hStreamServerLib,
&PromptPlayMessage,
pStreamServerContext->hStreamServer
);
}
return Result;
}
/*--------------------------------------------------------------------------------------------------------------------------------
|
| VoipStreamServerStopPlay : Stop playing an audio file for the specified prompt
|
| in_un32PromptId : Identifier of the prompt to stop playing.
|
| Note : ~
|
| Return : TBX_RESULT_OK if the function succeeded
| Other error code if the function could not complete properly.
|
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT VoipStreamServerStopPlay(
IN TBX_UINT32 in_un32PromptId )
{
TBX_RESULT Result = TBX_RESULT_OK;
PVOIP_CLI_CONTEXT pCliContext;
PVOIP_STREAM_SERVER_CONTEXT pStreamServerContext;
PVOIP_STREAM_SERVER_PROMPT_CONTEXT pStreamServerPromptContext;
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CODE
{
/* Initialize local variables */
pCliContext = &g_pContext->CliContext;
pStreamServerContext = &g_pContext->StreamServerContext;
TBX_SEM_GET( pStreamServerContext->StreamServerSem, TBX_SEM_WAIT_FOREVER );
pStreamServerPromptContext = TBXPoolOfBuffersFind(
pStreamServerContext->hPoolOfPrompts,
(TBX_HASH_KEY)in_un32PromptId );
if( pStreamServerPromptContext == NULL )
{
TBX_EXIT_ERROR( TBX_RESULT_NOT_FOUND, 0, "Failed to found prompt context!" );
}
Result = VoipStreamServerStopPlayInternal( pStreamServerPromptContext );
if( TBX_RESULT_FAILURE( Result ) == TBX_TRUE )
{
TBX_EXIT_ERROR( Result, 0, "Failed to stop prompt play!" );
}
/* 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,
"VoipStreamServerStopPlay: %s (Result 0x%08X, %s, line %d\n",
TBX_ERROR_DESCRIPTION,
TBX_ERROR_RESULT,
__FILE__,
TBX_ERROR_LINE);
}
/*---------------------------------------------------------------------------------------------------------------------------
| Cleanup section
*--------------------------------------------------------------------------------------------------------------------------*/
CLEANUP
{
TBX_SEM_GIV( pStreamServerContext->StreamServerSem );
}
RETURN;
}
TBX_RESULT VoipStreamServerStopPlayInternal(
IN PVOIP_STREAM_SERVER_PROMPT_CONTEXT in_pStreamServerPromptContext )
{
TBX_RESULT Result = TBX_RESULT_OK;
PVOIP_CLI_CONTEXT pCliContext;
STREAMSERVER_MSG StopMessage;
PVOIP_STREAM_SERVER_CONTEXT pStreamServerContext;
/* Initialize local variables */
pCliContext = &g_pContext->CliContext;
pStreamServerContext = &g_pContext->StreamServerContext;
/* Validate current state */
if
(
!(
in_pStreamServerPromptContext->fStarting ||
in_pStreamServerPromptContext->fPlaying
) ||
in_pStreamServerPromptContext->fStopping ||
!in_pStreamServerPromptContext->fSynched
)
{
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1,
NULL,
"ERROR: Stream server: Invalid state to stop play of prompt 0x%08X\n",
in_pStreamServerPromptContext->un32PromptId );
Result = TBX_RESULT_INVALID_STATE;
}
else
{
if( pStreamServerContext->fServerAvailable )
{
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1,
NULL,
"Stream server: Stop play of prompt 0x%08X\n",
in_pStreamServerPromptContext->un32PromptId );
memset( &StopMessage.ReqStop, 0, sizeof(StopMessage.ReqStop) );
StopMessage.Header.MessageType = STREAMSERVER_MSG_ID_REQ_STOP;
StopMessage.Header.un32UserContext = in_pStreamServerPromptContext->un32PromptId;
Result = StreamServerLibCommandSend
(
pStreamServerContext->hStreamServerLib,
&StopMessage,
pStreamServerContext->hStreamServer
);
}
in_pStreamServerPromptContext->fStopping = TBX_TRUE;
in_pStreamServerPromptContext->fPlaying = TBX_FALSE;
in_pStreamServerPromptContext->fStarting = TBX_FALSE;
}
return Result;
}
/*--------------------------------------------------------------------------------------------------------------------------------
|
| VoipStreamServerPromptGetKey : Function called by the hash table to retrieve the Key (user context)
| from the element stored in the hash table (pointer to the stream server prompt
| context structure)
|
| Note :
|
| Return :
|
*------------------------------------------------------------------------------------------------------------------------------*/
static TBX_HASH_KEY VoipStreamServerPromptGetKey(
IN PTBX_VOID in_pUserContext,
IN PTBX_VOID in_pElement )
{
PVOIP_STREAM_SERVER_PROMPT_CONTEXT pStreamServerPrompt = (PVOIP_STREAM_SERVER_PROMPT_CONTEXT)in_pElement;
(TBX_VOID)in_pUserContext;
return (TBX_HASH_KEY)pStreamServerPrompt->un32PromptId;
}
/*--------------------------------------------------------------------------------------------------------------------------------
|
| VoipStreamServerPromptCleanup : Function that clear all stream server prompts.
|
| Note : ~
|
| Return : TBX_RESULT_OK
| TBX_RESULT_FAIL
| or others
|
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT VoipStreamServerPromptCleanup()
{
PVOIP_CLI_CONTEXT pCliContext;
PVOIP_STREAM_SERVER_CONTEXT pStreamServerContext;
PVOIP_STREAM_SERVER_PROMPT_CONTEXT pStreamServerPromptContext;
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CODE
{
/* Initialize local variables */
pCliContext = &g_pContext->CliContext;
pStreamServerContext = &g_pContext->StreamServerContext;
if( !pStreamServerContext->fEnable )
{
/* Nothing to do. The stream server is not enabled. */
TBX_EXIT_SUCCESS( TBX_RESULT_OK );
}
TBX_SEM_GET( pStreamServerContext->StreamServerSem, TBX_SEM_WAIT_FOREVER );
pStreamServerPromptContext = TBXPoolOfBuffersFirst( pStreamServerContext->hPoolOfPrompts );
while( pStreamServerPromptContext )
{
VoipStreamServerPromptClearInternal( pStreamServerPromptContext );
pStreamServerPromptContext = TBXPoolOfBuffersFirst( pStreamServerContext->hPoolOfPrompts );
}
/* 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,
"VoipStreamServerPromptCleanup: %s (Result 0x%08X, %s, line %d)\n",
TBX_ERROR_DESCRIPTION,
TBX_ERROR_RESULT,
__FILE__,
TBX_ERROR_LINE);
}
/*---------------------------------------------------------------------------------------------------------------------------
| Cleanup section
*--------------------------------------------------------------------------------------------------------------------------*/
CLEANUP
{
TBX_SEM_GIV( pStreamServerContext->StreamServerSem );
}
RETURN;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -