📄 voip_stream_server.c
字号:
}
}
else
{
/* Stream server call has already been destroyed. Must stop this playback on the stream server */
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1,
NULL,
"Stream server: Stopping play ctx 0x%08X on stream server because call has been closed while server was unavailable.\n",
Message.RspListPlayingPrompts.un32UserContext );
memset( &OutMessage.ReqStop, 0, sizeof(OutMessage.ReqStop) );
OutMessage.Header.MessageType = STREAMSERVER_MSG_ID_REQ_STOP;
OutMessage.Header.un32UserContext = Message.RspListPlayingPrompts.un32UserContext;
StreamServerLibCommandSend
(
pStreamServerContext->hStreamServerLib,
&OutMessage,
pStreamServerContext->hStreamServer
);
}
}
}
else
{
/* We are not in "resync" state... ignore this response. */
}
} break;
case STREAMSERVER_MSG_ID_RSP_STARTED:
case STREAMSERVER_MSG_ID_RSP_DONE:
{
/* A stream server playback has started or stopped */
if( Message.Header.MessageType == STREAMSERVER_MSG_ID_RSP_STARTED )
{
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1,
NULL,
"Stream server: Received RSP_STARTED, context 0x%08X\n",
Message.Header.un32UserContext );
result = Message.RspStarted.Result;
}
else
{
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1,
NULL,
"Stream server: Received RSP_DONE, context 0x%08X\n",
Message.Header.un32UserContext );
result = TBX_RESULT_OK;
}
if( TBX_RESULT_SUCCESS(result) )
{
/* Retrieve the prompt context */
pStreamServerPromptContext = TBXPoolOfBuffersFind(
pStreamServerContext->hPoolOfPrompts,
Message.Header.un32UserContext);
if( pStreamServerPromptContext )
{
TBX_BOOL fRestartPlay = TBX_FALSE;
if( Message.Header.MessageType == STREAMSERVER_MSG_ID_RSP_STARTED )
{
pStreamServerPromptContext->fStarting = TBX_FALSE;
pStreamServerPromptContext->fPlaying = TBX_TRUE;
pStreamServerPromptContext->fStopping = TBX_FALSE;
}
else
{
if( (pStreamServerPromptContext->un32NbRepeat == (TBX_UINT32)-1) &&
((pStreamServerPromptContext->fPlaying) || (pStreamServerPromptContext->fStarting)) )
{
/* The application expects this playback to still be active, so restart
it so the main state machine of this application does not notice that
the prompt has reached end */
fRestartPlay = TBX_TRUE;
}
else
{
pStreamServerPromptContext->fStarting = TBX_FALSE;
pStreamServerPromptContext->fPlaying = TBX_FALSE;
pStreamServerPromptContext->fStopping = TBX_FALSE;
}
}
if( fRestartPlay )
{
pStreamServerPromptContext->fStarting = TBX_FALSE;
pStreamServerPromptContext->fPlaying = TBX_FALSE;
pStreamServerPromptContext->fStopping = TBX_FALSE;
pStreamServerPromptContext->un32StartTime = TBX_GET_TICK();
result = VoipStreamServerStartPlayInternal( pStreamServerPromptContext );
if( TBX_RESULT_SUCCESS(result) )
{
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1,
NULL,
"Stream server: automatically restarted playback for prompt 0x%08X\n",
pStreamServerPromptContext->un32PromptId );
}
else
{
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1,
NULL,
"Stream server: FAILED to automatically restarted playback for prompt 0x%08X\n",
pStreamServerPromptContext->un32PromptId );
}
}
}
else
{
/* Stream server call has already been destroyed */
}
}
else
{
if( pStreamServerPromptContext )
{
/* ????? */
}
}
}
default:
{
/* This message can be ignored. */
} break;
}
}
}
TbxCliToolsLogPrint( pCliContext->hCliTools, TRACE_LEVEL_1, NULL, "Stream server receives thread stopped\n" );
pStreamServerContext->fRecvThreadDone = TBX_TRUE;
TBX_SEM_GIV( pStreamServerContext->StreamServerSem );
return TBX_RESULT_OK;
}
/*--------------------------------------------------------------------------------------------------------------------------------
|
| VoipStreamServerPromptAlloc : Function that allocates a stream server prompt context
|
| in_un16Port : UDP port to use for stream
| in_pszIpAddress0 :
| in_pszPathName :
| in_pun32PromptId :
| in_un32NbRepeat : Number of time the prompt will restart playing
|
| Note :
|
| Return : The allocated prompt context, or NULL if out of resources
|
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT VoipStreamServerPromptAlloc(
IN TBX_UINT16 in_un16Port,
IN PTBX_CHAR in_pszIpAddress0,
IN PTBX_CHAR in_pszPathName,
IN PTBX_UINT32 in_pun32PromptId,
IN TBX_UINT32 in_un32NbRepeat)
{
PVOIP_CLI_CONTEXT pCliContext;
PVOIP_STREAM_SERVER_CONTEXT pStreamServerContext;
PVOIP_STREAM_SERVER_PROMPT_CONTEXT pStreamServerPromptContext = NULL;
TBX_UINT32 un32PromptId;
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CODE
{
/* Initialize local variables */
pCliContext = &g_pContext->CliContext;
pStreamServerContext = &g_pContext->StreamServerContext;
TBX_SEM_GET( pStreamServerContext->StreamServerSem, TBX_SEM_WAIT_FOREVER );
un32PromptId = VOIP_CREATE_PROMPT_ID( in_un16Port );
pStreamServerPromptContext = TBXPoolOfBuffersAlloc(
pStreamServerContext->hPoolOfPrompts,
un32PromptId );
if( pStreamServerPromptContext == NULL )
{
TBX_EXIT_ERROR( TBX_RESULT_NOT_FOUND, 0, "Failed to found stream server prompt!" );
}
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1, NULL,
"Stream server: Allocating prompt 0x%08X\n",
un32PromptId );
/* Initialize the prompt context */
memset( pStreamServerPromptContext, 0, sizeof(*pStreamServerPromptContext) );
/* Keep current time to know "where" to start prompts playback from */
pStreamServerPromptContext->un32NbRepeat = in_un32NbRepeat;
pStreamServerPromptContext->un16Port = in_un16Port;
strncpy( pStreamServerPromptContext->szIpAddress0, in_pszIpAddress0, sizeof(pStreamServerPromptContext->szIpAddress0) );
pStreamServerPromptContext->szIpAddress0[sizeof(pStreamServerPromptContext->szIpAddress0) - 1] = '\0';
strncpy( pStreamServerPromptContext->szPathName, in_pszPathName, sizeof(pStreamServerPromptContext->szPathName) );
pStreamServerPromptContext->fPlaying = TBX_FALSE;
pStreamServerPromptContext->fSynched = TBX_TRUE;
pStreamServerPromptContext->un32StartTime = g_pContext->un32TimerCurrentTime;
pStreamServerPromptContext->un32PromptId = un32PromptId;
*in_pun32PromptId = un32PromptId;
/* 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,
"VoipStreamServerPromptAlloc: %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;
}
/*--------------------------------------------------------------------------------------------------------------------------------
|
| VoipStreamServerPromptClear : Function that clear a stream server prompt.
|
| in_un32PromptId : Identifier of the prompt to free
|
| Note : ~
|
| Return : TBX_RESULT_OK
| TBX_RESULT_FAIL
| or others
|
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT VoipStreamServerPromptClear(
IN TBX_UINT32 in_un32PromptId )
{
TBX_RESULT Result = TBX_RESULT_NOT_FOUND;
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 );
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1, NULL,
"Stream server: Searching prompt 0x%08X\n",
in_un32PromptId
);
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!" );
}
Result = VoipStreamServerPromptClearInternal( pStreamServerPromptContext );
if( TBX_RESULT_FAILURE( Result ) == TBX_TRUE )
{
TBX_EXIT_ERROR( Result, 0, "Failed to clear stream server prompt!" );
}
/* 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,
"VoipStreamServerPromptClear: %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 VoipStreamServerPromptClearInternal(
IN PVOIP_STREAM_SERVER_PROMPT_CONTEXT in_pStreamServerPromptContext )
{
TBX_RESULT Result;
PVOIP_CLI_CONTEXT pCliContext = &g_pContext->CliContext;
PVOIP_STREAM_SERVER_CONTEXT pStreamServerContext = &g_pContext->StreamServerContext;
TbxCliToolsLogPrint(
pCliContext->hCliTools,
TRACE_LEVEL_1, NULL,
"Stream server: Freeing prompt 0x%08X\n",
in_pStreamServerPromptContext->un32PromptId
);
Result = TBXPoolOfBuffersFree(
pStreamServerContext->hPoolOfPrompts,
in_pStreamServerPromptContext );
return Result;
}
/*--------------------------------------------------------------------------------------------------------------------------------
|
| VoipStreamServerStartPlay : Start playing an audio file for the specified prompt
|
| 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 VoipStreamServerStartPlay(
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -