📄 hdmvmod.cpp
字号:
*/
BOOLEAN HdmvModIsTitleRepeatOn(void)
{
return (CmdProcIsRepeatOn());
}
/**
* HdmvModGetNavCmdID -- Return current movie navigation command id.
*
* @param
* none
*
* @retval
* command id
*/
uint32 HdmvModGetNavCmdID(void)
{
return (CmdProcGetNavCmdID());
}
/**
* HdmvModTask -- Task that runs during the life of the HDMV Module. All
* HDMV Module core processing occurs in the context of this task.
*/
static ULONG HdmvModTask(PVOID pvParam)
{
HDMVMOD_MESSAGE Msg;
BOOLEAN fTaskExit = FALSE;
MVOBJ_NAV_COMMAND *pNavCommands = NULL;
USHORT *pusNumCmds = NULL;
CMDPROC_STATUS tRetStatus = CMDPROC_FAILURE;
ULONG ulStatusParam = 0;
while (fTaskExit == FALSE)
{
/* Wait for a message */
if (OS_MsgQReceive(hHdmvMod->MsgQID, (char *)&Msg, sizeof(HDMVMOD_MESSAGE), OS_WAIT_FOREVER) != OS_OK)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: Failure receiving message!\n"));
fTaskExit = TRUE;
}
else
{
/* Look at the message type to determine what to do */
switch (Msg.tMsgType)
{
case HDMVMOD_MSG_EXIT:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: Got exit message\n"));
/* Set flag so task will exit */
fTaskExit = TRUE;
break;
case HDMVMOD_MSG_PROCESS_MOBJ:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: HDMVMOD_MSG_PROCESS_MOBJ\n"));
/* Get number of movie object's navigation commands from database */
pusNumCmds = MvObjGetNumberOfNavCmds(Msg.ulData0);
/* Get movie object's navigation commands from database */
pNavCommands = MvObjGetNavCmds(Msg.ulData0);
if ( (pusNumCmds == NULL) || (pNavCommands == NULL) )
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: Failed to get navcmds from database!\n"));
}
else
{
/* Set state to running */
hHdmvMod->tState = HDMVMOD_STATE_RUNNING;
/* Give navigation commands to command processor to execute */
tRetStatus = CmdProcProcessMovieProgram(pNavCommands, *pusNumCmds, &ulStatusParam);
/* Evaluate the return status from the command processor */
HdmvModEvaluateStatus(tRetStatus, ulStatusParam);
}
break;
case HDMVMOD_MSG_TERMINATE_MOBJ:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: HDMVMOD_MSG_TERMINATE_MOBJ\n"));
if (Msg.pulRetVal != NULL)
{
/* Set state to terminated */
hHdmvMod->tState = HDMVMOD_STATE_TERMINATED;
/* Terminate the command processor from executing the movie object's commands */
*Msg.pulRetVal = CmdProcTerminateMovieProgram();
OS_MsgQReset(hHdmvMod->MsgQID);
}
else
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: Unexpected NULL pointer!\n"));
}
if (Msg.ulSemID != 0)
{
/* Relase sychronization semaphore */
OS_SemGive(Msg.ulSemID);
}
else
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: Unexpected invalid sem ID!\n"));
}
break;
case HDMVMOD_MSG_SUSPEND_MOBJ:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: HDMVMOD_MSG_SUSPEND_MOBJ\n"));
if ( (Msg.pulRetVal != NULL) && (Msg.pvBuffer != NULL) )
{
/* Set state to terminated */
hHdmvMod->tState = HDMVMOD_STATE_TERMINATED;
/* Suspend the command processor from executing the movie object's commands */
*Msg.pulRetVal = CmdProcSuspendMovieProgram( (ULONG *)Msg.pvBuffer);
}
else
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: Unexpected NULL pointer!\n"));
}
break;
case HDMVMOD_MSG_RESUME_MOBJ:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: HDMVMOD_MSG_RESUME_MOBJ\n"));
/* Get number of movie object's navigation commands from database */
pusNumCmds = MvObjGetNumberOfNavCmds(Msg.ulData0);
/* Get movie object's navigation commands from database */
pNavCommands = MvObjGetNavCmds(Msg.ulData0);
if ( (pusNumCmds == NULL) || (pNavCommands == NULL) )
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: Failed to get navcmds from database!\n"));
}
else
{
/* Set state to running */
hHdmvMod->tState = HDMVMOD_STATE_RUNNING;
/* Give navigation commands to command processor to execute */
tRetStatus = CmdProcResumeMovieProgram(pNavCommands, *pusNumCmds, Msg.ulData1, &ulStatusParam);
/* Evaluate the return status from the command processor */
HdmvModEvaluateStatus(tRetStatus, ulStatusParam);
}
break;
case HDMVMOD_MSG_LOAD_MOBJ:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: HDMVMOD_MSG_LOAD_MOBJ\n"));
/* Get number of movie object's navigation commands from database */
pusNumCmds = MvObjGetNumberOfNavCmds(Msg.ulData0);
/* Get movie object's navigation commands from database */
pNavCommands = MvObjGetNavCmds(Msg.ulData0);
if ( (pusNumCmds == NULL) || (pNavCommands == NULL) )
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: Failed to get navcmds from database!\n"));
}
else
{
/* Set state to running */
hHdmvMod->tState = HDMVMOD_STATE_RUNNING;
/* Give navigation commands to command processor to execute */
tRetStatus = CmdProcLoadMovieProgram(pNavCommands, *pusNumCmds, Msg.ulData1);
/* Evaluate the return status from the command processor */
HdmvModEvaluateStatus(tRetStatus, ulStatusParam);
}
break;
case HDMVMOD_MSG_PROCESS_BOBJ:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: HDMVMOD_MSG_PROCESS_BOBJ\n"));
if ((PVOID)Msg.ulData0 != NULL)
{
tRetStatus = CmdProcProcessButtonProgram((MVOBJ_NAV_COMMAND *)Msg.ulData0, Msg.ulData1, &ulStatusParam);
/* Free the button program buffer */
OS_MemPoolFree(hHdmvMod->mempoolBtnCmds, (PVOID)Msg.ulData0);
/* If button object did not execute to completion, evaluate the return status */
if (tRetStatus != CMDPROC_SUCCESS)
{
/*
* If the playlist was terminated, then inform the pbc engine that commands
* have been executed, then resume the current movie object command execution.
* Otherwise, Don't call PlayCtrlActivateButtonComplete since we will be
* jumping/calling a new playlist.
*/
if (tRetStatus == CMDPROC_PL_TERMINATED)
{
/* inform the Playback Control Engine that commands have been executed */
PlayCtrlTakeSemaphore();
PlayCtrlActivateButtonComplete(Msg.pvBuffer);
PlayCtrlGiveSemaphore();
/* Give navigation commands to command processor to execute */
tRetStatus = CmdProcPlaybackComplete(&ulStatusParam);
}
/* Evaluate the return status from the command processor. */
HdmvModEvaluateStatus(tRetStatus, ulStatusParam);
}
else
{
/* inform the Playback Control Engine that commands have been executed */
PlayCtrlTakeSemaphore();
PlayCtrlActivateButtonComplete(Msg.pvBuffer);
PlayCtrlGiveSemaphore();
}
}
else
{
/* inform the Playback Control Engine that commands have been executed */
PlayCtrlTakeSemaphore();
PlayCtrlActivateButtonComplete(Msg.pvBuffer);
PlayCtrlGiveSemaphore();
}
break;
case HDMVMOD_MSG_PLAYBACK_COMPLETE:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: HDMVMOD_MSG_PLAYBACK_COMPLETE\n"));
/* Notify the command processor that playback of a playlist is complete */
tRetStatus = CmdProcPlaybackComplete(&ulStatusParam);
/* Evaluate the return status from the command processor */
HdmvModEvaluateStatus(tRetStatus, ulStatusParam);
break;
case HDMVMOD_MSG_NVTIMER_EXPIRE:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: HDMVMOD_MSG_NVTIMER_EXPIRE\n"));
/* Get movie object to jump to on an nv timer expire */
if (CmdProcGetNVTimerJumpObject(&ulStatusParam) != CMDPROC_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: CmdProcGetNVTimerJumpObject() FAILED!\n"));
}
else
{
if (hHdmvMod->callback != NULL)
{
/* Send jump object event to registered callback */
hHdmvMod->callback(hHdmvMod->pvCallbackContext, HDMV_EVENT_JUMP_MOBJ, ulStatusParam);
}
else
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: NULL callback pointer!\n"));
}
}
break;
case HDMVMOD_MSG_REPEAT:
DBGPRINT(DBG_ON(DBG_TRACE), ("HdmvModTask: HDMVMOD_MSG_REPEAT\n"));
/* Set repeat playlist mode */
if (CmdProcSetRepeat( (BOOLEAN)(Msg.ulData0) ) != CMDPROC_SUCCESS)
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: CmdProcSetRepeat() FAILED!\n"));
}
break;
default:
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModTask: Invalid message type!\n"));
break;
}
if (Msg.ulSemID != 0)
{
/* Relase sychronization semaphore */
OS_SemGive(Msg.ulSemID);
}
}
}
/* exit task */
OS_TaskExit();
return (0);
}
/**
* HdmvModEvaluateStatus -- Evaluate the return status from the command processor and
* make a decision on whether or not to send a callback event
* to the module manager.
*
* @param
* tStatus -- command processor return status
* ulStatusParam -- parameter associated with the return status
*
* @retval
* none.
*/
static void HdmvModEvaluateStatus(CMDPROC_STATUS tStatus, ULONG ulStatusParam)
{
BOOLEAN fSendCallback = FALSE;
HDMV_EVENT_CODE event = HDMV_EVENT_INVALID;
/*
* Evaluate status to determine if a callback event needs
* to be sent in order to signal a movie object transition.
*/
switch (tStatus)
{
case CMDPROC_JUMP_OBJECT:
/* Jump Object callback event should be sent */
fSendCallback = TRUE;
event = HDMV_EVENT_JUMP_MOBJ;
break;
case CMDPROC_CALL_OBJECT:
/* Call Object callback event should be sent */
fSendCallback = TRUE;
event = HDMV_EVENT_CALL_MOBJ;
break;
case CMDPROC_JUMP_TITLE:
/* Jump Title callback event should be sent */
fSendCallback = TRUE;
event = HDMV_EVENT_JUMP_TITLE;
break;
case CMDPROC_CALL_TITLE:
/* Call Title callback event should be sent */
fSendCallback = TRUE;
event = HDMV_EVENT_CALL_TITLE;
break;
case CMDPROC_RESUME_OBJECT:
/* Resume Object callback event should be sent */
fSendCallback = TRUE;
event = HDMV_EVENT_RESUME_MOBJ;
break;
case CMDPROC_SUCCESS:
/* Set state to terminated */
hHdmvMod->tState = HDMVMOD_STATE_TERMINATED;
/* Terminated callback event should be sent */
fSendCallback = TRUE;
event = HDMV_EVENT_MOBJ_COMPLETE;
break;
case CMDPROC_WAITING:
/* No callback event needs to be sent */
break;
case CMDPROC_FAILURE:
case CMDPROC_NOT_IMPLEMENTED:
case CMDPROC_NULL_POINTER:
default:
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModEvaluateStatus: error!\n"));
/* Set state to terminated */
hHdmvMod->tState = HDMVMOD_STATE_TERMINATED;
/* Terminated callback event should be sent */
fSendCallback = TRUE;
event = HDMV_EVENT_MOBJ_COMPLETE;
break;
}
/*
* If a callback should be sent, and the callback function
* is valid, then send the callback event.
*/
if (fSendCallback == TRUE)
{
if (hHdmvMod->callback != NULL)
{
/* Call function pointed to by callback function pointer */
hHdmvMod->callback(hHdmvMod->pvCallbackContext, event, ulStatusParam);
}
else
{
DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModEvaluateStatus: unexpected NULL pointer!\n"));
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -