home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional Developers Kit 1992 November / Disc01 / Disc01.mdf / runnable / mmos2 / mmtoolkt / samples / cdmct / ibmcdrom.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-06  |  14.5 KB  |  262 lines

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