s32 DeviceBufferOffset() { #ifdef VERBOSE_FUNCTION_DEVICE PrintLog("CDVD device: DeviceBufferOffset()"); #endif /* VERBOSE_FUNCTION_DEVICE */ if (DiscInserted() == -1) return (-1); if ((disctype == CDVD_TYPE_PS2DVD) || (disctype == CDVD_TYPE_DVDV)) return (0); else return (CDgetBufferOffset()); // ENDIF- Is this a DVD? } // END DeviceBufferOffset()
s32 DeviceBufferOffset() { if (DiscInserted() == -1) return(-1); if ((disctype == CDVD_TYPE_PS2DVD) || (disctype == CDVD_TYPE_DVDV)) { return(0); } else { return(CDgetBufferOffset()); } // ENDIF- Is this a DVD? return(-1); } // END DeviceBufferOffset()
s32 CALLBACK CDgetDiskType(s32 ioctldisktype) { s32 offset; s32 s32result; int i; u8 j; int tempdisctype; offset = 0; errno = 0; i = 0; j = 0; tempdisctype = CDVD_TYPE_UNKNOWN; #ifdef VERBOSE_FUNCTION PrintLog("CDVD driver: CDgetDiskType()"); #endif /* VERBOSE_FUNCTION */ s32result = CDreadTrack(16, CDVD_MODE_2352, cdtempbuffer); if ((s32result != 0) || (errno != 0)) return (-1); // ENDIF- Cannot read the CD's ISO9660 volume sector? Abort disctype = CDVD_TYPE_DETCTCD; switch (ioctldisktype) { case CDS_AUDIO: #ifdef VERBOSE_DISC_TYPE PrintLog("CDVD driver: Detected CDDA Audio disc."); #endif /* VERBOSE_DISC_TYPE */ tempdisctype = CDVD_TYPE_CDDA; tocbuffer[0] = 0x01; break; case CDS_DATA_1: case CDS_MIXED: #ifdef VERBOSE_DISC_TYPE PrintLog("CDVD driver: Detected CD disc."); #endif /* VERBOSE_DISC_TYPE */ tocbuffer[0] = 0x41; CDreadTrack(16, CDVD_MODE_2048, cdtempbuffer); offset = CDgetBufferOffset(); i = 0; while ((*(playstationcdname + i) != 0) && (*(playstationcdname + i) == cdtempbuffer[offset + 8 + i])) i++; if (*(playstationcdname + i) == 0) { i = 0; while ((*(ps1name + i) != 0) && (*(ps1name + i) == cdtempbuffer[offset + 1024 + i])) i++; if (*(ps1name + i) == 0) { #ifdef VERBOSE_DISC_TYPE PrintLog("CDVD driver: Detected Playstation CD disc."); #endif /* VERBOSE_DISC_TYPE */ tempdisctype = CDVD_TYPE_PSCD; } else { #ifdef VERBOSE_DISC_TYPE PrintLog("CDVD driver: Detected Playstation 2 CD disc."); #endif /* VERBOSE_DISC_TYPE */ tempdisctype = CDVD_TYPE_PS2CD; } // ENDIF- Did we find the CD ident? (For Playstation 1 CDs) } else tempdisctype = CDVD_TYPE_UNKNOWN; // ENDIF- Did we find the Playstation name? break; default: return (-1); } // ENDSWITCH- What has ioctl disc type come up with? // Collect TN data cdheader.cdth_trk0 = 0; cdheader.cdth_trk1 = 0; s32result = ioctl(devicehandle, CDROMREADTOCHDR, &cdheader); if ((s32result == -1) || (errno != 0)) { #ifdef VERBOSE_WARNINGS PrintLog("CDVD driver: Error reading TN: (%i) %i:%s", s32result, errno, strerror(errno)); #endif /* VERBOSE_WARNINGS */ cdheader.cdth_trk0 = 1; cdheader.cdth_trk1 = 1; } // ENDIF- Failed to read in track count? Assume 1 track. #ifdef VERBOSE_DISC_INFO PrintLog("CDVD driver: Track Number Range: %i-%i", cdheader.cdth_trk0, cdheader.cdth_trk1); #endif /* VERBOSE_DISC_INFO */ tocbuffer[2] = 0xA0; tocbuffer[7] = HEXTOBCD(cdheader.cdth_trk0); tocbuffer[12] = 0xA1; tocbuffer[17] = HEXTOBCD(cdheader.cdth_trk1); // Collect disc TD data cdtrack.cdte_track = CDROM_LEADOUT; cdtrack.cdte_format = CDROM_LBA; s32result = ioctl(devicehandle, CDROMREADTOCENTRY, &cdtrack); if ((s32result == -1) || (errno != 0)) { #ifdef VERBOSE_WARNINGS PrintLog("CDVD driver: Error reading TD for disc: (%i) %i:%s", s32result, errno, strerror(errno)); #endif /* VERBOSE_WARNINGS */ return (-1); } // ENDIF- Trouble getting a track count? LBAtoMSF(cdtrack.cdte_addr.lba, &tocbuffer[27]); #ifdef VERBOSE_DISC_INFO PrintLog("CDVD driver: Total Time: %i:%i", tocbuffer[27], tocbuffer[28]); #endif /* VERBOSE_DISC_INFO */ tocbuffer[27] = HEXTOBCD(tocbuffer[27]); tocbuffer[28] = HEXTOBCD(tocbuffer[28]); tocbuffer[29] = HEXTOBCD(tocbuffer[29]); // Collect track TD data for (j = cdheader.cdth_trk0; j <= cdheader.cdth_trk1; j++) { cdtrack.cdte_track = j; // j-1? cdtrack.cdte_format = CDROM_LBA; s32result = ioctl(devicehandle, CDROMREADTOCENTRY, &cdtrack); if ((s32result == -1) || (errno != 0)) { #ifdef VERBOSE_WARNINGS PrintLog("CDVD driver: Error reading TD for track %i: (%i) %i:%s", j, s32result, errno, strerror(errno)); #endif /* VERBOSE_WARNINGS */ // No more here... } else { LBAtoMSF(cdtrack.cdte_addr.lba, &tocbuffer[j * 10 + 37]); #ifdef VERBOSE_DISC_INFO PrintLog("CDVD driver: Track %i: Data Mode %i Disc Start Time:%i:%i.%i\n", j, cdtrack.cdte_datamode, tocbuffer[j * 10 + 37], tocbuffer[j * 10 + 38], tocbuffer[j * 10 + 39]); #endif /* VERBOSE_DISC_INFO */ tocbuffer[j * 10 + 30] = cdtrack.cdte_datamode; tocbuffer[j * 10 + 32] = HEXTOBCD(j); tocbuffer[j * 10 + 37] = HEXTOBCD(tocbuffer[j * 10 + 37]); tocbuffer[j * 10 + 38] = HEXTOBCD(tocbuffer[j * 10 + 38]); tocbuffer[j * 10 + 39] = HEXTOBCD(tocbuffer[j * 10 + 39]); } // ENDIF- Trouble getting a track count? } // NEXT j- Reading each track's info in turn errno = 0; disctype = tempdisctype; // Trigger the fact we have the info (finally) return (disctype); } // END CDVDgetDiskType()