cdrom_internals.h
上传用户:riyaled888
上传日期:2009-03-27
资源大小:7338k
文件大小:7k
源码类别:

多媒体

开发平台:

MultiPlatform

  1. /****************************************************************************
  2.  * cdrom_internals.h: cdrom tools private header
  3.  *****************************************************************************
  4.  * Copyright (C) 1998-2001 VideoLAN
  5.  * $Id: cdrom_internals.h 6961 2004-03-05 17:34:23Z sam $
  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., 59 Temple Place - Suite 330, Boston, MA  02111, 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( SYS_DARWIN )
  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. #ifndef IOCTL_CDROM_BASE
  93. #    define IOCTL_CDROM_BASE FILE_DEVICE_CD_ROM
  94. #endif
  95. #ifndef IOCTL_CDROM_READ_TOC
  96. #    define IOCTL_CDROM_READ_TOC CTL_CODE(IOCTL_CDROM_BASE, 0x0000, 
  97.                                           METHOD_BUFFERED, FILE_READ_ACCESS)
  98. #endif
  99. #ifndef IOCTL_CDROM_RAW_READ
  100. #define IOCTL_CDROM_RAW_READ CTL_CODE(IOCTL_CDROM_BASE, 0x000F, 
  101.                                       METHOD_OUT_DIRECT, FILE_READ_ACCESS)
  102. #endif
  103. /* Win32 aspi specific */
  104. #define WIN_NT               ( GetVersion() < 0x80000000 )
  105. #define ASPI_HAID           0
  106. #define ASPI_TARGET         0
  107. #define DTYPE_CDROM         0x05
  108. #define SENSE_LEN           0x0E
  109. #define SC_GET_DEV_TYPE     0x01
  110. #define SC_EXEC_SCSI_CMD    0x02
  111. #define SC_GET_DISK_INFO    0x06
  112. #define SS_COMP             0x01
  113. #define SS_PENDING          0x00
  114. #define SS_NO_ADAPTERS      0xE8
  115. #define SRB_DIR_IN          0x08
  116. #define SRB_DIR_OUT         0x10
  117. #define SRB_EVENT_NOTIFY    0x40
  118. #define READ_CD 0xbe
  119. #define SECTOR_TYPE_MODE2_FORM2 0x14
  120. #define SECTOR_TYPE_CDDA 0x04
  121. #define READ_CD_RAW_MODE2 0xF0
  122. #define READ_CD_USERDATA 0x10
  123. #define READ_TOC 0x43
  124. #define READ_TOC_FORMAT_TOC 0x0
  125. #pragma pack(1)
  126. struct SRB_GetDiskInfo
  127. {
  128.     unsigned char   SRB_Cmd;
  129.     unsigned char   SRB_Status;
  130.     unsigned char   SRB_HaId;
  131.     unsigned char   SRB_Flags;
  132.     unsigned long   SRB_Hdr_Rsvd;
  133.     unsigned char   SRB_Target;
  134.     unsigned char   SRB_Lun;
  135.     unsigned char   SRB_DriveFlags;
  136.     unsigned char   SRB_Int13HDriveInfo;
  137.     unsigned char   SRB_Heads;
  138.     unsigned char   SRB_Sectors;
  139.     unsigned char   SRB_Rsvd1[22];
  140. };
  141. struct SRB_GDEVBlock
  142. {
  143.     unsigned char SRB_Cmd;
  144.     unsigned char SRB_Status;
  145.     unsigned char SRB_HaId;
  146.     unsigned char SRB_Flags;
  147.     unsigned long SRB_Hdr_Rsvd;
  148.     unsigned char SRB_Target;
  149.     unsigned char SRB_Lun;
  150.     unsigned char SRB_DeviceType;
  151.     unsigned char SRB_Rsvd1;
  152. };
  153. struct SRB_ExecSCSICmd
  154. {
  155.     unsigned char   SRB_Cmd;
  156.     unsigned char   SRB_Status;
  157.     unsigned char   SRB_HaId;
  158.     unsigned char   SRB_Flags;
  159.     unsigned long   SRB_Hdr_Rsvd;
  160.     unsigned char   SRB_Target;
  161.     unsigned char   SRB_Lun;
  162.     unsigned short  SRB_Rsvd1;
  163.     unsigned long   SRB_BufLen;
  164.     unsigned char   *SRB_BufPointer;
  165.     unsigned char   SRB_SenseLen;
  166.     unsigned char   SRB_CDBLen;
  167.     unsigned char   SRB_HaStat;
  168.     unsigned char   SRB_TargStat;
  169.     unsigned long   *SRB_PostProc;
  170.     unsigned char   SRB_Rsvd2[20];
  171.     unsigned char   CDBByte[16];
  172.     unsigned char   SenseArea[SENSE_LEN+2];
  173. };
  174. #pragma pack()
  175. #endif /* WIN32 */
  176. /*****************************************************************************
  177.  * Local Prototypes
  178.  *****************************************************************************/
  179. static int    OpenVCDImage( vlc_object_t *, const char *, struct vcddev_s * );
  180. static void   CloseVCDImage( vlc_object_t *, struct vcddev_s * );
  181. #if defined( SYS_DARWIN )
  182. static CDTOC *darwin_getTOC( vlc_object_t *, const struct vcddev_s * );
  183. static int    darwin_getNumberOfDescriptors( CDTOC * );
  184. static int    darwin_getNumberOfTracks( CDTOC *, int );
  185. #elif defined( WIN32 )
  186. static int    win32_vcd_open( vlc_object_t *, const char *, struct vcddev_s *);
  187. #endif