home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tolkit45.zip / os2tk45 / samples / mm / cdmcidrv / ibmcdrom.h < prev    next >
Text File  |  1999-05-11  |  15KB  |  265 lines

  1. /****************************************************************************/
  2. /*                                                                          */
  3. /* SOURCE FILE NAME:  IBMCDROM.H                                            */
  4. /*                                                                          */
  5. /* DESCRIPTIVE NAME:  Include file for IBM CD ROM Drive Hardware dependent  */
  6. /*                    code for CD Audio MCI Driver (IBMCDROM.C)             */
  7. /*                                                                          */
  8. /* COPYRIGHT:  (c) IBM Corp. 1990 - 1993                                    */
  9. /*                                                                          */
  10. /* FUNCTION:  This file contains the macro definition used in the           */
  11. /*            CD Audio MCI Driver, IBM specific hardware.                   */
  12. /*                                                                          */
  13. /* NOTES:                                                                   */
  14. /*                                                                          */
  15. /*                                                                          */
  16. /****************************************************************************/
  17.  
  18. /*** Values used ***/
  19.  
  20. #define TRUE            1
  21. #define FALSE           0
  22.  
  23. #define IBMCD010       10       // Hardware is the IBM 3510 CD-ROM Drive.
  24. #define IBMCD019       19       // Hardware is unknown, treat like CD01.
  25. #define CD01_CAPS     CDVSD_CAP_HAS_AUDIO | CDVSD_CAP_CAN_LOCK |   \
  26.                       CDVSD_CAP_HAS_DAC | CDVSD_CAP_CAN_EJECT |    \
  27.                       CDVSD_CAP_CAN_VOLUME
  28.  
  29. #define RBMODE          1       // Redbook Addressing Mode
  30. #define IS_DATA_TRK  0x40       // Data Track bit track control information
  31. #define NO_MEDIA     0x08       // No disc present bit for Device Status call
  32. #define IS_PLAYING   0x10       // Playing Audio bit for Device Status call
  33. #define WAS_STOPPED  0x01       // Paused Audio bit for Audio Status call
  34. #define OPENFLAG        1L      // Open flag, open if exists else fail
  35. #define OPENMODE   0x0000A0C0L  // Open mode for shareing, exclusive = 0xA090L
  36. #define SPEC_START   6000       // 2 sec start address, external spec says so.
  37. #define REG_INST        0       // Register only to instance
  38. #define REG_PARAM2      1       // Register only to ulParam2
  39. #define REG_BOTH        2       // Register to both instance and ulParam2
  40. #define INFO_SIZE       9       // Size of INFO product string.
  41. #define MODEL_SIZE     25       // Max Size of Model, Vendor + Product + NULL
  42. #define SSM_LOAD_SIZE 100       // Size of error buffer when loading SSM
  43. #define ONE_MMTIME     40       // MMTIME units per Redbook frame
  44. #define SYNC_LATENCY ONE_MMTIME // Assume One frame elapsed send sync originated
  45. #define SYNC_TOLERANCE 1500     // +/- half a second
  46. #define WAIT_NOTIFY_MASK (0xFFFFFFFF ^ (MCI_WAIT | MCI_NOTIFY))
  47. #define THREAD_STACK_SZ 65536L  // Stack size for MCI_NOTIFY thread.
  48.  
  49. /* Wait values for the Timer Play Loop */
  50. #define WAIT_TIME_MAX 1000      // Timer wait max interval in milliseconds.
  51. #define WAIT_TIME_MIN  160      // Timer wait min interval in milliseconds.
  52. #define HALF_TIME_MIN  WAIT_TIME_MIN / 2  // half of the min value.
  53. #define WAIT_FOREVER   -1L      // Suspend until released
  54.  
  55.  
  56. /* Flags */
  57. #define TIMER_AVAIL        0    // PlayFlag Timer available.
  58. #define TIMER_PLAYING      1    // PlayFlag Timer is Playing.
  59. #define TIMER_EXIT_SUPER   2    // Timer terminate from a PLAY w/ MCI_NOTIFY.
  60. #define TIMER_EXIT_ABORTED 3    // Timer terminated from another command.
  61. #define TIMER_EXIT_CHANGED 4    // Disc changed on a restore, terminate timer.
  62. #define TIMER_PLAY_SUSPEND 5    // PlayFlag Timer is Playing but suspended.
  63. #define TIMER_PLAY_SUSP_2  6    // PlayFlag suspended, restored paused.
  64.  
  65. /*** Field positions for data[] and param[] structures used in IOCTLs ***/
  66.  
  67. #define ADRMODEFLD      4       // Address mode Field in param for Play/Read
  68. #define AUDSTATFLD      0       // Audio Paused Field in data for Audio Status
  69. #define END_MM_FLD     11       // End Min Field in param for Play Audio
  70. #define END_SS_FLD     10       // End Sec Field in param for Play Audio
  71. #define END_FF_FLD      9       // End Frame Field in param for Play Audio
  72. #define END_00_FLD     12       // End Null Field in param for Play Audio
  73. #define LOC_MM_FLD      2       // Current Min Field in data for Location
  74. #define LOC_SS_FLD      1       // Current Sec Field in data for Location
  75. #define LOC_FF_FLD      0       // Current Frame Field in data for Location
  76. #define LOCKDORFLD      4       // Door Field in param for Lock/Unlock Door
  77. #define READLOWFLD      5       // Sector Count Low Field in param for Read
  78. #define READHI_FLD      6       // Sector Count High Field in param for Read
  79. #define READ_MMFLD      9       // Start Min Field in param for Play Audio
  80. #define READ_SSFLD      8       // Start Sec Field in param for Play Audio
  81. #define READ_FFFLD      7       // Start Frame Field in param for Play Audio
  82. #define READ_00FLD     10       // Start Null Field in param for Play Audio
  83. #define READRESFLD     11       // Reserved Field in param for Read
  84. #define READ_1_FLD     12       // Interleave Size Field in param for Read
  85. #define READ_2_FLD     13       // Interleave Skip Field in param for Read
  86. #define SEEK_MMFLD      7       // Start Min Field in param for Seek
  87. #define SEEK_SSFLD      6       // Start Sec Field in param for Seek
  88. #define SEEK_FFFLD      5       // Start Frame Field in param for Seek
  89. #define SEEK_00FLD      8       // Start Null Field in param for Seek
  90. #define STARTMMFLD      7       // Start Min Field in param for Play Audio
  91. #define STARTSSFLD      6       // Start Sec Field in param for Play Audio
  92. #define STARTFFFLD      5       // Start Frame Field in param for Play Audio
  93. #define START00FLD      8       // Start Null Field in param for Play Audio
  94. #define STATAUDFLD      1       // Audio Field in param for Device Status
  95. #define STATDRVFLD      0       // Drive Field in param for Device Status
  96. #define TRACKFIELD      4       // Track Number Field in param for Track Info
  97. #define TRKSTATFLD      4       // Track Status Field in data for Track Info
  98. #define TRACKMMFLD      2       // Start Min Field in data for Track Info
  99. #define TRACKSSFLD      1       // Start Sec Field in data for Track Info
  100. #define TRACKFFFLD      0       // Start Frame Field in data for Track Info
  101. #define TRCKLOWFLD      0       // Low Track Number Field in data for Disk Info
  102. #define TRCKHI_FLD      1       // High Track Number Field in data for Disk Info
  103. #define TRCKENDADR      2       // End Track Address Field in data for Disk Info
  104. #define TRENDMMFLD      4       // End Track Min Field in data for Disk Info
  105. #define TRENDSSFLD      3       // End Track Sec Field in data for Disk Info
  106. #define TRENDFFFLD      2       // End Track Frame Field in data for Disk Info
  107. #define VOL_LT_FLD      1       // Left Volume Field in data for Audio Channel
  108. #define VOL_RT_FLD      3       // Right Volume Field in data for Audio Channel
  109. #define CD_UPC_FLD      1       // UPC Field in data for UPC Code Info
  110.  
  111.  
  112. /*** Array lengths for data[] and param[] structures used in IOCTLs ***/
  113.  
  114. #define STANDRD_DMAX    0       // Standard length for Data, length of NULL
  115. #define STANDRD_PMAX    4       // Standard length for Param, length of "CD01"
  116. #define IDCDROM_DMAX    4       // Max range for data in Identify CD-ROM
  117. #define DSKTRCK_DMAX    6       // Max range for data in Disk and Track Info
  118. #define DSKTRCK_PMAX    5       // Max range for param in Disk and Track Info
  119. #define LOCATON_DMAX   10       // Max range for data in Location IOCTL call
  120. #define LOCATON_PMAX    5       // Max range for param in Location IOCTL call
  121. #define LOCKDOR_PMAX    5       // Max range for param in Lock Door IOCTL call
  122. #define READAUD_PMAX   14       // Max range for param in Read Audio
  123. #define PLAYAUD_PMAX   13       // Max range for param in Play Audio
  124. #define SEEKSTATDMAX    4       // Max range for data in Seek & Status call
  125. #define SEEKSTATPMAX    9       // Max range for param in Seek & Status call
  126. #define AUDSTAT_DMAX   10       // Max range for data in Audio Status Info.
  127. #define QVOLUME_DMAX    8       // Max range for data in Audio Channel Info.
  128. #define UPCINFO_DMAX   10       // Max range for data in UPC Code Info.
  129.  
  130.  
  131. /*** Values used for function and category IDs used in IOCTLs ***/
  132.  
  133. #define CDDRIVE_CAT  0x80       // CD drive and disk category IOCTL calls
  134. #define RESET_DRIVE  0x40       // Reset CD-ROM Drive
  135. #define EJECT__DISK  0x44       // Eject CD Disc
  136. #define LOCK___DOOR  0x46       // Lock / Unlock Door
  137. #define SEEK_POSITN  0x50       // Seek to a position
  138. #define DEV__STATUS  0x60       // Device Status Information
  139. #define ID___CD_ROM  0x61       // Identify CD-ROM Driver
  140. #define Q__LOCATION  0x70       // Query Location
  141. #define READ__AUDIO  0x72       // Read Audio
  142. #define CD_UPC_INFO  0x79       // UPC of the CD
  143.  
  144. #define CDAUDIO_CAT  0x81       // CD drive and disk category IOCTL calls
  145. #define AUD_CH_CTRL  0x40       // Set Audio Channel Control
  146. #define PLAY__AUDIO  0x50       // Play Audio
  147. #define STOP__AUDIO  0x51       // Stop Audio
  148. #define RESUMEAUDIO  0x52       // Resume Audio
  149. #define AUD_CH_INFO  0x60       // Query Audio Channel Info
  150. #define DISK___INFO  0x61       // Audio Disk Information
  151. #define TRACK__INFO  0x62       // Audio Track Information
  152. #define AUD__STATUS  0x65       // Audio Status Information
  153.  
  154.  
  155. /*********************************************************************/
  156. /*  TIME Conversions Macros                                          */
  157. /*********************************************************************/
  158. #define REDBOOK2TOMM(value)   (((((value) & 0x00FF0000) >> 16) * 60 * 3000) + \
  159.                                ((((value) & 0x0000FF00) >>  8) * 3000) + \
  160.                                 (((value) & 0x000000FF) * 3000/75))
  161.  
  162.   /* The +20 is used for rounding purposes.  It is derived by:           */
  163.   /*   1/2 * ((300 MMTIME/SEC / (75 FRAMES/SEC)) = 20 MMTIME/HALF-FRAME  */
  164. #define REDBOOK2FROMMM(value) ((((value)+20) >= 0x100*60*3000) ? 0L : \
  165.                               (((((value)+20) / (60*3000)) << 16) | \
  166.                                 (((value)+20) % (60*3000) / 3000 << 8) | \
  167.                                 (((value)+20) / (3000/75) % 75)))
  168.  
  169.  
  170. typedef struct
  171. {
  172.    ULONG     ulEvent;                     // event in MMTIME
  173.    HWND      hwndCallback;                // call back window address
  174.    USHORT    usUserParm;                  // Passed in user parameter
  175. } CUEPOINT_REC;
  176.  
  177. /**** Instance structure ****/
  178.  
  179. struct instance_state
  180. {
  181.    HFILE      hDrive;                      // drive handle
  182.    CHAR       Drive,                       // Drive letter
  183.               szModel[MODEL_SIZE];         // Model name
  184.    USHORT     usHWType,                    // Hardware Type
  185.               usPlayFlag;                  // Play flag, acts as semaphore
  186.    USHORT     usDeviceID;                  // Logical device ID from MDM
  187.    HMTX       hIOSem,                      // semaphore for IOCTLs
  188.               hInstSem;                    // semaphore for instance table
  189.    HEV        hReturnSem,                  // lets hInstSem be released
  190.               hTimeLoopSem;                // block polling while not active
  191.    MCI_CD_ID  DiscID;                      // CD disc ID
  192.    ULONG      ulCurPos,                    // logical current position
  193.               ulEndPos;                    // end play position
  194.    CUEPOINT_REC  qptPosAdvise,             // Position Advise Frequency
  195.               arrCuePoint[CDMCD_CUEPOINT_MAX];      // Cue Point records
  196.    ULONG      ulCDMCDID;                   // CD MCD ID for instance
  197.    PFNCDMCD   pCDMCDReturn;                // Addr of CD MCD Return function
  198.    BYTE       StreamMaster;                // Master in sync group, TRUE/FALSE
  199.    PVOID      pSyncInst;                   // Sync handle
  200.    GID        GroupID;                     // Sync group
  201.    SYNC_EVCB  evcbSync;                    // Sync event control block
  202.    PARM_EVENT RptEvent;                    // Event reporting parameter
  203.    PFN        pSyncNotify;                 // Notify sync pulse function
  204.    ULONG      ulPlayTID;                   // Play thread ID
  205.    HWND       hwndPlayCallback;            // PM call back handle for MCI_PLAY
  206.    USHORT     usPlayUserParm;              // User Parm for Play command
  207.    USHORT     usPlayNotify;                // Play notify flag
  208. };
  209.  
  210. typedef struct instance_state *PINST;
  211.  
  212.  
  213. /* Prototypes */
  214. /* ibmcdrom.c */
  215. static ULONG process_msg(PINST, USHORT, ULONG *, PVOID, USHORT);
  216. static ULONG CDAudClose(PINST, ULONG);
  217. static ULONG CDAudErrRecov(PINST);
  218. static ULONG CDAudInfo(PINST, ULONG, MCI_INFO_PARMS *);
  219. static ULONG CDAudOpen(ULONG, MMDRV_OPEN_PARMS *);
  220.        ULONG CDAudRegDisc(PINST, USHORT, MCI_CD_REGDISC_PARMS *);
  221. static ULONG CDAudRegDrive(PINST, MCI_CD_REGDRIVE_PARMS *);
  222. static ULONG CDAudSet(PINST, ULONG *, MCI_SET_PARMS *);
  223. static ULONG CDAudSetVerify(ULONG);
  224. static ULONG CDAudStatus(PINST, ULONG, MCI_STATUS_PARMS *);
  225.        ULONG CDAudStatCVol(ULONG *);
  226.  
  227. /* ibmcdpro.c */
  228. ULONG CD01_Cue(PINST);
  229. ULONG CD01_CuePoint(PINST, ULONG, MCI_CUEPOINT_PARMS *);
  230. ULONG CD01_GetCaps(ULONG, MCI_GETDEVCAPS_PARMS *);
  231. ULONG CD01_GetDiscInfo(PINST, ULONG, MCI_STATUS_PARMS *);
  232. ULONG CD01_GetID(PINST, MCI_CD_ID *, BYTE *, BYTE *);
  233. ULONG CD01_GetPosition(PINST, ULONG *);
  234. ULONG CD01_GetState(PINST, MCI_STATUS_PARMS *);
  235. ULONG CD01_GetTOC(PINST, MCI_TOC_PARMS *);
  236. ULONG CD01_GetVolume(PINST, ULONG *);
  237. ULONG CD01_LockDoor(PINST, USHORT);
  238. ULONG CD01_Open(PINST);
  239. ULONG CD01_Play(PINST, ULONG *, ULONG, ULONG, USHORT, HWND);
  240. ULONG CD01_PlayCont(PINST, ULONG, ULONG);
  241. ULONG CD01_PosAdvise(PINST, ULONG, MCI_POSITION_PARMS *);
  242. ULONG CD01_RegTracks(PINST, MCI_CD_REGTRACKS_PARMS *);
  243. ULONG CD01_Restore(PINST, MCIDRV_CD_SAVE_PARMS *);
  244. ULONG CD01_Resume(PINST);
  245. ULONG CD01_Save(PINST, MCIDRV_CD_SAVE_PARMS *);
  246. ULONG CD01_Seek(PINST, ULONG);
  247. ULONG CD01_SetVolume(PINST, ULONG);
  248. ULONG CD01_Stop(PINST, USHORT);
  249.  
  250. /* ibmcdmsc.c */
  251. ULONG CD01_StartPlay(PINST);
  252. ULONG CD01_Sync(PINST, ULONG, MCIDRV_SYNC_PARMS *);
  253. ULONG CD01_Timer(PINST);
  254. ULONG CD01_TimerNotify(PINST, ULONG *, ULONG *, ULONG *);
  255. VOID  GetTableName(CHAR *);
  256. ULONG OpenFirstTime(PINST);
  257. VOID  QueryTable(PINST);
  258. ULONG CallIOCtl(PINST, ULONG, ULONG, PVOID, ULONG, ULONG *,
  259.                                      PVOID, ULONG, ULONG *);
  260.  
  261. /* cdmccomn.c */
  262.        VOID   parse_DevParm(CHAR *, CHAR **, CHAR **);
  263. static CHAR * get_token(CHAR *);
  264.  
  265.