1 | /****************************************************************** |
2 | * CopyPolicy: GNU Lesser General Public License 2.1 applies |
3 | * Copyright (C) 2001-2008 Xiph.org |
4 | * Original version by Heiko Eissfeldt heiko@escape.colossus.de |
5 | * |
6 | * Toplevel interface header; applications include this |
7 | * |
8 | ******************************************************************/ |
9 | |
10 | #ifndef _cdda_interface_h_ |
11 | #define _cdda_interface_h_ |
12 | |
13 | #ifndef CD_FRAMESIZE |
14 | #define CD_FRAMESIZE 2048 |
15 | #endif |
16 | #ifndef CD_FRAMESIZE_RAW |
17 | #define CD_FRAMESIZE_RAW 2352 |
18 | #endif |
19 | #define CD_FRAMESAMPLES (CD_FRAMESIZE_RAW / 4) |
20 | |
21 | #include <sys/types.h> |
22 | #include <signal.h> |
23 | |
24 | #define MAXTRK 100 |
25 | |
26 | typedef struct TOC { /* structure of table of contents */ |
27 | unsigned char bFlags; |
28 | unsigned char bTrack; |
29 | int32_t dwStartSector; |
30 | } TOC; |
31 | |
32 | /* interface types */ |
33 | #define GENERIC_SCSI 0 |
34 | #define COOKED_IOCTL 1 |
35 | #define TEST_INTERFACE 2 |
36 | #define SGIO_SCSI 3 |
37 | #define SGIO_SCSI_BUGGY1 4 |
38 | |
39 | #define CDDA_MESSAGE_FORGETIT 0 |
40 | #define CDDA_MESSAGE_PRINTIT 1 |
41 | #define CDDA_MESSAGE_LOGIT 2 |
42 | |
43 | /* cdrom access function pointer */ |
44 | |
45 | typedef struct cdda_private_data cdda_private_data_t; |
46 | |
47 | typedef struct cdrom_drive{ |
48 | |
49 | int opened; /* This struct may just represent a candidate for opening */ |
50 | |
51 | char *cdda_device_name; |
52 | char *ioctl_device_name; |
53 | |
54 | int cdda_fd; |
55 | int ioctl_fd; |
56 | |
57 | char *drive_model; |
58 | int drive_type; |
59 | int interface; |
60 | int bigendianp; |
61 | int nsectors; |
62 | |
63 | int ; |
64 | int tracks; |
65 | TOC disc_toc[MAXTRK]; |
66 | long audio_first_sector; |
67 | long audio_last_sector; |
68 | |
69 | int errordest; |
70 | int messagedest; |
71 | char *errorbuf; |
72 | char *messagebuf; |
73 | |
74 | /* functions specific to particular drives/interfaces */ |
75 | |
76 | int (*enable_cdda) (struct cdrom_drive *d, int onoff); |
77 | int (*read_toc) (struct cdrom_drive *d); |
78 | long (*read_audio) (struct cdrom_drive *d, void *p, long begin, |
79 | long sectors); |
80 | int (*set_speed) (struct cdrom_drive *d, int speed); |
81 | int error_retry; |
82 | int report_all; |
83 | |
84 | int is_atapi; |
85 | int is_mmc; |
86 | |
87 | cdda_private_data_t *private_data; |
88 | void *reserved; |
89 | unsigned char inqbytes[4]; |
90 | |
91 | /* Scsi parameters and state */ |
92 | unsigned char density; |
93 | unsigned char orgdens; |
94 | unsigned int orgsize; |
95 | long bigbuff; |
96 | int adjust_ssize; |
97 | |
98 | int fua; |
99 | int lun; |
100 | |
101 | sigset_t sigset; |
102 | |
103 | } cdrom_drive; |
104 | |
105 | #define IS_AUDIO(d,i) (!(d->disc_toc[i].bFlags & 0x04)) |
106 | |
107 | /******** Identification/autosense functions */ |
108 | |
109 | extern cdrom_drive *cdda_find_a_cdrom(int messagedest, char **message); |
110 | extern cdrom_drive *cdda_identify(const char *device, int messagedest, |
111 | char **message); |
112 | extern cdrom_drive *cdda_identify_cooked(const char *device,int messagedest, |
113 | char **message); |
114 | extern cdrom_drive *cdda_identify_scsi(const char *generic_device, |
115 | const char *ioctl_device, |
116 | int messagedest, char **message); |
117 | #ifdef CDDA_TEST |
118 | extern cdrom_drive *cdda_identify_test(const char *filename, |
119 | int messagedest, char **message); |
120 | #endif |
121 | |
122 | /******** Drive oriented functions */ |
123 | |
124 | extern char *cdda_version(); |
125 | extern int cdda_speed_set(cdrom_drive *d, int speed); |
126 | extern void cdda_verbose_set(cdrom_drive *d,int err_action, int mes_action); |
127 | extern char *cdda_messages(cdrom_drive *d); |
128 | extern char *cdda_errors(cdrom_drive *d); |
129 | |
130 | extern int cdda_close(cdrom_drive *d); |
131 | extern int cdda_open(cdrom_drive *d); |
132 | extern long cdda_read(cdrom_drive *d, void *buffer, |
133 | long beginsector, long sectors); |
134 | extern long cdda_read_timed(cdrom_drive *d, void *buffer, |
135 | long beginsector, long sectors, int *milliseconds); |
136 | |
137 | extern long cdda_track_firstsector(cdrom_drive *d,int track); |
138 | extern long cdda_track_lastsector(cdrom_drive *d,int track); |
139 | extern long cdda_tracks(cdrom_drive *d); |
140 | extern int cdda_sector_gettrack(cdrom_drive *d,long sector); |
141 | extern int cdda_track_channels(cdrom_drive *d,int track); |
142 | extern int cdda_track_audiop(cdrom_drive *d,int track); |
143 | extern int cdda_track_copyp(cdrom_drive *d,int track); |
144 | extern int cdda_track_preemp(cdrom_drive *d,int track); |
145 | extern long cdda_disc_firstsector(cdrom_drive *d); |
146 | extern long cdda_disc_lastsector(cdrom_drive *d); |
147 | |
148 | /* transport errors: */ |
149 | |
150 | #define TR_OK 0 |
151 | #define TR_EWRITE 1 /* Error writing packet command (transport) */ |
152 | #define TR_EREAD 2 /* Error reading packet data (transport) */ |
153 | #define TR_UNDERRUN 3 /* Read underrun */ |
154 | #define TR_OVERRUN 4 /* Read overrun */ |
155 | #define TR_ILLEGAL 5 /* Illegal/rejected request */ |
156 | #define TR_MEDIUM 6 /* Medium error */ |
157 | #define TR_BUSY 7 /* Device busy */ |
158 | #define TR_NOTREADY 8 /* Device not ready */ |
159 | #define TR_FAULT 9 /* Devive failure */ |
160 | #define TR_UNKNOWN 10 /* Unspecified error */ |
161 | #define TR_STREAMING 11 /* loss of streaming */ |
162 | |
163 | static char *strerror_tr[]={ |
164 | "Success" , |
165 | "Error writing packet command to device" , |
166 | "Error reading command from device" , |
167 | "SCSI packet data underrun (too little data)" , |
168 | "SCSI packet data overrun (too much data)" , |
169 | "Illegal SCSI request (rejected by target)" , |
170 | "Medium reading data from medium" , |
171 | "Device busy" , |
172 | "Device not ready" , |
173 | "Target hardware fault" , |
174 | "Unspecified error" , |
175 | "Drive lost streaming" |
176 | }; |
177 | |
178 | /* Errors returned by lib: |
179 | |
180 | 001: Unable to set CDROM to read audio mode |
181 | 002: Unable to read table of contents lead-out |
182 | 003: CDROM reporting illegal number of tracks |
183 | 004: Unable to read table of contents header |
184 | 005: Unable to read table of contents entry |
185 | 006: Could not read any data from drive |
186 | 007: Unknown, unrecoverable error reading data |
187 | 008: Unable to identify CDROM model |
188 | 009: CDROM reporting illegal table of contents |
189 | 010: Unaddressable sector |
190 | |
191 | 100: Interface not supported |
192 | 101: Drive is neither a CDROM nor a WORM device |
193 | 102: Permision denied on cdrom (ioctl) device |
194 | 103: Permision denied on cdrom (data) device |
195 | |
196 | 300: Kernel memory error |
197 | |
198 | 400: Device not open |
199 | 401: Invalid track number |
200 | 402: Track not audio data |
201 | 403: No audio tracks on disc |
202 | 404: No medium present |
203 | 405: Option not supported by drive |
204 | |
205 | */ |
206 | #endif |
207 | |
208 | |