Changeset 8454 for trunk/src/kernel32/hmdisk.cpp
- Timestamp:
- May 17, 2002, 6:49:34 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmdisk.cpp
r8401 r8454 1 /* $Id: hmdisk.cpp,v 1.4 4 2002-05-10 14:55:11sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.45 2002-05-17 16:49:34 sandervl Exp $ */ 2 2 3 3 /* … … 33 33 #define BIT_2 (4) 34 34 #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)) 35 38 36 39 typedef struct … … 50 53 HFILE hTemplate; 51 54 BOOL fPhysicalDisk; 55 BOOL fCDPlaying; 52 56 LARGE_INTEGER StartingOffset; 53 57 LARGE_INTEGER PartitionSize; … … 942 946 parsize = sizeof(parm); 943 947 memcpy(parm.signature, drvInfo->signature, 4); 944 parm.ucTrack = i;948 parm.ucTrack = pTOC->FirstTrack+i; 945 949 946 950 datasize = sizeof(trackinfo); … … 963 967 pTOC->TrackData[i].Address[2] = HIBYTE(LOWORD(trackinfo.ulTrackAddr)); 964 968 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)); 965 970 } 966 971 … … 1001 1006 } ParameterBlock; 1002 1007 #pragma pack() 1003 dprintf(("Play CDROM audio playback"));1004 1005 1008 PCDROM_PLAY_AUDIO_MSF pPlay = (PCDROM_PLAY_AUDIO_MSF)lpInBuffer; 1006 1009 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 1007 1019 // setup the parameter block 1008 1009 1020 memcpy(&ParameterBlock.ucSignature, drvInfo->signature, 4); 1010 1021 ParameterBlock.ucAddressingMode = 1; // MSF format 1011 1022 1012 // @@@PH unknown if this kind of MSF conversion is correct!1013 1023 ParameterBlock.ulStartingMSF = pPlay->StartingM << 16 | 1014 1024 pPlay->StartingS << 8 | … … 1021 1031 DWORD dwDataSize = 0; 1022 1032 DWORD ret; 1023 1024 if(lpBytesReturned)1025 *lpBytesReturned = 0;1026 1033 1027 1034 ret = OSLibDosDevIOCtl(pHMHandleData->hHMHandle, … … 1034 1041 0, 1035 1042 &dwDataSize); 1043 if(ret != ERROR_SUCCESS) { 1044 dprintf(("IOCTL_CDROMAUDIO, CDROMAUDIO_PLAYAUDIO failed!!")); 1045 } 1046 drvInfo->fCDPlaying = TRUE; 1036 1047 return (ret == ERROR_SUCCESS); 1037 1048 } 1038 1049 1039 1050 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 } 1041 1097 1042 1098 case IOCTL_CDROM_PAUSE_AUDIO: … … 1047 1103 { 1048 1104 dprintf(("Stop / pause CDROM audio playback")); 1105 drvInfo->fCDPlaying = FALSE; 1049 1106 return ioctlCDROMSimple(pHMHandleData, 1050 1107 0x81, // IOCTL_CDROMAUDIO … … 1056 1113 { 1057 1114 dprintf(("Resume CDROM audio playback")); 1115 drvInfo->fCDPlaying = TRUE; 1058 1116 return ioctlCDROMSimple(pHMHandleData, 1059 1117 0x81, // IOCTL_CDROMAUDIO … … 1128 1186 } 1129 1187 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 1130 1307 case IOCTL_CDROM_GET_LAST_SESSION: 1131 1308 case IOCTL_CDROM_RAW_READ:
Note:
See TracChangeset
for help on using the changeset viewer.