home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / CD-ROM Tools / CDRPlay / Include / cdrom.hpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-27  |  7.9 KB  |  242 lines

  1. //////////////////////////////////////////////////////////////////////////////
  2. // CDRom.hpp
  3. //
  4. // Deryk B Robosson
  5. // Jeffry A Worth
  6. // December 16, 1995
  7. //////////////////////////////////////////////////////////////////////////////
  8.  
  9. #ifndef __AFCDROM_HPP__
  10. #define __AFCDROM_HPP__
  11.  
  12. //////////////////////////////////////////////////////////////////////////////
  13. // INCLUDES
  14. #include "AFrame:include/AFrame.hpp"
  15. #include "AFrame:include/Object.hpp"
  16. #include <exec/types.h>
  17. #include <exec/memory.h>
  18. #include <exec/execbase.h>
  19. #include <exec/devices.h>
  20. #include <exec/io.h>
  21. #include <dos/dos.h>
  22. #include <dos/dosextens.h>
  23. #include <devices/cd.h>
  24. #include <proto/dos.h>
  25. #include <proto/exec.h>
  26. #include <proto/disk.h>
  27. #include <clib/cdplayer_protos.h>
  28. #include <libraries/cdplayer.h>
  29. #include <pragmas/cdplayer_pragmas.h>
  30. #include <stdio.h>
  31.  
  32. #include <devices/scsidisk.h>
  33. #include <devices/trackdisk.h>
  34.  
  35. /////////////////////////////////////////////////////////////////////////////
  36. // Structures and Global Vars
  37.  
  38. // Macros for converting addresses to Minutes and Seconds
  39.  
  40. #define BASE2MIN(val)   ((val)/75/60)   // Macro to convert blocks to minutes
  41. #define BASE2SEC(val)   (((val)/75)%60) // Macro to convert blocks to seconds
  42.  
  43. #define BLOCKSPERSECOND 75              // CD blocks per second of audio
  44. #define MAX_TOC     100                 // maximum number of tracks
  45. #define SENSE_LEN   18                  // SCSI command reply data buffers
  46. #define DATA_LEN    252                 // SCSI command reply data buffers
  47. #define TOC_LEN     (MAX_TOC * 8 + 4)   // max TOC size = 100 TOC track descriptors
  48.  
  49. #define CDP_EMPTY   0 // No CD in
  50. #define CDP_PLAYING 1 // Playing
  51. #define CDP_PAUSED  2 // Paused 
  52. #define CDP_STOPPED 3 // CD in, not Playing
  53. #define CDP_SEEKING 4 // Seeking to a Track
  54. #define CDP_EJECTED 5 // Tray Out
  55.  
  56. #define SCSI_CMD_TUR    0x00 // Test Unit Ready
  57. #define SCSI_CMD_RZU    0x01 // Rewind / Rezero Unit
  58. #define SCSI_CMD_RQS    0x03 // Request Sense
  59. #define SCSI_CMD_FMU    0x04 // Format / Format Unit
  60. #define SCSI_CMD_RAB    0x07 // Initialize Element Status / Reassign Blocks
  61. #define SCSI_CMD_RD     0x08 // Get Message / Receive(06)
  62. #define SCSI_CMD_WR     0x0A // Print / Send Message / Send / Write (06)
  63. #define SCSI_CMD_SK     0x0B // Slew and Print(06)
  64. #define SCSI_CMD_INQ    0x12 // Inquire
  65. #define SCSI_CMD_MSL    0x15 // Mode Select(06)
  66. #define SCSI_CMD_RU     0x16 // Reserve / Reserve Unit
  67. #define SCSI_CMD_RLU    0x17 // Release / Release Unit
  68. #define SCSI_CMD_MSE    0x1A // Mode Sense(06)
  69. #define SCSI_CMD_SSU    0x1B // Load Unload / Scan / Stop Print / Start Stop Unit
  70. #define SCSI_CMD_RDI    0x1C // Receive Diagnostic Results
  71. #define SCSI_CMD_SDI    0x1D // Send Diagnostic Results
  72. #define SCSI_CMD_PAMR   0x1E // Prevent Allow Medium Removal
  73. #define SCSI_CMD_RCP    0x25 // Read CD-ROM Capacity
  74. #define SCSI_CMD_RXT    0x28 // Get Message / Read(10)
  75. #define SCSI_CMD_WXT    0x2A // Send Message / Write(10)
  76. #define SCSI_CMD_SKX    0x2B // Locate / Seek(10)
  77. #define SCSI_CMD_WVF    0x2E // Write And Verify(10)
  78. #define SCSI_CMD_VF     0x2F // Verify(10)
  79. #define SCSI_CMD_RDD    0x37 // Read Defect Data
  80. #define SCSI_CMD_WDB    0x3B // Meduim Scan
  81. #define SCSI_CMD_RDB    0x3C // Read Buffer
  82.  
  83. #define SCSI_CMD_COPY                   0x18 // Copy 
  84. #define SCSI_CMD_COMPARE                0x39 // Compare
  85. #define SCSI_CMD_COPYANDVERIFY          0x3A // Copy and Compare
  86. #define SCSI_CMD_CHGEDEF                0x40 // Change Definition
  87. #define SCSI_CMD_READSUBCHANNEL         0x42 // Read Sub-Channel
  88. #define SCSI_CMD_READTOC                0x43 // Read TOC
  89. #define SCSI_CMD_READHEADER             0x44 // Read Header
  90. #define SCSI_CMD_PLAYAUDIO12            0xA5 // Play Audio(12)
  91. #define SCSI_CMD_PLAYAUDIO10            0x45 // Play Audio(10)
  92. #define SCSI_CMD_PLAYAUDIOTRACKINDEX    0x48 // Play Audio Track Index
  93. #define SCSI_CMD_PAUSERESUME            0x4B // Pause / Resume
  94.  
  95. #define SCSI_SENSE_NOINFO       0x00 // No additional sense information
  96. #define SCSI_SENSE_IOTERM       0x06 // I/O process terminated
  97. #define SCSI_SENSE_PLAYING      0x11 // Audio play operation in progress
  98. #define SCSI_SENSE_PAUSED       0x12 // Audio play operation paused
  99. #define SCSI_SENSE_SUCCESS      0x13 // Audio play operation successfully completed
  100. #define SCSI_SENSE_STOPERROR    0x14 // Audio play stopped due to error
  101. #define SCSI_SENSE_NOSTATUS     0x15 // No current audio status to return
  102.  
  103. typedef struct
  104. {
  105.     UBYTE opcode;
  106.     UBYTE b1;
  107.     UBYTE b2;
  108.     UBYTE b3;
  109.     UBYTE b4;
  110.     UBYTE control;
  111. } SCSICMD6;
  112.  
  113. typedef struct
  114. {
  115.     UBYTE opcode;
  116.     UBYTE b1;
  117.     UBYTE b2;
  118.     UBYTE b3;
  119.     UBYTE b4;
  120.     UBYTE b5;
  121.     UBYTE b6;
  122.     UBYTE b7;
  123.     UBYTE b8;
  124.     UBYTE control;
  125. } SCSICMD10;
  126.  
  127. typedef struct
  128. {
  129.     UBYTE opcode;
  130.     UBYTE b1;
  131.     UBYTE b2;
  132.     UBYTE b3;
  133.     UBYTE b4;
  134.     UBYTE b5;
  135.     UBYTE b6;
  136.     UBYTE b7;
  137.     UBYTE b8;
  138.     UBYTE b9;
  139.     UBYTE b10;
  140.     UBYTE control;
  141. } SCSICMD12;
  142.  
  143.  
  144. typedef struct {
  145.     BYTE  cdi_DeviceType;       // byte 0 bits 0-4 of DataBuf
  146.     BOOL  cdi_RemovableMedium;  // byte 1 bit 7
  147.     BYTE  cdi_ANSIVersion;      // byte 2
  148.     UBYTE *cdi_VendorID;        // bytes 8-15
  149.     UBYTE *cdi_ProductID;       // bytes 16-32
  150.     UBYTE *cdi_ProductRev;      // bytes 32-35
  151.     UBYTE *cdi_VendorSpec;      // bytes 36-55
  152. } DEVINFO;
  153.  
  154. //////////////////////////////////////////////////////////////////////////////
  155. // CD_Rom Class
  156.  
  157. class AFCD_Rom : public AFObject
  158. {
  159. public:
  160.  
  161.     UBYTE *DataBuf;
  162.     UBYTE *TOCBuf;
  163.     UBYTE *SenseData;
  164.  
  165.     union CDTOC TOC[100];
  166.     ULONG TOC_Length[MAX_TOC];  // track lenghts in blocks
  167.     ULONG TOC_Time[MAX_TOC];    // track lenghts in seconds
  168.     UBYTE TOC_Flags[MAX_TOC];   // audio/data
  169.     STRPTR TOCS[MAX_TOC];       // titles
  170.     ULONG TOCP[MAX_TOC];        // program
  171.     ULONG Tracks;               // Total tracks on disk (easier to get to vs
  172.                                 // digging in the structs)
  173.  
  174.     ULONG TrackMin;     // Set by SCSI_CDCurrentTitle()
  175.     ULONG TrackSec;     // Set by SCSI_CDCurrentTitle()
  176.     ULONG Track;        // Updated by SCSI_CDStatus()
  177. //    ULONG EndAddress;
  178.     ULONG cd_status;    // Updated by SCSI_CDStatus()
  179.     BOOL cd_paused;     // Updated by SCSI_CDPause() / CDPause()
  180.     BOOL cd_active;     // Updated by CDActive()
  181.     BOOL cd_ejected;    // Updated by SCSI_CDEject() / CDEject()
  182.     BOOL lib;           // Used to determine whether to use xxxxx.device
  183.                         // (ex: scsi.device) or cdplayer.library
  184.  
  185.     struct CD_TOC cd_toc;
  186.     struct CD_Time cd_time;
  187.     struct CD_Volume cd_vol;
  188.     struct CD_Info cd_info;
  189.     DEVINFO dev_info;
  190.  
  191.  
  192.     AFCD_Rom();
  193.     ~AFCD_Rom();
  194.  
  195.     virtual void DestroyObject();
  196.     virtual char *ObjectType() { return "CDRom"; };
  197.  
  198. // Methods
  199.     virtual void CDCreate(UBYTE *, ULONG);
  200.  
  201.     virtual void SCSI_CDClose();
  202.     virtual void SCSI_CDOpen();
  203.     virtual void SCSI_CDEject();
  204.     virtual void SCSI_CDPlay(ULONG, ULONG);
  205.     virtual void SCSI_CDPause();
  206.     virtual void SCSI_CDStop();
  207.     virtual void SCSI_CDJump(LONG);
  208.     virtual void SCSI_CDStatus();
  209.     virtual int SCSI_CDCurrentTitle();
  210.     virtual void SCSI_CDTitleTime();
  211.     virtual void SCSI_CDGetVolume();
  212.     virtual void SCSI_CDSetVolume(int, int, int, int);
  213.     virtual void SCSI_ReadTOC();
  214.     virtual void SCSI_CDInfo();
  215.     BOOL SCSI_IsCD();
  216.     virtual void DoSCSI(UBYTE *, int, UBYTE *, int, UBYTE);
  217.  
  218.     virtual void CDClose();
  219.     virtual void CDOpen();
  220.     virtual void CDEject();
  221.     virtual void CDPlay(UBYTE, UBYTE);
  222.     virtual void CDPause();
  223.     virtual void CDStop();
  224.     virtual void CDJump(LONG);
  225.     virtual void CDActive(); // similar to SCSI_CDStatus
  226.     virtual void CDCurrentTitle();
  227.     virtual void CDTitleTime();
  228.     virtual void CDGetVolume();
  229.     virtual void CDSetVolume();
  230.     virtual void CDReadTOC();
  231.     virtual void CDInfo();
  232.  
  233. private:
  234.     LPMsgPort m_scsi_port;
  235.     LPIOStdReq m_scsi_io;
  236.     STRPTR m_scsi_device;
  237.     ULONG m_scsi_unit;
  238. };
  239.  
  240. //////////////////////////////////////////////////////////////////////////////
  241. #endif // __AFCDROM_HPP__
  242.