Ignore:
Timestamp:
May 17, 2002, 6:49:34 PM (23 years ago)
Author:
sandervl
Message:

CDROM ioctls added + fixed read toc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/hmdisk.cpp

    r8401 r8454  
    1 /* $Id: hmdisk.cpp,v 1.44 2002-05-10 14:55:11 sandervl Exp $ */
     1/* $Id: hmdisk.cpp,v 1.45 2002-05-17 16:49:34 sandervl Exp $ */
    22
    33/*
     
    3333#define BIT_2     (4)
    3434#define BIT_11    (1<<11)
     35
     36//Converts BCD to decimal; doesn't check for illegal BCD nrs
     37#define BCDToDec(a) ((a >> 4) * 10 + (a & 0xF))
    3538
    3639typedef struct
     
    5053    HFILE     hTemplate;
    5154    BOOL      fPhysicalDisk;
     55    BOOL      fCDPlaying;
    5256    LARGE_INTEGER StartingOffset;
    5357    LARGE_INTEGER PartitionSize;
     
    942946            parsize = sizeof(parm);
    943947            memcpy(parm.signature, drvInfo->signature, 4);
    944             parm.ucTrack = i;
     948            parm.ucTrack = pTOC->FirstTrack+i;
    945949
    946950            datasize = sizeof(trackinfo);
     
    963967            pTOC->TrackData[i].Address[2]  = HIBYTE(LOWORD(trackinfo.ulTrackAddr));
    964968            pTOC->TrackData[i].Address[3]  = LOBYTE(LOWORD(trackinfo.ulTrackAddr));
     969            dprintf(("IOCTL_CDROM_READ_TOC track %d Control %d Adr %d address %x", pTOC->FirstTrack+i, pTOC->TrackData[i].Control, pTOC->TrackData[i].Adr, trackinfo.ulTrackAddr));
    965970        }
    966971
     
    10011006      } ParameterBlock;
    10021007#pragma pack()
    1003       dprintf(("Play CDROM audio playback"));
    1004 
    10051008      PCDROM_PLAY_AUDIO_MSF pPlay = (PCDROM_PLAY_AUDIO_MSF)lpInBuffer;
    10061009
     1010      if(nInBufferSize < sizeof(CDROM_SEEK_AUDIO_MSF)) {
     1011          SetLastError(ERROR_INSUFFICIENT_BUFFER);
     1012          return FALSE;
     1013      }
     1014      if(lpBytesReturned)
     1015        *lpBytesReturned = 0;
     1016
     1017      dprintf(("Play CDROM audio playback %d:%d (%d) - %d:%d (%d)", pPlay->StartingM, pPlay->StartingS, pPlay->StartingF, pPlay->EndingM, pPlay->EndingS, pPlay->EndingF));
     1018
    10071019      // setup the parameter block
    1008 
    10091020      memcpy(&ParameterBlock.ucSignature, drvInfo->signature, 4);
    10101021      ParameterBlock.ucAddressingMode = 1;     // MSF format
    10111022
    1012       // @@@PH unknown if this kind of MSF conversion is correct!
    10131023      ParameterBlock.ulStartingMSF    = pPlay->StartingM << 16 |
    10141024                                        pPlay->StartingS << 8  |
     
    10211031      DWORD dwDataSize      = 0;
    10221032      DWORD ret;
    1023 
    1024       if(lpBytesReturned)
    1025         *lpBytesReturned = 0;
    10261033
    10271034      ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle,
     
    10341041                             0,
    10351042                             &dwDataSize);
     1043      if(ret != ERROR_SUCCESS) {
     1044          dprintf(("IOCTL_CDROMAUDIO, CDROMAUDIO_PLAYAUDIO failed!!"));
     1045      }
     1046      drvInfo->fCDPlaying = TRUE;
    10361047      return (ret == ERROR_SUCCESS);
    10371048    }
    10381049
    10391050    case IOCTL_CDROM_SEEK_AUDIO_MSF:
    1040         break;
     1051    {
     1052#pragma pack(1)
     1053      struct
     1054      {
     1055        DWORD ucSignature;
     1056        BYTE  ucAddressingMode;
     1057        DWORD ulStartingMSF;
     1058      } ParameterBlock;
     1059#pragma pack()
     1060        CDROM_SEEK_AUDIO_MSF *pSeek = (CDROM_SEEK_AUDIO_MSF *)lpInBuffer;
     1061
     1062        if(nInBufferSize < sizeof(CDROM_SEEK_AUDIO_MSF)) {
     1063            SetLastError(ERROR_INSUFFICIENT_BUFFER);
     1064            return FALSE;
     1065        }
     1066        if(lpBytesReturned)
     1067          *lpBytesReturned = 0;
     1068
     1069        dprintf(("IOCTL_CDROMDISK, CDROMDISK_SEEK %d:%d (%d)", pSeek->M, pSeek->S, pSeek->F));
     1070
     1071        // setup the parameter block
     1072        memcpy(&ParameterBlock.ucSignature, drvInfo->signature, 4);
     1073        ParameterBlock.ucAddressingMode = 1;     // MSF format
     1074
     1075        ParameterBlock.ulStartingMSF    = pSeek->M << 16 |
     1076                                          pSeek->S << 8  |
     1077                                          pSeek->F;
     1078
     1079        DWORD dwParameterSize = sizeof( ParameterBlock );
     1080        DWORD dwDataSize      = 0;
     1081        DWORD ret;
     1082
     1083        ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle,
     1084                               0x80,  // IOCTL_CDROMDISK
     1085                               0x50,  // CDROMDISK_SEEK
     1086                               &ParameterBlock,
     1087                               sizeof( ParameterBlock ),
     1088                               &dwParameterSize,
     1089                               NULL,
     1090                               0,
     1091                               &dwDataSize);
     1092        if(ret != ERROR_SUCCESS) {
     1093            dprintf(("IOCTL_CDROMDISK, CDROMDISK_SEEK %x failed!!", ParameterBlock.ulStartingMSF));
     1094        }
     1095        return (ret == ERROR_SUCCESS);
     1096    }
    10411097
    10421098    case IOCTL_CDROM_PAUSE_AUDIO:
     
    10471103    {
    10481104      dprintf(("Stop / pause CDROM audio playback"));
     1105      drvInfo->fCDPlaying = FALSE;
    10491106      return ioctlCDROMSimple(pHMHandleData,
    10501107                              0x81,   // IOCTL_CDROMAUDIO
     
    10561113    {
    10571114      dprintf(("Resume CDROM audio playback"));
     1115      drvInfo->fCDPlaying = TRUE;
    10581116      return ioctlCDROMSimple(pHMHandleData,
    10591117                              0x81,   // IOCTL_CDROMAUDIO
     
    11281186    }
    11291187    case IOCTL_CDROM_READ_Q_CHANNEL:
     1188    {
     1189#pragma pack(1)
     1190      struct
     1191      {
     1192        BYTE  ucControlAddr;
     1193        BYTE  ucTrackNr;
     1194        BYTE  ucIndex;
     1195        BYTE  ucRuntimeTrackMin;
     1196        BYTE  ucRuntimeTrackSec;
     1197        BYTE  ucRuntimeTrackFrame;
     1198        BYTE  ucReserved;
     1199        BYTE  ucRuntimeDiscMin;
     1200        BYTE  ucRuntimeDiscSec;
     1201        BYTE  ucRuntimeDiscFrame;
     1202      } DataBlock;
     1203      struct {
     1204        WORD  usAudioStatus;
     1205        DWORD ulStartLoc;
     1206        DWORD ulEndLoc;
     1207      } DataBlockStatus;
     1208#pragma pack()
     1209        CDROM_SUB_Q_DATA_FORMAT *pFormat = (CDROM_SUB_Q_DATA_FORMAT*)lpInBuffer;
     1210        SUB_Q_CHANNEL_DATA      *pChannelData = (SUB_Q_CHANNEL_DATA *)lpOutBuffer;
     1211        char                     signature[8];
     1212
     1213        if(nInBufferSize < sizeof(CDROM_SUB_Q_DATA_FORMAT) || !pFormat) {
     1214            SetLastError(ERROR_INSUFFICIENT_BUFFER);
     1215            return FALSE;
     1216        }
     1217        if(nOutBufferSize < sizeof(SUB_Q_CHANNEL_DATA) || !pChannelData) {
     1218            SetLastError(ERROR_INSUFFICIENT_BUFFER);
     1219            return FALSE;
     1220        }
     1221        if(lpBytesReturned) {
     1222            *lpBytesReturned = 0;
     1223        }
     1224
     1225        DWORD dwParameterSize = 4;
     1226        DWORD dwDataSize      = sizeof(DataBlock);
     1227        DWORD ret;
     1228
     1229        memcpy(signature, drvInfo->signature, dwParameterSize);
     1230
     1231        ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle,
     1232                               0x81,  // IOCTL_CDROMAUDIO
     1233                               0x63,  // CDROMAUDIO_GETSUBCHANNELQ
     1234                               signature,
     1235                               dwParameterSize,
     1236                               &dwParameterSize,
     1237                               &DataBlock,
     1238                               sizeof(DataBlock),
     1239                               &dwDataSize);
     1240        if(ret != ERROR_SUCCESS) {
     1241            dprintf(("IOCTL_CDROMAUDIO, CDROMAUDIO_GETSUBCHANNELQ failed!!"));
     1242            return FALSE;
     1243        }
     1244
     1245        dwDataSize = sizeof(DataBlockStatus);
     1246        ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle,
     1247                               0x81,  // IOCTL_CDROMAUDIO
     1248                               0x65,  // CDROMAUDIO_GETAUDIOSTATUS
     1249                               signature,
     1250                               dwParameterSize,
     1251                               &dwParameterSize,
     1252                               &DataBlockStatus,
     1253                               sizeof(DataBlockStatus),
     1254                               &dwDataSize);
     1255        if(ret != ERROR_SUCCESS) {
     1256            dprintf(("IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOSTATUS failed!!"));
     1257            return FALSE;
     1258        }
     1259        dprintf(("CDROMAUDIO_GETAUDIOSTATUS returned %d %x %x", DataBlockStatus.usAudioStatus, DataBlockStatus.ulStartLoc, DataBlockStatus.ulEndLoc));
     1260
     1261        pChannelData->CurrentPosition.Header.Reserved = 0;
     1262        if(DataBlockStatus.usAudioStatus & 1) {
     1263            pChannelData->CurrentPosition.Header.AudioStatus = AUDIO_STATUS_PAUSED;
     1264        }
     1265        else {
     1266            if(DataBlockStatus.ulStartLoc == 0) {//no play command has been issued before
     1267                 pChannelData->CurrentPosition.Header.AudioStatus = AUDIO_STATUS_NO_STATUS;
     1268            }
     1269            else {//assume in progress, but could alse be finished playing
     1270                pChannelData->CurrentPosition.Header.AudioStatus = (drvInfo->fCDPlaying) ? AUDIO_STATUS_IN_PROGRESS : AUDIO_STATUS_PLAY_COMPLETE;
     1271            }
     1272        }
     1273
     1274        switch(pFormat->Format) {
     1275        case IOCTL_CDROM_SUB_Q_CHANNEL:
     1276            dprintf(("IOCTL_CDROM_SUB_Q_CHANNEL not supported"));
     1277            return FALSE;
     1278        case IOCTL_CDROM_CURRENT_POSITION:
     1279            pChannelData->CurrentPosition.Header.DataLength[0]    = sizeof(pChannelData->CurrentPosition);
     1280            pChannelData->CurrentPosition.Header.DataLength[1]    = 0;
     1281            pChannelData->CurrentPosition.Control                 = DataBlock.ucControlAddr >> 4;
     1282            pChannelData->CurrentPosition.ADR                     = DataBlock.ucControlAddr & 0xF;
     1283            pChannelData->CurrentPosition.IndexNumber             = BCDToDec(DataBlock.ucIndex);
     1284            pChannelData->CurrentPosition.TrackNumber             = BCDToDec(DataBlock.ucTrackNr);
     1285            pChannelData->CurrentPosition.TrackRelativeAddress[1] = DataBlock.ucRuntimeTrackMin;
     1286            pChannelData->CurrentPosition.TrackRelativeAddress[2] = DataBlock.ucRuntimeTrackSec;
     1287            pChannelData->CurrentPosition.TrackRelativeAddress[3] = DataBlock.ucRuntimeTrackFrame;
     1288            pChannelData->CurrentPosition.AbsoluteAddress[1]      = DataBlock.ucRuntimeDiscMin;
     1289            pChannelData->CurrentPosition.AbsoluteAddress[2]      = DataBlock.ucRuntimeDiscSec;
     1290            pChannelData->CurrentPosition.AbsoluteAddress[3]      = DataBlock.ucRuntimeDiscFrame;
     1291            pChannelData->CurrentPosition.FormatCode              = IOCTL_CDROM_CURRENT_POSITION;
     1292            dprintf(("IOCTL_CDROM_CURRENT_POSITION: Control %x ADR %x Index %d Track %d Track Rel %d:%d (%d) Absolute %d:%d (%d)", pChannelData->CurrentPosition.Control, pChannelData->CurrentPosition.ADR, pChannelData->CurrentPosition.IndexNumber, pChannelData->CurrentPosition.TrackNumber, pChannelData->CurrentPosition.TrackRelativeAddress[1], pChannelData->CurrentPosition.TrackRelativeAddress[2], pChannelData->CurrentPosition.TrackRelativeAddress[3], pChannelData->CurrentPosition.AbsoluteAddress[1], pChannelData->CurrentPosition.AbsoluteAddress[2], pChannelData->CurrentPosition.AbsoluteAddress[3]));
     1293            if(lpBytesReturned) {
     1294                *lpBytesReturned = sizeof(*pChannelData);
     1295            }
     1296            break;
     1297        case IOCTL_CDROM_MEDIA_CATALOG:
     1298            dprintf(("IOCTL_CDROM_MEDIA_CATALOG not supported"));
     1299            return FALSE;
     1300        case IOCTL_CDROM_TRACK_ISRC:
     1301            dprintf(("IOCTL_CDROM_TRACK_ISRC not supported"));
     1302            return FALSE;
     1303        }
     1304        return (ret == ERROR_SUCCESS);
     1305    }
     1306
    11301307    case IOCTL_CDROM_GET_LAST_SESSION:
    11311308    case IOCTL_CDROM_RAW_READ:
Note: See TracChangeset for help on using the changeset viewer.