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

📄 cdda_app.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 * @return NONE
 */
static ULONG cddaAppTask(PVOID argv)
{
    BOOLEAN         fKillCddaTask = FALSE;
    ULONG           ulStatus      = OS_OK;
    CDDA_CommandMsg CddaCmdMsg;
    ULONG           status_event[4];
    PE_ISTREAMCTRL_PLAYRATE pePlayRate;

    /* Initialize */
    memset(&CddaCmdMsg, 0, CDDA_MSG_SIZE_BYTES);

    /* Continuous execution until commanded to exit. */
    while (fKillCddaTask == FALSE)
    {

        if (OS_OK != OS_MsgQReceive(CddaAppControl.osqidQueueCdda, (char *) &CddaCmdMsg, CDDA_MSG_SIZE_BYTES, OS_WAIT_FOREVER))
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): OS_MsgQReceive.\n", __FUNCTION__, ulStatus));
            OS_TaskDelay(OS_WAIT_1S / 20);
            continue;
        }
        else
        {
            /* Process CDDA Command */
            switch (CddaCmdMsg.bCommand)
            {
                case CDDA_CMD_RANDOM:
                    if(CddaAppControl.RandomMode)
                    {
                        CddaAppControl.RandomMode = FALSE;
                    }
                    else
                    {
                        CddaAppControl.RandomMode = TRUE;
                        CddaCreatRandomTrackList();
                    }
                    break;

                case CDDA_CMD_GOTO_TRACK:

                    DBGPRINT(DBG_ON(DBG_TRACE), ("%s(): Processing %s command.\n", __FUNCTION__, "CDDA_CMD_GOTO_TRACK"));

                    if (CddaCmdMsg.bTrackNumber > CddaAppControl.TOC.bLastTrackNumber)
                    {
                        status_event[0] = VDVD_STATUS_PROHIBITED;
                        if (UsrEventHandler(status_event) != USR_SUCCESS)
                        {
                            DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): Failed to send status event!\n", __FUNCTION__));
                        }
                        break;
                    }

                    CddaAppControl.bABRepeatCount = 0;
                    CddaAppControl.sSpeed = 1;

                    /* Abort currently playing track */
                    DRStop(CddaAppControl.tDR);
                    ulStatus = (ULONG) PEiStreamCtrlStop(CddaAppControl.tPE, FALSE);

                    /* Retrieve LBAs, which also sets current track info */
                    cddaGetTrackLBAs(CddaCmdMsg.bTrackNumber, &CddaAppControl.CurrentTrack);

                    DBGPRINT(DBG_ON(DBG_TRACE), ("%s(): Track number = %d, ulStartLBA = 0x%X, ulEndLBA = 0x%X, LBA Delta = 0x%X.\n",
                                                  __FUNCTION__, CddaCmdMsg.bTrackNumber,
                                                  CddaAppControl.CurrentTrack.ulStartLBA, CddaAppControl.CurrentTrack.ulEndLBA,
                                                  (CddaAppControl.CurrentTrack.ulEndLBA - CddaAppControl.CurrentTrack.ulStartLBA) ));

                    pePlayRate.direction = PE_ISTREAMCTRL_DIRECTION_FORWARD;
                    pePlayRate.discontiguous = FALSE;
                    pePlayRate.rate = PLAY_RATE_NORMAL;

                    ulStatus = (ULONG) PEiStreamCtrlSetRate(CddaAppControl.tPE, &pePlayRate);
                    if (PE_SUCCESS != ulStatus)
                    {
                        DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to PEiStreamCtrlSetRate failed.\n", __FUNCTION__, ulStatus));
                    }

                    ulStatus = (ULONG) PEiStreamCtrlRun(CddaAppControl.tPE);
                    if (PE_SUCCESS != ulStatus)
                    {
                        DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to PEiStreamCtrlRun failed.\n", __FUNCTION__, ulStatus));
                    }
                    else
                    {
                        /* Play track */
                        ulStatus = (ULONG)DRPlayCD(CddaAppControl.tDR, DR_TYPE_LBN, DR_QUEUE_ABORT,
                                                   CddaAppControl.CurrentTrack.ulStartLBA, CddaAppControl.CurrentTrack.ulEndLBA,
                                                   DR_CD_SECTOR_CDDA, CddaAppControl.sSpeed);
                        if (DR_SUCCESS != ulStatus)
                        {
                            DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to DRPlayCD failed.\n", __FUNCTION__, ulStatus));
                        }
                        else
                        {
                            CddaAppControl.State = CDDA_STATE_PLAY;

                            /* Send status event */
                            status_event[0] = VDVD_STATUS_CHAPTER_SKIP;
                            status_event[1] = (ULONG) CddaAppControl.CurrentTrack.bPoint;
                            if (UsrEventHandler(status_event) != USR_SUCCESS)
                            {
                                DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): Failed to send status event!\n", __FUNCTION__));
                            }
                        }
                    }
                    break;

                case CDDA_CMD_PLAY:

                    DBGPRINT(DBG_ON(DBG_TRACE), ("%s(): Processing %s command.\n", __FUNCTION__, "CDDA_CMD_PLAY"));

                    CddaAppControl.sSpeed = 1;

                    switch (CddaAppControl.State)
                    {
                        case CDDA_STATE_STOPPED:

                            CddaAppControl.bABRepeatCount = 0;

                            /* Retrieve LBAs, which also sets current track info */
                            cddaGetTrackLBAs(CddaAppControl.CurrentTrack.bPoint, &CddaAppControl.CurrentTrack);

                            DBGPRINT(DBG_ON(DBG_TRACE), ("%s(): Track number = %d, ulStartLBA = 0x%X, ulEndLBA = 0x%X, LBA Delta = 0x%X.\n",
                                                          __FUNCTION__, CddaCmdMsg.bTrackNumber,
                                                          CddaAppControl.CurrentTrack.ulStartLBA, CddaAppControl.CurrentTrack.ulEndLBA,
                                                          (CddaAppControl.CurrentTrack.ulEndLBA - CddaAppControl.CurrentTrack.ulStartLBA) ));

                            pePlayRate.direction = PE_ISTREAMCTRL_DIRECTION_FORWARD;
                            pePlayRate.discontiguous = FALSE;
                            pePlayRate.rate = PLAY_RATE_NORMAL;

                            ulStatus = (ULONG) PEiStreamCtrlSetRate(CddaAppControl.tPE, &pePlayRate);

                            ulStatus = (ULONG) PEiStreamCtrlRun(CddaAppControl.tPE);
                            if (PE_SUCCESS != ulStatus)
                            {
                                DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to PEiStreamCtrlResume failed.\n", __FUNCTION__, ulStatus));
                            }
                            else
                            {
                                /* Play track */
                                ulStatus = (ULONG)DRPlayCD(CddaAppControl.tDR, DR_TYPE_LBN, DR_QUEUE_ABORT,
                                                           CddaAppControl.CurrentTrack.ulStartLBA, CddaAppControl.CurrentTrack.ulEndLBA,
                                                           DR_CD_SECTOR_CDDA, CddaAppControl.sSpeed);
                                if (DR_SUCCESS != ulStatus)
                                {
                                    DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to DRPlayCD failed.\n", __FUNCTION__, ulStatus));
                                }
                                else
                                {
                                    CddaAppControl.State = CDDA_STATE_PLAY;

                                    /* Send status event */
                                    status_event[0] = VDVD_STATUS_PLAY;
                                    if (UsrEventHandler(status_event) != USR_SUCCESS)
                                    {
                                        DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): Failed to send status event!\n", __FUNCTION__));
                                    }
                                }
                            }
                            break;

                        case CDDA_STATE_FAST_FWD:
                        case CDDA_STATE_FAST_RWD:
                        case CDDA_STATE_HOLD:
                        case CDDA_STATE_PAUSED:
                            /* Resume, or un-pause, playback */
                            DRStop(CddaAppControl.tDR);
                            ulStatus = (ULONG) PEiStreamCtrlStop(CddaAppControl.tPE, FALSE);

                            if (CddaAppControl.RepeatMode == CDDA_REPEAT_AB)
                            {
                                ulStatus = (ULONG)DRPlayCD(CddaAppControl.tDR, DR_TYPE_LBN, DR_QUEUE_ABORT,
                                                           CddaAppControl.ulCurrentPETime, CddaAppControl.ulRepeatBTime,
                                                           DR_CD_SECTOR_CDDA, CddaAppControl.sSpeed);
                            }
                            else
                            {
                                ulStatus = (ULONG)DRPlayCD(CddaAppControl.tDR, DR_TYPE_LBN, DR_QUEUE_ABORT,
                                                           CddaAppControl.ulCurrentPETime, CddaAppControl.CurrentTrack.ulEndLBA,
                                                           DR_CD_SECTOR_CDDA, CddaAppControl.sSpeed);
                            }

                            pePlayRate.direction = PE_ISTREAMCTRL_DIRECTION_FORWARD;
                            pePlayRate.discontiguous = FALSE;
                            pePlayRate.rate = PLAY_RATE_NORMAL;

                            ulStatus = (ULONG) PEiStreamCtrlSetRate(CddaAppControl.tPE, &pePlayRate);
                            if (PE_SUCCESS != ulStatus)
                            {
                                DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to PEiStreamCtrlSetRate failed.\n", __FUNCTION__, ulStatus));
                            }

                            ulStatus = (ULONG) PEiStreamCtrlRun(CddaAppControl.tPE);
                            if (PE_SUCCESS != ulStatus)
                            {
                                DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to PEiStreamCtrlResume failed.\n", __FUNCTION__, ulStatus));
                            }
                            else
                            {
                                CddaAppControl.State = CDDA_STATE_PLAY;

                                /* Send status event */
                                status_event[0] = VDVD_STATUS_PLAY;
                                if (UsrEventHandler(status_event) != USR_SUCCESS)
                                {
                                    DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): Failed to send status event!\n", __FUNCTION__));
                                }
                            }
                            break;

                        case CDDA_STATE_UNITIALIZED:
                            DBGPRINT(DBG_ON(DBG_TRACE), ("%s(): Not initialized so we're not going to play.\n", __FUNCTION__));
                            break;

                        default:
                            DBGPRINT(DBG_ON(DBG_TRACE), ("%s(): Can't play from this STATE.\n", __FUNCTION__));
                            break;
                    }

                    break;

                case CDDA_CMD_PAUSE:

                    DBGPRINT(DBG_ON(DBG_TRACE), ("%s(): Processing %s command.\n", __FUNCTION__, "CDDA_CMD_PAUSE"));

                    CddaAppControl.sSpeed = 1;

                    if ((CDDA_STATE_PLAY == CddaAppControl.State) ||
                        (CDDA_STATE_FAST_FWD == CddaAppControl.State) ||
                        (CDDA_STATE_FAST_RWD == CddaAppControl.State))

                    {
                        ulStatus = (ULONG) PEiStreamCtrlPause(CddaAppControl.tPE);
                        if (PE_SUCCESS != ulStatus)
                        {
                            DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to PEiStreamCtrlPause failed.\n", __FUNCTION__, ulStatus));
                        }
                        else
                        {
                            CddaAppControl.State = CDDA_STATE_PAUSED;

                            /* Send status event */
                            status_event[0] = VDVD_STATUS_PAUSE;
                            if (UsrEventHandler(status_event) != USR_SUCCESS)
                            {
                                DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): Failed to send status event!\n", __FUNCTION__));
                            }
                        }
                    }
                    else if (CDDA_STATE_PAUSED == CddaAppControl.State)
                    {
                        ulStatus = (ULONG) PEiStreamCtrlResume(CddaAppControl.tPE);
                        if (PE_SUCCESS != ulStatus)
                        {
                            DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to PEiStreamCtrlPause failed.\n", __FUNCTION__, ulStatus));
                        }
                        else
                        {
                            CddaAppControl.State = CDDA_STATE_PLAY;

                            /* Send status event */
                            status_event[0] = VDVD_STATUS_PLAY;
                            if (UsrEventHandler(status_event) != USR_SUCCESS)
                            {
                                DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): Failed to send status event!\n", __FUNCTION__));
                            }
                        }
                    }
                    break;

                case CDDA_CMD_STOP:

                    DBGPRINT(DBG_ON(DBG_TRACE), ("%s(): Processing %s command.\n", __FUNCTION__, "CDDA_CMD_STOP"));

                    CddaAppControl.bABRepeatCount = 0;
                    CddaAppControl.sSpeed = 1;
                    CddaAppControl.RepeatMode = CDDA_REPEAT_NONE;

                    if (CDDA_STATE_STOPPED != CddaAppControl.State)
                    {
                        if (CDDA_STATE_HOLD != CddaAppControl.State)
                        {
                            ulStatus = (ULONG) PEiStreamCtrlPause(CddaAppControl.tPE);
                            if (PE_SUCCESS != ulStatus)
                            {
                                DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): ERROR (0x%X): Call to PEiStreamCtrlPause failed.\n", __FUNCTION__, ulStatus));
                            }
                            else
                            {
                                CddaAppControl.State = CDDA_STATE_HOLD;

                                /* Send status event */
                                status_event[0] = VDVD_STATUS_STOP;
                                status_event[1] = 0;
                                if (UsrEventHandler(status_event) != USR_SUCCESS)
                                {
                                    DBGPRINT(DBG_ON(DBG_ERROR), ("%s(): Failed to send status event!\n", __FUNCTION__));
        

⌨️ 快捷键说明

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