libcdio-paranoia  10.2+0.90
cdda.h
Go to the documentation of this file.
00001 /*
00002   Copyright (C) 2004, 2005, 2006, 2008, 2011, 2012
00003   Rocky Bernstein <rocky@gnu.org>
00004   Copyright (C) 2001 Xiph.org and Heiko Eissfeldt heiko@escape.colossus.de
00005   CopyPolicy: GNU Lesser General Public License 2.1 applies
00006 */
00007 
00015 #ifndef CDIO__PARANOIA__CDDA_H_
00016 #define CDIO__PARANOIA__CDDA_H_
00017 
00018 #include <cdio/cdio.h>
00019 
00020 #ifdef __cplusplus
00021 extern "C" {
00022 #endif /* __cplusplus */
00023 
00027   typedef struct cdrom_paranoia_s cdrom_paranoia_t;
00028   typedef struct cdrom_drive_s   cdrom_drive_t;
00029   
00041   typedef enum {
00042     CDDA_MESSAGE_FORGETIT = 0,
00043     CDDA_MESSAGE_PRINTIT  = 1,
00044     CDDA_MESSAGE_LOGIT    = 2,
00045     CD_FRAMESAMPLES       = CDIO_CD_FRAMESIZE_RAW / 4,
00046     MAXTRK                = (CDIO_CD_MAX_TRACKS+1)
00047   } paranoia_cdda_enums_t;
00048   
00049 
00050 #include <signal.h>
00051 
00055 #define MAXTRK (CDIO_CD_MAX_TRACKS+1)
00056 
00058 typedef struct TOC_s {  
00059   unsigned char bTrack;
00060   int32_t       dwStartSector;
00061 } TOC_t;
00062 
00064 #define TOC TOC_t
00065 
00067 struct cdrom_drive_s {
00068 
00069   CdIo_t *p_cdio;
00070   int opened; 
00072   char *cdda_device_name;
00073 
00074   char *drive_model;
00075   int drive_type;
00076   int bigendianp; 
00080   int nsectors;   
00084   int cd_extra;   
00090   bool b_swap_bytes;  
00093   track_t tracks;
00094   TOC_t disc_toc[MAXTRK]; 
00099   lsn_t audio_first_sector;
00100   lsn_t audio_last_sector;
00101 
00102   int errordest;
00103   int messagedest;
00104   char *errorbuf;
00105   char *messagebuf;
00106 
00107   /* functions specific to particular drives/interfaces */
00108 
00109   int  (*enable_cdda)  (cdrom_drive_t *d, int onoff);
00110   int  (*read_toc)     (cdrom_drive_t *d);
00111   long (*read_audio)   (cdrom_drive_t *d, void *p, lsn_t begin, 
00112                        long sectors);
00113   int  (*set_speed)    (cdrom_drive_t *d, int speed);
00114   int error_retry;
00115   int report_all;
00116 
00117   int is_atapi;
00118   int is_mmc;
00119 
00120   int i_test_flags; 
00125 };
00126 
00127 
00136   typedef enum {
00137     CDDA_TEST_JITTER_SMALL   = 1,
00138     CDDA_TEST_JITTER_LARGE   = 2,
00139     CDDA_TEST_JITTER_MASSIVE = 3,
00140     CDDA_TEST_FRAG_SMALL     = (1<<3),
00141     CDDA_TEST_FRAG_LARGE     = (2<<3),
00142     CDDA_TEST_FRAG_MASSIVE   = (3<<3),
00143     CDDA_TEST_UNDERRUN       = 64 
00144   } paranoia_jitter_t;
00145   
00155 #define CDDA_TEST_ALWAYS_JITTER     4 
00156 
00158 #define CDDA_TEST_FRAG_SMALL   (1<<3)
00159 #define CDDA_TEST_FRAG_LARGE   (2<<3)
00160 #define CDDA_TEST_FRAG_MASSIVE (3<<3)
00161 
00163 #define CDDA_TEST_UNDERRUN         64 
00164 
00165 #if TESTING_IS_FINISHED
00166 
00168 #define CDDA_TEST_SCRATCH         128
00169 #undef  CDDA_TEST_BOGUS_BYTES     256
00170 #undef  CDDA_TEST_DROPDUPE_BYTES  512
00171 #endif /* TESTING_IS_FINISHED */
00172 
00179 extern cdrom_drive_t *cdio_cddap_find_a_cdrom(int messagedest, 
00180                                               char **ppsz_message);
00181 
00186 extern cdrom_drive_t *cdio_cddap_identify(const char *psz_device, 
00187                                           int messagedest, 
00188                                           char **ppsz_message);
00189 
00196 cdrom_drive_t *cdio_cddap_identify_cdio(CdIo_t *p_cdio, 
00197                                         int messagedest, char **ppsz_messages);
00198 
00201 extern int     cdio_cddap_speed_set(cdrom_drive_t *d, int speed);
00202 extern void    cdio_cddap_verbose_set(cdrom_drive_t *d, int err_action, 
00203                                       int mes_action);
00204 extern char   *cdio_cddap_messages(cdrom_drive_t *d);
00205 extern char   *cdio_cddap_errors(cdrom_drive_t *d);
00206 
00217 bool cdio_cddap_close_no_free_cdio(cdrom_drive_t *d);
00218 
00229 extern int     cdio_cddap_close(cdrom_drive_t *d);
00230 
00231 extern int     cdio_cddap_open(cdrom_drive_t *d);
00232 
00233 extern long    cdio_cddap_read(cdrom_drive_t *d, void *p_buffer,
00234                                lsn_t beginsector, long sectors);
00235 
00237 extern lsn_t   cdio_cddap_track_firstsector(cdrom_drive_t *d, 
00238                                       track_t i_track);
00239 
00242 extern lsn_t   cdio_cddap_track_lastsector(cdrom_drive_t *d, track_t i_track);
00243 
00245 extern track_t cdio_cddap_tracks(cdrom_drive_t *d);
00246 
00252 extern int     cdio_cddap_sector_gettrack(cdrom_drive_t *d, lsn_t lsn);
00253 
00258 extern int     cdio_cddap_track_channels(cdrom_drive_t *d, track_t i_track);
00259 
00261 extern int     cdio_cddap_track_audiop(cdrom_drive_t *d, track_t i_track);
00262 
00264 extern int     cdio_cddap_track_copyp(cdrom_drive_t *d, track_t i_track);
00265 
00269 extern int     cdio_cddap_track_preemp(cdrom_drive_t *d, track_t i_track);
00270 
00272 extern lsn_t   cdio_cddap_disc_firstsector(cdrom_drive_t *d);
00273 
00277 extern lsn_t   cdio_cddap_disc_lastsector(cdrom_drive_t *d);
00278 
00293 extern int data_bigendianp(cdrom_drive_t *d);
00294 
00297 typedef enum {
00298   TR_OK =            0,
00299   TR_EWRITE =        1  ,
00300   TR_EREAD =         2  ,
00301   TR_UNDERRUN =      3  ,
00302   TR_OVERRUN =       4  ,
00303   TR_ILLEGAL =       5  ,
00304   TR_MEDIUM =        6  ,
00305   TR_BUSY =          7  ,
00306   TR_NOTREADY =      8  ,
00307   TR_FAULT =         9  ,
00308   TR_UNKNOWN =      10  ,
00309   TR_STREAMING =    11  ,
00310 } transport_error_t;
00311   
00312 
00313 #ifdef NEED_STRERROR_TR
00314 const char *strerror_tr[]={
00315   "Success",
00316   "Error writing packet command to device",
00317   "Error reading command from device",
00318   "SCSI packet data underrun (too little data)",
00319   "SCSI packet data overrun (too much data)",
00320   "Illegal SCSI request (rejected by target)",
00321   "Medium reading data from medium",
00322   "Device busy",
00323   "Device not ready",
00324   "Target hardware fault",
00325   "Unspecified error",
00326   "Drive lost streaming"
00327 };
00328 #endif /*NEED_STERROR_TR*/
00329 
00359 #ifndef DO_NOT_WANT_PARANOIA_COMPATIBILITY
00360 
00361 #define cdda_find_a_cdrom       cdio_cddap_find_a_cdrom
00362 #define cdda_identify           cdio_cddap_identify
00363 #define cdda_speed_set          cdio_cddap_speed_set
00364 #define cdda_verbose_set        cdio_cddap_verbose_set
00365 #define cdda_messages           cdio_cddap_messages
00366 #define cdda_errors             cdio_cddap_errors
00367 #define cdda_close              cdio_cddap_close
00368 #define cdda_open               cdio_cddap_open
00369 #define cdda_read               cdio_cddap_read
00370 #define cdda_track_firstsector  cdio_cddap_track_firstsector 
00371 #define cdda_track_lastsector   cdio_cddap_track_lastsector 
00372 #define cdda_tracks             cdio_cddap_tracks 
00373 #define cdda_sector_gettrack    cdio_cddap_sector_gettrack  
00374 #define cdda_track_channels     cdio_cddap_track_channels
00375 #define cdda_track_audiop       cdio_cddap_track_audiop
00376 #define cdda_track_copyp        cdio_cddap_track_copyp
00377 #define cdda_track_preemp       cdio_cddap_track_preemp
00378 #define cdda_disc_firstsector   cdio_cddap_disc_firstsector
00379 #define cdda_disc_lastsector    cdio_cddap_disc_lastsector
00380 #define cdrom_drive             cdrom_drive_t
00381 
00382 #endif /*DO_NOT_WANT_PARANOIA_COMPATIBILITY*/
00383 
00384 #ifdef __cplusplus
00385 }
00386 #endif /* __cplusplus */
00387 
00394 extern paranoia_jitter_t     debug_paranoia_jitter;
00395 extern paranoia_cdda_enums_t debug_paranoia_cdda_enums;
00396 
00397 #endif /*CDIO__PARANOIA__CDDA_H_*/
00398