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

📄 hdmvmod.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
 */
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 + -