?? cdaudio.cpp
字號:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
#include "atamain.h"
DWORD CDisk::ControlAudio(PIOREQ pIOReq)
{
ATAPI_COMMAND_PACKET CmdPkt;
DWORD dwError = ERROR_SUCCESS;
SGX_BUF SgBuf;
DWORD dwRet;
DEBUGMSG(ZONE_IOCTL, (TEXT("ATAPI:PlayAudioMSF - Entered.\r\n")));
memset( (void *)&CmdPkt, 0, sizeof( CmdPkt));
switch(pIOReq->dwCode) {
case IOCTL_CDROM_PLAY_AUDIO_MSF:
{
PCDROM_PLAY_AUDIO_MSF pPlayMSF;
pPlayMSF = (PCDROM_PLAY_AUDIO_MSF) pIOReq->pInBuf;
if (!pPlayMSF || (sizeof(CDROM_PLAY_AUDIO_MSF) > pIOReq->dwInBufSize)) {
dwError = ERROR_BAD_ARGUMENTS;
break;
}
CmdPkt.Opcode = ATAPI_PACKET_CMD_PLAY_MSF;
CmdPkt.Byte_3 = pPlayMSF->StartingM;
CmdPkt.Byte_4 = pPlayMSF->StartingS;
CmdPkt.Byte_5 = pPlayMSF->StartingF;
CmdPkt.Byte_6 = pPlayMSF->EndingM;
CmdPkt.Byte_7 = pPlayMSF->EndingS;
CmdPkt.Byte_8 = pPlayMSF->EndingF;
}
break;
case IOCTL_CDROM_SEEK_AUDIO_MSF:
{
CDROM_SEEK_AUDIO_MSF *pSeekMSF = (CDROM_SEEK_AUDIO_MSF *) pIOReq->pInBuf;
DWORD dwLBAAddr;
if (!pSeekMSF || (sizeof(CDROM_SEEK_AUDIO_MSF) > pIOReq->dwInBufSize)) {
dwError = ERROR_BAD_ARGUMENTS;
break;
}
dwLBAAddr = CDROM_MSFCOMP_TO_LBA( pSeekMSF->M, pSeekMSF->S, pSeekMSF->F);
CmdPkt.Opcode = ATAPI_PACKET_CMD_SEEK;
CmdPkt.Byte_2 = LBA_MSB(&dwLBAAddr);
CmdPkt.Byte_3 = LBA_3rdLSB(&dwLBAAddr);
CmdPkt.Byte_4 = LBA_2ndLSB(&dwLBAAddr);
CmdPkt.Byte_5 = LBA_LSB(&dwLBAAddr);
}
break;
case IOCTL_CDROM_SCAN_AUDIO:
{
CDROM_SCAN_AUDIO *pScan = (CDROM_SCAN_AUDIO *) pIOReq->pInBuf;
if (!pScan || (sizeof(CDROM_SCAN_AUDIO) > pIOReq->dwInBufSize)) {
dwError = ERROR_BAD_ARGUMENTS;
break;
}
CmdPkt.Opcode = ATAPI_PACKET_CMD_SCAN_AUDIO;
CmdPkt.Byte_1 = (pScan->Direction << 4) & 0x10;
CmdPkt.Byte_2 = pScan->Address[0];
CmdPkt.Byte_3 = pScan->Address[1];
CmdPkt.Byte_4 = pScan->Address[2];
CmdPkt.Byte_5 = pScan->Address[3];
CmdPkt.Byte_9 = pScan->AddressType << 6;
}
break;
case IOCTL_CDROM_STOP_AUDIO:
CmdPkt.Opcode = ATAPI_PACKET_CMD_STOP_PLAY_SCAN;
break;
case IOCTL_CDROM_PAUSE_AUDIO:
CmdPkt.Opcode = ATAPI_PACKET_CMD_PAUSE_RESUME;
CmdPkt.Byte_8 = 0;
break;
case IOCTL_CDROM_RESUME_AUDIO:
CmdPkt.Opcode = ATAPI_PACKET_CMD_PAUSE_RESUME;
CmdPkt.Byte_8 = 1;
break;
}
if (ERROR_SUCCESS == dwError) {
SgBuf.sb_len = 0;
SgBuf.sb_buf = NULL;
if (AtapiSendCommand(&CmdPkt)) {
if (!AtapiReceiveData(&SgBuf, 1, &dwRet)) {
DEBUGMSG( ZONE_ERROR|ZONE_CDROM, (TEXT("ATAPI::PlayAudioMSF failed on receive\r\n")));
dwError = ERROR_READ_FAULT;
}
} else {
// TODO: AtaCheckError()
return ERROR_GEN_FAILURE;
}
}
return dwError;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -