📄 voip_raw_data_file.c
字号:
IN PVOIP_RAW_DATA_FILE_CONTEXT in_pRawDataFileContext
)
{
TBX_BOOL fFreeContext;
TBX_RESULT Result;
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CODE
{
/* Initialize local variables */
fFreeContext = TBX_TRUE;
if( in_pRawDataFileContext->RecordContext.hRecord != (TBX_STREAM_LIB_PLAY_HANDLE)TBX_HANDLE_INVALID )
{
if( !in_pRawDataFileContext->RecordContext.fStopping )
{
in_pRawDataFileContext->RecordContext.fStopping = TBX_TRUE;
/* Free record resource */
TBXStreamStop( g_pContext->hStreamLib, in_pRawDataFileContext->RecordContext.hRecord );
TbxCliToolsLogPrint
(
g_pContext->CliContext.hCliTools, TRACE_LEVEL_ALWAYS, FBLUE,
"Stopping record on RawDataFile %s.\n",
in_pRawDataFileContext->Params.szRawDataFileResName
);
}
fFreeContext = TBX_FALSE;
}
if( in_pRawDataFileContext->PlayContext.hPlay != (TBX_STREAM_LIB_PLAY_HANDLE)TBX_HANDLE_INVALID )
{
if( !in_pRawDataFileContext->PlayContext.fStopping )
{
in_pRawDataFileContext->PlayContext.fStopping = TBX_TRUE;
/* Free play resource */
TBXStreamStop( g_pContext->hStreamLib, in_pRawDataFileContext->PlayContext.hPlay );
TbxCliToolsLogPrint
(
g_pContext->CliContext.hCliTools, TRACE_LEVEL_ALWAYS, FBLUE,
"Stopping play on RawDataFile %s.\n",
in_pRawDataFileContext->Params.szRawDataFileResName
);
}
fFreeContext = TBX_FALSE;
}
if( fFreeContext )
{
TbxCliToolsLogPrint
(
g_pContext->CliContext.hCliTools, TRACE_LEVEL_ALWAYS, FBLUE,
"RawDataFile %s has been cleared.\n",
in_pRawDataFileContext->Params.szRawDataFileResName
);
if( in_pRawDataFileContext->RecordContext.pFile )
{
fclose( in_pRawDataFileContext->RecordContext.pFile );
in_pRawDataFileContext->RecordContext.pFile = NULL;
}
if( in_pRawDataFileContext->PlayContext.pData )
{
free( in_pRawDataFileContext->PlayContext.pData );
in_pRawDataFileContext->PlayContext.pData = NULL;
}
/* Remove from hash tables */
Result = TBXHashRemove( in_pAdapterContext->CurrentConfig.hRawDataFileNameHash, (TBX_HASH_KEY)in_pRawDataFileContext->Params.szRawDataFileResName, NULL );
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR( Result, 0, "could not remove RawDataFile context from name hash table!" );
}
Result = TBXHash64Remove( in_pAdapterContext->CurrentConfig.hRawDataFileIdHash64, in_pRawDataFileContext->un64Id, NULL );
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR( Result, 0, "could not remove RawDataFile context from id hash table!" );
}
TBXPoolOfBuffersFree( in_pAdapterContext->CurrentConfig.hPoolOfRawDataFiles, in_pRawDataFileContext );
}
else
{
in_pRawDataFileContext->fCleanupPending = TBX_TRUE;
TBX_EXIT_SUCCESS (TBX_RESULT_OPERATION_INCOMPLETE);
}
/* End of the code (skip to cleanup) */
TBX_EXIT_SUCCESS (TBX_RESULT_OK);
}
/*---------------------------------------------------------------------------------------------------------------------------
| Error handling section
*--------------------------------------------------------------------------------------------------------------------------*/
ERROR_HANDLING
{
VoipCliAdapterStatePrint
(
in_pAdapterContext,
TRACE_LEVEL_ERROR,
"VOIPRawDataFileClearContext:%s (Result 0x%X)\n",
TBX_ERROR_DESCRIPTION,
(int)TBX_ERROR_RESULT
);
}
/*---------------------------------------------------------------------------------------------------------------------------
| Cleanup section
*--------------------------------------------------------------------------------------------------------------------------*/
CLEANUP
{
}
RETURN;
}
/*--------------------------------------------------------------------------------------------------------------------------------
|
| VoipStreamLibStopConfirmCallback : Sample TBX Stream library 'stop confirm' callback.
|
| in_hPlay : Handle of the playback that has stopped.
| in_un64UserContext : User context for that port passed when called TBXStreamPlay()
|
| Note : ~
|
| Return : TBX_RESULT_API_OK
| TBX_RESULT_API_NULL_PARAM
| TBX_RESULT_API_NOT_ENOUGH_MEMORY
| TBX_RESULT_API_INVALID_TRANSPORT_TYPE
| TBX_RESULT_API_GATEWAY_NOT_FOUND
|
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT VoipStreamLibStopConfirmCallback(
IN TBX_STREAM_LIB_HANDLE in_hLib,
IN TBX_STREAM_LIB_PLAY_HANDLE in_hPlay,
IN TBX_UINT64 in_un64UserContext )
{
TBX_RESULT Result;
PVOIP_EVT_OP_STREAMING_STOP_CONFIRMED pEvt;
TBX_MSG_HANDLE hMsg;
TBX_UINT32 un32MsgSize;
PVOIP_CLI_CONTEXT pCliContext;
TBX_ADAPTER_HANDLE hAdapter;
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CODE
{
/* Initialize local variables */
Result = TBX_RESULT_OK;
pCliContext = &g_pContext->CliContext;
pEvt = NULL;
hAdapter = (TBX_ADAPTER_HANDLE) (in_un64UserContext >> 32) & 0xFFFFFFFF;
TbxCliToolsLogPrint
(
g_pContext->CliContext.hCliTools,
TRACE_LEVEL_2, NULL,
"VoipStreamLibStopConfirmCallback\n"
);
/* Allocate a message buffer */
un32MsgSize = sizeof(*pEvt);
Result = TBXGetMsg (g_pContext->hTbxLib, un32MsgSize , &hMsg);
if (TBX_RESULT_FAILURE (Result))
{
TBX_EXIT_ERROR (Result, 0, "Failed to get message buffer.");
}
/* Clear the buffer... */
memset (TBX_MSG_PAYLOAD_POINTER (hMsg), 0, TBX_MSG_PAYLOAD_MAX_LENGTH_GET (hMsg));
/* Set the message header */
TBX_FORMAT_MSG_HEADER
(
hMsg,
VOIP_MSG_ID_OP_STREAM_STOP_CONFIRMED,
TBX_MSG_TYPE_REQUEST,
un32MsgSize,
TBX_HOSTLIB_ADAPTER_HANDLE,
hAdapter,
0
);
/* Fill the request */
pEvt = (PVOIP_EVT_OP_STREAMING_STOP_CONFIRMED) TBX_MSG_PAYLOAD_POINTER (hMsg);
pEvt->un32MsgVersion = 1;
pEvt->hPlay = in_hPlay;
pEvt->un64Id = in_un64UserContext;
/* Send the message */
Result = TBXSendMsg (g_pContext->hTbxLib, hMsg, NULL);
hMsg = TBX_HANDLE_INVALID;
pEvt = NULL;
if (TBX_RESULT_FAILURE (Result))
{
TBX_EXIT_ERROR (Result, 0, "Failed to send message buffer.");
}
/* End of the code (skip to cleanup) */
TBX_EXIT_SUCCESS (TBX_RESULT_OK);
}
/*---------------------------------------------------------------------------------------------------------------------------
| Error handling section
*--------------------------------------------------------------------------------------------------------------------------*/
ERROR_HANDLING
{
TbxCliToolsLogPrint
(
pCliContext->hCliTools,
TRACE_LEVEL_ERROR, NULL,
"VoipStreamLibStopConfirmedCallback: %s, result 0x%08X\n",
TBX_ERROR_DESCRIPTION,
(int)TBX_ERROR_RESULT
);
}
/*---------------------------------------------------------------------------------------------------------------------------
| Cleanup section
*--------------------------------------------------------------------------------------------------------------------------*/
CLEANUP
{
}
RETURN;
}
/*-------------------------------------------------------------------------------------------------------------------------------
|
| VoipHandleStreamStopConfirmed: Handles a confirmation from the steam lib that a play or record has stopped.
|
| io_pAdapterContext : Context of the adapter
| in_hMsg : Message received for this adapter
|
| Note : ~
|
| Return : ~
|
*------------------------------------------------------------------------------------------------------------------------------*/
TBX_RESULT VoipHandleStreamStopConfirmed(
IN PVOIP_ADAPTER_CONTEXT in_pAdapterContext,
IN TBX_MSG_HANDLE in_hMsg)
{
PVOIP_EVT_OP_STREAMING_STOP_CONFIRMED pEvent;
PVOIP_RAW_DATA_FILE_CONTEXT pRawDataFileContext;
TBX_RESULT Result;
/*---------------------------------------------------------------------------------------------------------------------------
| Code section
*--------------------------------------------------------------------------------------------------------------------------*/
CODE
{
/* Initialize local variables */
pEvent = TBX_MSG_PAYLOAD_POINTER( in_hMsg );
TBXHash64Find
(
in_pAdapterContext->CurrentConfig.hRawDataFileIdHash64,
(TBX_HASH_64_KEY)pEvent->un64Id,
&pRawDataFileContext
);
if( !pRawDataFileContext || !pRawDataFileContext->fAllocated )
{
TBX_EXIT_ERROR( TBX_RESULT_FAIL, 0, "Could not find raw data file context!" );
}
if( !pRawDataFileContext || !pRawDataFileContext->fAllocated )
{
/* Stop confirmed for an unknown raw data file. Just clear the resource. */
TBXStreamFree( g_pContext->hStreamLib, pEvent->hPlay );
TBX_EXIT_ERROR( TBX_RESULT_FAIL, 0, "Could not find raw data file context!" );
}
VoipCliAdapterStatePrint
(
in_pAdapterContext,
TRACE_LEVEL_2,
"Stop confirmed from streamlib for raw data file %s on adapter %s.\n",
pRawDataFileContext->Params.szRawDataFileResName,
in_pAdapterContext->AdapterInfo.szSerialNumber
);
/* Update context */
if( pEvent->hPlay == pRawDataFileContext->PlayContext.hPlay )
{
Result = TBXStreamFree( g_pContext->hStreamLib, pRawDataFileContext->PlayContext.hPlay );
if( TBX_RESULT_FAILURE( Result ) )
{
VoipCliAdapterStatePrint
(
in_pAdapterContext,
TRACE_LEVEL_ERROR,
"Failed to free stream play resource for raw data file %d.\n",
(unsigned int)pRawDataFileContext->un64Id
);
}
pRawDataFileContext->PlayContext.hPlay = (TBX_STREAM_LIB_PLAY_HANDLE) TBX_HANDLE_INVALID;
pRawDataFileContext->PlayContext.fStarting = TBX_FALSE;
pRawDataFileContext->PlayContext.fPlaying = TBX_FALSE;
pRawDataFileContext->PlayContext.fStopping = TBX_FALSE;
}
if( pEvent->hPlay == pRawDataFileContext->RecordContext.hRecord )
{
Result = TBXStreamFree( g_pContext->hStreamLib, pRawDataFileContext->RecordContext.hRecord );
if( TBX_RESULT_FAILURE( Result ) )
{
VoipCliAdapterStatePrint
(
in_pAdapterContext,
TRACE_LEVEL_ERROR,
"Failed to free stream record resource for raw data file %d.\n",
(unsigned int)pRawDataFileContext->un64Id
);
}
pRawDataFileContext->RecordContext.hRecord = (TBX_STREAM_LIB_PLAY_HANDLE) TBX_HANDLE_INVALID;
pRawDataFileContext->RecordContext.fStarting = TBX_FALSE;
pRawDataFileContext->RecordContext.fStopping = TBX_FALSE;
}
if( pRawDataFileContext->RecordContext.hRecord == (TBX_STREAM_LIB_PLAY_HANDLE) TBX_HANDLE_INVALID &&
pRawDataFileContext->PlayContext.hPlay == (TBX_STREAM_LIB_PLAY_HANDLE) TBX_HANDLE_INVALID )
{
pRawDataFileContext->fActive = TBX_FALSE;
if( !pRawDataFileContext->fCleanupPending )
{
VoipCliAdapterStatePrint
(
in_pAdapterContext,
TRACE_LEVEL_2,
"Raw data file %s has completed.\n",
pRawDataFileContext->Params.szRawDataFileResName
);
}
else
{
/* Free context */
Result = VoipRawDataFileClearContext( in_pAdapterContext, pRawDataFileContext );
pRawDataFileContext = NULL;
if( TBX_RESULT_FAILURE( Result ) )
{
TBX_EXIT_ERROR( Result, 0, "Error while freeing raw data file context!" );
}
}
}
/* End of the code (skip to cleanup) */
TBX_EXIT_SUCCESS (TBX_RESULT_OK);
}
/*---------------------------------------------------------------------------------------------------------------------------
| Error handling section
*--------------------------------------------------------------------------------------------------------------------------*/
ERROR_HANDLING
{
VoipCliAdapterStatePrint
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -