#ifndef __CDROM_INTERFACE__ #define __CDROM_INTERFACE__ #define MAX_ASPI_CDROM 5 #include #include "mem.h" #include "SDL.h" #define RAW_SECTOR_SIZE 2352 #define COOKED_SECTOR_SIZE 2048 enum { CDROM_USE_SDL, CDROM_USE_ASPI, CDROM_USE_IOCTL }; typedef struct SMSF { unsigned char min; unsigned char sec; unsigned char fr; } TMSF; extern int CDROM_GetMountType(char* path, int force); class CDROM_Interface { public: // CDROM_Interface (void); virtual ~CDROM_Interface (void) {}; virtual bool SetDevice (char* path, int forceCD) = 0; virtual bool GetUPC (unsigned char& attr, char* upc) = 0; virtual bool GetAudioTracks (int& stTrack, int& end, TMSF& leadOut) = 0; virtual bool GetAudioTrackInfo (int track, TMSF& start, unsigned char& attr) = 0; virtual bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos) = 0; virtual bool GetAudioStatus (bool& playing, bool& pause) = 0; virtual bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen) = 0; virtual bool PlayAudioSector (unsigned long start,unsigned long len) = 0; virtual bool PauseAudio (bool resume) = 0; virtual bool StopAudio (void) = 0; virtual bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num) = 0; virtual bool LoadUnloadMedia (bool unload) = 0; }; class CDROM_Interface_SDL : public CDROM_Interface { public: CDROM_Interface_SDL (void); ~CDROM_Interface_SDL (void); bool SetDevice (char* path, int forceCD); bool GetUPC (unsigned char& attr, char* upc) { attr = 0; strcpy(upc,"UPC"); return true; }; bool GetAudioTracks (int& stTrack, int& end, TMSF& leadOut); bool GetAudioTrackInfo (int track, TMSF& start, unsigned char& attr); bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos); bool GetAudioStatus (bool& playing, bool& pause); bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen); bool PlayAudioSector (unsigned long start,unsigned long len); bool PauseAudio (bool resume); bool StopAudio (void); bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num) { return false; }; bool LoadUnloadMedia (bool unload); private: bool Open (void); void Close (void); SDL_CD* cd; int driveID; Uint32 oldLeadOut; }; class CDROM_Interface_Fake : public CDROM_Interface { public: bool SetDevice (char* path, int forceCD) { return true; }; bool GetUPC (unsigned char& attr, char* upc) { attr = 0; strcpy(upc,"UPC"); return true; }; bool GetAudioTracks (int& stTrack, int& end, TMSF& leadOut); bool GetAudioTrackInfo (int track, TMSF& start, unsigned char& attr); bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos); bool GetAudioStatus (bool& playing, bool& pause); bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen); bool PlayAudioSector (unsigned long start,unsigned long len) { return true; }; bool PauseAudio (bool resume) { return true; }; bool StopAudio (void) { return true; }; bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num) { return true; }; bool LoadUnloadMedia (bool unload) { return true; }; }; #if defined (WIN32) /* Win 32 */ #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include #include "wnaspi32.h" // Aspi stuff class CDROM_Interface_Aspi : public CDROM_Interface { public: CDROM_Interface_Aspi (void); ~CDROM_Interface_Aspi (void); bool SetDevice (char* path, int forceCD); bool GetUPC (unsigned char& attr, char* upc); bool GetAudioTracks (int& stTrack, int& end, TMSF& leadOut); bool GetAudioTrackInfo (int track, TMSF& start, unsigned char& attr); bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos); bool GetAudioStatus (bool& playing, bool& pause); bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen); bool PlayAudioSector (unsigned long start,unsigned long len); bool PauseAudio (bool resume); bool StopAudio (void); bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num); bool LoadUnloadMedia (bool unload); private: DWORD GetTOC (LPTOC toc); HANDLE OpenIOCTLFile (char cLetter, BOOL bAsync); void GetIOCTLAdapter (HANDLE hF,int * iDA,int * iDT,int * iDL); bool ScanRegistryFindKey (HKEY& hKeyBase); bool ScanRegistry (HKEY& hKeyBase); BYTE GetHostAdapter (char* hardwareID); bool GetVendor (BYTE HA_num, BYTE SCSI_Id, BYTE SCSI_Lun, char* szBuffer); // ASPI stuff BYTE haId; BYTE target; BYTE lun; char letter; // Windows stuff HINSTANCE hASPI; HANDLE hEvent; // global event DWORD (*pGetASPI32SupportInfo) (void); // ptrs to aspi funcs DWORD (*pSendASPI32Command) (LPSRB); TMSF oldLeadOut; }; class CDROM_Interface_Ioctl : public CDROM_Interface { public: CDROM_Interface_Ioctl (void); ~CDROM_Interface_Ioctl (void); bool SetDevice (char* path, int forceCD); bool GetUPC (unsigned char& attr, char* upc); bool GetAudioTracks (int& stTrack, int& end, TMSF& leadOut); bool GetAudioTrackInfo (int track, TMSF& start, unsigned char& attr); bool GetAudioSub (unsigned char& attr, unsigned char& track, unsigned char& index, TMSF& relPos, TMSF& absPos); bool GetAudioStatus (bool& playing, bool& pause); bool GetMediaTrayStatus (bool& mediaPresent, bool& mediaChanged, bool& trayOpen); bool PlayAudioSector (unsigned long start,unsigned long len); bool PauseAudio (bool resume); bool StopAudio (void); bool ReadSectors (PhysPt buffer, bool raw, unsigned long sector, unsigned long num); bool LoadUnloadMedia (bool unload); private: bool Open (void); void Close (void); char pathname[32]; HANDLE hIOCTL; TMSF oldLeadOut; }; #endif /* WIN 32 */ #endif /* __CDROM_INTERFACE__ */