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
26typedef 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
45typedef struct cdda_private_data cdda_private_data_t;
46
47typedef 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 cd_extra;
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
109extern cdrom_drive *cdda_find_a_cdrom(int messagedest, char **message);
110extern cdrom_drive *cdda_identify(const char *device, int messagedest,
111 char **message);
112extern cdrom_drive *cdda_identify_cooked(const char *device,int messagedest,
113 char **message);
114extern cdrom_drive *cdda_identify_scsi(const char *generic_device,
115 const char *ioctl_device,
116 int messagedest, char **message);
117#ifdef CDDA_TEST
118extern cdrom_drive *cdda_identify_test(const char *filename,
119 int messagedest, char **message);
120#endif
121
122/******** Drive oriented functions */
123
124extern char *cdda_version();
125extern int cdda_speed_set(cdrom_drive *d, int speed);
126extern void cdda_verbose_set(cdrom_drive *d,int err_action, int mes_action);
127extern char *cdda_messages(cdrom_drive *d);
128extern char *cdda_errors(cdrom_drive *d);
129
130extern int cdda_close(cdrom_drive *d);
131extern int cdda_open(cdrom_drive *d);
132extern long cdda_read(cdrom_drive *d, void *buffer,
133 long beginsector, long sectors);
134extern long cdda_read_timed(cdrom_drive *d, void *buffer,
135 long beginsector, long sectors, int *milliseconds);
136
137extern long cdda_track_firstsector(cdrom_drive *d,int track);
138extern long cdda_track_lastsector(cdrom_drive *d,int track);
139extern long cdda_tracks(cdrom_drive *d);
140extern int cdda_sector_gettrack(cdrom_drive *d,long sector);
141extern int cdda_track_channels(cdrom_drive *d,int track);
142extern int cdda_track_audiop(cdrom_drive *d,int track);
143extern int cdda_track_copyp(cdrom_drive *d,int track);
144extern int cdda_track_preemp(cdrom_drive *d,int track);
145extern long cdda_disc_firstsector(cdrom_drive *d);
146extern 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
163static 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
180001: Unable to set CDROM to read audio mode
181002: Unable to read table of contents lead-out
182003: CDROM reporting illegal number of tracks
183004: Unable to read table of contents header
184005: Unable to read table of contents entry
185006: Could not read any data from drive
186007: Unknown, unrecoverable error reading data
187008: Unable to identify CDROM model
188009: CDROM reporting illegal table of contents
189010: Unaddressable sector
190
191100: Interface not supported
192101: Drive is neither a CDROM nor a WORM device
193102: Permision denied on cdrom (ioctl) device
194103: Permision denied on cdrom (data) device
195
196300: Kernel memory error
197
198400: Device not open
199401: Invalid track number
200402: Track not audio data
201403: No audio tracks on disc
202404: No medium present
203405: Option not supported by drive
204
205*/
206#endif
207
208