📄 cdda_app.cpp
字号:
* @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 + -