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

📄 hdmvmod.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
 * @retval
 *      HDMVMOD_SUCCESS if successful
 *      HDMVMOD_FAILURE if not successful
 *      HDMVMOD_NULL_PTR if pulCmdID is NULL
 */
HDMVMOD_STATUS  HdmvModSuspendMobj(ULONG *pulCmdID)
{
    HDMVMOD_MESSAGE msg;
    ULONG           ulStatus;

    if (hHdmvMod == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModSuspendMobj: HDMV Module not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    if (pulCmdID == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModSuspendMobj: NULL pointer!\n"));
        return (HDMVMOD_NULL_PTR);
    }

    /* Check that message queue is created */
    if (hHdmvMod->MsgQID == 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModSuspendMobj: Msg queue not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* Reset sem_sync */
    OS_SemTake(hHdmvMod->sem_sync, OS_NO_WAIT);

    /* Send message to the task.  Send semaphore to make it synchronous. */
    msg.tMsgType        = HDMVMOD_MSG_SUSPEND_MOBJ;
    msg.ulData0         = 0;
    msg.ulData1         = 0;
    msg.ulSemID         = hHdmvMod->sem_sync;
    msg.pvBuffer        = (PVOID)pulCmdID;
    msg.ulBufferLength  = sizeof(ULONG);
    msg.pulRetVal       = &ulStatus;
    if (OS_MsgQSend(hHdmvMod->MsgQID, (char *)&msg, sizeof(HDMVMOD_MESSAGE), OS_NO_WAIT, OS_MSG_PRI_NORMAL) != OS_OK)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModSuspendMobj: Failure sending message!\n"));
        return (HDMVMOD_FAILURE);
    }
    else
    {
        /* Wait for message processing to complete */
        OS_SemTake(hHdmvMod->sem_sync, OS_WAIT_FOREVER);
    }

    return ( (HDMVMOD_STATUS)ulStatus);
}

/**
 * HdmvModResumeMobj -- Resume a suspended movie object
 *
 * @param
 *      ulMobjID -- ID of movie object to resume
 *      ulCmdID -- ID of command at which processing should start
 *
 * @retval
 *      HDMVMOD_SUCCESS if successful
 *      HDMVMOD_FAILURE if not successful
 */
HDMVMOD_STATUS  HdmvModResumeMobj(ULONG ulMobjID, ULONG ulCmdID)
{
    HDMVMOD_MESSAGE msg;

    if (hHdmvMod == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModResumeMobj: HDMV Module not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* Check that message queue is created */
    if (hHdmvMod->MsgQID == 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModResumeMobj: Msg queue not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* Send message to the task */
    msg.tMsgType        = HDMVMOD_MSG_RESUME_MOBJ;
    msg.ulData0         = ulMobjID;
    msg.ulData1         = ulCmdID;
    msg.ulSemID         = 0;
    if (OS_MsgQSend(hHdmvMod->MsgQID, (char *)&msg, sizeof(HDMVMOD_MESSAGE), OS_NO_WAIT, OS_MSG_PRI_NORMAL) != OS_OK)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModResumeMobj: Failure sending message!\n"));
        return (HDMVMOD_FAILURE);
    }

    return (HDMVMOD_SUCCESS);
}

/**
 * HdmvModLoadMobj -- Load a movie object without executing any of its navigation commands
 *
 * @param
 *      ulMobjID -- ID of movie object to load
 *      ulCmdID -- ID of command to set current navigation command to
 *
 * @retval
 *      HDMVMOD_SUCCESS if successful
 *      HDMVMOD_FAILURE if not successful
 */
HDMVMOD_STATUS  HdmvModLoadMobj(ULONG ulMobjID, ULONG ulCmdID)
{
    HDMVMOD_MESSAGE msg;

    if (hHdmvMod == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModLoadMobj: HDMV Module not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* Check that message queue is created */
    if (hHdmvMod->MsgQID == 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModLoadMobj: Msg queue not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* Send message to the task */
    msg.tMsgType        = HDMVMOD_MSG_LOAD_MOBJ;
    msg.ulData0         = ulMobjID;
    msg.ulData1         = ulCmdID;
    msg.ulSemID         = 0;
    if (OS_MsgQSend(hHdmvMod->MsgQID, (char *)&msg, sizeof(HDMVMOD_MESSAGE), OS_NO_WAIT, OS_MSG_PRI_NORMAL) != OS_OK)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModLoadMobj: Failure sending message!\n"));
        return (HDMVMOD_FAILURE);
    }

    return (HDMVMOD_SUCCESS);
}

/**
 * HdmvModAllocBobjBuffer -- Allocate a buffer used to pass a button obj program to the HDMV module.
 *
 * @param
 *      ppButtonProgram    -- receives a pointer to the button obj buffer
 *      ulNumberOfCommands -- number of commands in the program
 *
 * @retval
 *      HDMVMOD_SUCCESS if successful
 *      HDMVMOD_FAILURE if not successful
 */
HDMVMOD_STATUS  HdmvModAllocBobjBuffer(MVOBJ_NAV_COMMAND **ppButtonProgram, ULONG ulNumberOfCommands)
{
    if (hHdmvMod == NULL)
    {
        DbgPrint(("HdmvModAllocBobjBuffer: HDMV Module not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* verify the input params */
    if (ppButtonProgram == NULL)
    {
        return (HDMVMOD_NULL_PTR);
    }
    if (ulNumberOfCommands > 255)
    {
        return (HDMVMOD_INVALID_PARAM);
    }

    /* allocate button program buffer from our memory pool */
    *ppButtonProgram = (MVOBJ_NAV_COMMAND *)OS_MemPoolAlloc(hHdmvMod->mempoolBtnCmds,
        sizeof(MVOBJ_NAV_COMMAND) * ulNumberOfCommands);

    /* make sure we were successfull */
    if (*ppButtonProgram == NULL)
    {
        return (HDMVMOD_FAILURE);
    }

    return (HDMVMOD_SUCCESS);
}

/**
 * HdmvModAllocBobjBuffer -- Free buffer allocated by call to HdmvModAllocBobjBuffer.
 *
 * @param
 *      pButtonProgram -- address to free
 *
 * @retval
 *      HDMVMOD_SUCCESS if successful
 *      HDMVMOD_FAILURE if not successful
 */
HDMVMOD_STATUS  HdmvModFreeBobjBuffer(MVOBJ_NAV_COMMAND *pButtonProgram)
{
    if (hHdmvMod == NULL)
    {
        DbgPrint(("HdmvModFreeBobjBuffer: HDMV Module not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* verify the input params */
    if (pButtonProgram == NULL)
    {
        return (HDMVMOD_NULL_PTR);
    }

    DbgAssert(hHdmvMod->mempoolBtnCmds != NULL);

    /* Free the button program buffer */
    OS_MemPoolFree(hHdmvMod->mempoolBtnCmds, pButtonProgram);

    return (HDMVMOD_SUCCESS);
}

/**
 * HdmvModProcessBobj -- Process a button object
 *
 * @param
 *      pButtonProgram     -- pointer to the button obj program
 *      ulNumberOfCommands -- number of commands in the program
 *      pContext           -- context info to be passed back to the Playback Control Engine
 *                            throught the button commands completed API
 *
 * @retval
 *      HDMVMOD_SUCCESS if successful
 *      HDMVMOD_FAILURE if not successful
 */
HDMVMOD_STATUS  HdmvModProcessBobj(MVOBJ_NAV_COMMAND *pButtonProgram, ULONG ulNumberOfCommands, PVOID pContext)
{
    HDMVMOD_MESSAGE msg;

    if (hHdmvMod == NULL)
    {
        DbgPrint(("HdmvModProcessBobj: HDMV Module not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* verify the input params
     * NOTE: We allow a NULL program so that Activation Complete gets called */
    if (ulNumberOfCommands > MVOBJ_MAX_BUTTON_NAV_COMMANDS)
    {
        return (HDMVMOD_INVALID_PARAM);
    }

    DbgAssert(hHdmvMod->MsgQID != 0);

    /* Send message to the task */
    msg.tMsgType        = HDMVMOD_MSG_PROCESS_BOBJ;
    msg.ulData0         = (ULONG)pButtonProgram;
    msg.ulData1         = ulNumberOfCommands;
    msg.pvBuffer        = pContext;
    msg.ulSemID         = 0;
    if (OS_MsgQSend(hHdmvMod->MsgQID, (char *)&msg, sizeof(HDMVMOD_MESSAGE), OS_NO_WAIT, OS_MSG_PRI_NORMAL) != OS_OK)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModPlaybackComplete: Failure sending message!\n"));
        return (HDMVMOD_FAILURE);
    }

    return (HDMVMOD_SUCCESS);
}

/**
 * HdmvModPlaybackComplete -- Notify the HDMV Module that playback of a playlist is
 *                            complete.
 *
 * @param
 *      none.
 *
 * @retval
 *      HDMVMOD_SUCCESS if successful
 *      HDMVMOD_FAILURE if not successful
 */
HDMVMOD_STATUS  HdmvModPlaybackComplete(void)
{
    HDMVMOD_MESSAGE msg;

    if (hHdmvMod == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModPlaybackComplete: HDMV Module not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    DbgAssert(hHdmvMod->MsgQID != 0);

    /* Send message to the task */
    msg.tMsgType        = HDMVMOD_MSG_PLAYBACK_COMPLETE;
    msg.ulData0         = 0;
    msg.ulData1         = 0;
    msg.ulSemID         = 0;
    if (OS_MsgQSend(hHdmvMod->MsgQID, (char *)&msg, sizeof(HDMVMOD_MESSAGE), OS_NO_WAIT, OS_MSG_PRI_NORMAL) != OS_OK)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModPlaybackComplete: Failure sending message!\n"));
        return (HDMVMOD_FAILURE);
    }

    return (HDMVMOD_SUCCESS);
}

/**
 * HdmvModNavTimerExpire -- Notify the HDMV Module that nav timer has expired.
 *
 * @param
 *      none.
 *
 * @retval
 *      HDMVMOD_SUCCESS if successful
 *      HDMVMOD_FAILURE if not successful
 */
HDMVMOD_STATUS  HdmvModNavTimerExpire(void)
{
    HDMVMOD_MESSAGE msg;

    if (hHdmvMod == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModNavTimerExpire: HDMV Module not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* Check that message queue is created */
    if (hHdmvMod->MsgQID == 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModNavTimerExpire: Msg queue not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* Send message to the task */
    msg.tMsgType        = HDMVMOD_MSG_NVTIMER_EXPIRE;
    msg.ulData0         = 0;
    msg.ulData1         = 0;
    msg.ulSemID         = 0;
    if (OS_MsgQSend(hHdmvMod->MsgQID, (char *)&msg, sizeof(HDMVMOD_MESSAGE), OS_NO_WAIT, OS_MSG_PRI_NORMAL) != OS_OK)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModNavTimerExpire: Failure sending message!\n"));
        return (HDMVMOD_FAILURE);
    }

    return (HDMVMOD_SUCCESS);
}

/**
 * HdmvModSetTitleRepeat -- Turn repeat of playlist on.
 *
 * @param
 *      fOnOff - TRUE = repeat on, FALSE = repeat off.
 *
 * @retval
 *      HDMVMOD_SUCCESS if successful
 *      HDMVMOD_FAILURE if not successful
 */
HDMVMOD_STATUS  HdmvModSetTitleRepeat(BOOLEAN fOnOff)
{
    HDMVMOD_MESSAGE msg;

    if (hHdmvMod == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModSetTitleRepeat: HDMV Module not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* Check that message queue is created */
    if (hHdmvMod->MsgQID == 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModSetTitleRepeat: Msg queue not created!\n"));
        return (HDMVMOD_FAILURE);
    }

    /* Send message to the task */
    msg.tMsgType        = HDMVMOD_MSG_REPEAT;
    msg.ulData0         = fOnOff;
    msg.ulData1         = 0;
    msg.ulSemID         = 0;
    if (OS_MsgQSend(hHdmvMod->MsgQID, (char *)&msg, sizeof(HDMVMOD_MESSAGE), OS_NO_WAIT, OS_MSG_PRI_NORMAL) != OS_OK)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("HdmvModSetTitleRepeat: Failure sending message!\n"));
        return (HDMVMOD_FAILURE);
    }

    return (HDMVMOD_SUCCESS);
}

/**
 * HdmvModIsTitleRepeatOn -- Return title repeat state.
 *
 * @param
 *      none
 *
 * @retval
 *      TRUE if title repeat mode is on
 *      FALSE if title repeat mode is off

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -