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

📄 voip_stream_server.c

📁 telcobridges voip develop
💻 C
📖 第 1 页 / 共 4 页
字号:

	/*---------------------------------------------------------------------------------------------------------------------------
	 |  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 + -