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

📄 voip_stream_server.c

📁 telcobridges voip develop
💻 C
📖 第 1 页 / 共 4 页
字号:
								}
							}
							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 + -