cdrom_internals.h
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:7k
源码类别:

midi

开发平台:

Unix_Linux

  1. /****************************************************************************
  2.  * cdrom_internals.h: cdrom tools private header
  3.  *****************************************************************************
  4.  * Copyright (C) 1998-2001 the VideoLAN team
  5.  * $Id: 941c83b614a9b9980b885efa8682a850dbde8cc5 $
  6.  *
  7.  * Authors: Johan Bilien <jobi@via.ecp.fr>
  8.  *          Gildas Bazin <gbazin@netcourrier.com>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * The vcddev structure
  26.  *****************************************************************************/
  27. struct vcddev_s
  28. {
  29.     char   *psz_dev;                                      /* vcd device name */
  30.     /* Section used in vcd image mode */
  31.     int    i_vcdimage_handle;                   /* vcd image file descriptor */
  32.     int    i_tracks;                          /* number of tracks of the vcd */
  33.     int    *p_sectors;                           /* tracks layout on the vcd */
  34.     /* Section used in vcd device mode */
  35. #ifdef WIN32
  36.     HANDLE h_device_handle;                         /* vcd device descriptor */
  37.     long  hASPI;
  38.     short i_sid;
  39.     long  (*lpSendCommand)( void* );
  40. #else
  41.     int    i_device_handle;                         /* vcd device descriptor */
  42. #endif
  43. };
  44. /*****************************************************************************
  45.  * Misc. Macros
  46.  *****************************************************************************/
  47. /* LBA = msf.frame + 75 * ( msf.second + 60 * msf.minute ) */
  48. #define MSF_TO_LBA(min, sec, frame) ((int)frame + 75 * (sec + 60 * min))
  49. /* LBA = msf.frame + 75 * ( msf.second - 2 + 60 * msf.minute ) */
  50. #define MSF_TO_LBA2(min, sec, frame) ((int)frame + 75 * (sec -2 + 60 * min))
  51. #ifndef O_BINARY
  52. #   define O_BINARY 0
  53. #endif
  54. #define VCDDEV_T 1
  55. /*****************************************************************************
  56.  * Platform specifics
  57.  *****************************************************************************/
  58. #if defined( __APPLE__ )
  59. #define darwin_freeTOC( p ) free( (void*)p )
  60. #define CD_MIN_TRACK_NO 01
  61. #define CD_MAX_TRACK_NO 99
  62. #endif
  63. #if defined( WIN32 )
  64. /* Win32 DeviceIoControl specifics */
  65. #ifndef MAXIMUM_NUMBER_TRACKS
  66. #    define MAXIMUM_NUMBER_TRACKS 100
  67. #endif
  68. typedef struct _TRACK_DATA {
  69.     UCHAR Reserved;
  70.     UCHAR Control : 4;
  71.     UCHAR Adr : 4;
  72.     UCHAR TrackNumber;
  73.     UCHAR Reserved1;
  74.     UCHAR Address[4];
  75. } TRACK_DATA, *PTRACK_DATA;
  76. typedef struct _CDROM_TOC {
  77.     UCHAR Length[2];
  78.     UCHAR FirstTrack;
  79.     UCHAR LastTrack;
  80.     TRACK_DATA TrackData[MAXIMUM_NUMBER_TRACKS];
  81. } CDROM_TOC, *PCDROM_TOC;
  82. typedef enum _TRACK_MODE_TYPE {
  83.     YellowMode2,
  84.     XAForm2,
  85.     CDDA
  86. } TRACK_MODE_TYPE, *PTRACK_MODE_TYPE;
  87. typedef struct __RAW_READ_INFO {
  88.     LARGE_INTEGER DiskOffset;
  89.     ULONG SectorCount;
  90.     TRACK_MODE_TYPE TrackMode;
  91. } RAW_READ_INFO, *PRAW_READ_INFO;
  92. typedef struct _CDROM_READ_TOC_EX {
  93.   UCHAR  Format : 4;
  94.   UCHAR  Reserved1 : 3;
  95.   UCHAR  Msf : 1;
  96.   UCHAR  SessionTrack;
  97.   UCHAR  Reserved2;
  98.   UCHAR  Reserved3;
  99. } CDROM_READ_TOC_EX, *PCDROM_READ_TOC_EX;
  100. #ifndef IOCTL_CDROM_BASE
  101. #    define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM
  102. #endif
  103. #ifndef IOCTL_CDROM_READ_TOC
  104. #    define IOCTL_CDROM_READ_TOC CTL_CODE(IOCTL_CDROM_BASE, 0x0000, 
  105.                                           METHOD_BUFFERED, FILE_READ_ACCESS)
  106. #endif
  107. #ifndef IOCTL_CDROM_RAW_READ
  108. #define IOCTL_CDROM_RAW_READ CTL_CODE(IOCTL_CDROM_BASE, 0x000F, 
  109.                                       METHOD_OUT_DIRECT, FILE_READ_ACCESS)
  110. #endif
  111. #define IOCTL_CDROM_READ_TOC_EX CTL_CODE(IOCTL_CDROM_BASE, 0x0015, 
  112.                                          METHOD_BUFFERED, FILE_READ_ACCESS)
  113. #define MINIMUM_CDROM_READ_TOC_EX_SIZE    2
  114. #define CDROM_READ_TOC_EX_FORMAT_CDTEXT   0x05
  115. /* Win32 aspi specific */
  116. #define WIN_NT               ( GetVersion() < 0x80000000 )
  117. #define ASPI_HAID           0
  118. #define ASPI_TARGET         0
  119. #define DTYPE_CDROM         0x05
  120. #define SENSE_LEN           0x0E
  121. #define SC_GET_DEV_TYPE     0x01
  122. #define SC_EXEC_SCSI_CMD    0x02
  123. #define SC_GET_DISK_INFO    0x06
  124. #define SS_COMP             0x01
  125. #define SS_PENDING          0x00
  126. #define SS_NO_ADAPTERS      0xE8
  127. #define SRB_DIR_IN          0x08
  128. #define SRB_DIR_OUT         0x10
  129. #define SRB_EVENT_NOTIFY    0x40
  130. #define READ_CD 0xbe
  131. #define READ_TOC 0x43
  132. #define READ_TOC_FORMAT_TOC 0x0
  133. #pragma pack(1)
  134. struct SRB_GetDiskInfo
  135. {
  136.     unsigned char   SRB_Cmd;
  137.     unsigned char   SRB_Status;
  138.     unsigned char   SRB_HaId;
  139.     unsigned char   SRB_Flags;
  140.     unsigned long   SRB_Hdr_Rsvd;
  141.     unsigned char   SRB_Target;
  142.     unsigned char   SRB_Lun;
  143.     unsigned char   SRB_DriveFlags;
  144.     unsigned char   SRB_Int13HDriveInfo;
  145.     unsigned char   SRB_Heads;
  146.     unsigned char   SRB_Sectors;
  147.     unsigned char   SRB_Rsvd1[22];
  148. };
  149. struct SRB_GDEVBlock
  150. {
  151.     unsigned char SRB_Cmd;
  152.     unsigned char SRB_Status;
  153.     unsigned char SRB_HaId;
  154.     unsigned char SRB_Flags;
  155.     unsigned long SRB_Hdr_Rsvd;
  156.     unsigned char SRB_Target;
  157.     unsigned char SRB_Lun;
  158.     unsigned char SRB_DeviceType;
  159.     unsigned char SRB_Rsvd1;
  160. };
  161. struct SRB_ExecSCSICmd
  162. {
  163.     unsigned char   SRB_Cmd;
  164.     unsigned char   SRB_Status;
  165.     unsigned char   SRB_HaId;
  166.     unsigned char   SRB_Flags;
  167.     unsigned long   SRB_Hdr_Rsvd;
  168.     unsigned char   SRB_Target;
  169.     unsigned char   SRB_Lun;
  170.     unsigned short  SRB_Rsvd1;
  171.     unsigned long   SRB_BufLen;
  172.     unsigned char   *SRB_BufPointer;
  173.     unsigned char   SRB_SenseLen;
  174.     unsigned char   SRB_CDBLen;
  175.     unsigned char   SRB_HaStat;
  176.     unsigned char   SRB_TargStat;
  177.     unsigned long   *SRB_PostProc;
  178.     unsigned char   SRB_Rsvd2[20];
  179.     unsigned char   CDBByte[16];
  180.     unsigned char   SenseArea[SENSE_LEN+2];
  181. };
  182. #pragma pack()
  183. #endif /* WIN32 */
  184. #define SECTOR_TYPE_MODE2_FORM2 0x14
  185. #define SECTOR_TYPE_CDDA 0x04
  186. #define READ_CD_RAW_MODE2 0xF0
  187. #define READ_CD_USERDATA 0x10
  188. /*****************************************************************************
  189.  * Local Prototypes
  190.  *****************************************************************************/
  191. static int    OpenVCDImage( vlc_object_t *, const char *, struct vcddev_s * );
  192. static void   CloseVCDImage( vlc_object_t *, struct vcddev_s * );
  193. #if defined( __APPLE__ )
  194. static CDTOC *darwin_getTOC( vlc_object_t *, const struct vcddev_s * );
  195. static int    darwin_getNumberOfTracks( CDTOC *, int );
  196. #elif defined( WIN32 )
  197. static int    win32_vcd_open( vlc_object_t *, const char *, struct vcddev_s *);
  198. #endif