xref: /freebsd/sys/sys/cdio.h (revision 4d846d26)
1 /*
2  * 16 Feb 93	Julian Elischer	(julian@dialix.oz.au)
3  *
4  * $FreeBSD$
5  */
6 
7 /*
8 <1>	Fixed a conflict with ioctl usage.  There were two different
9 	functions using code #25.  Made file formatting consistent.
10 	Added two new ioctl codes: door closing and audio pitch playback.
11 	Added a STEREO union called STEREO.
12 	5-Mar-95  Frank Durda IV	bsdmail@nemesis.lonestar.org
13 
14 <2>	Added a new ioctl that allows you to find out what capabilities
15 	a drive has and what commands it will accept.  This allows a
16 	user application to only offer controls (buttons, sliders, etc)
17 	for functions that drive can actually do.   Things it can't do
18 	can disappear or be greyed-out (like some other system).
19 	If the driver doesn't respond to this call, well, handle it the
20 	way you used to do it.
21 	2-Apr-95  Frank Durda IV	bsdmail@nemesis.lonestar.org
22 */
23 
24 /* Shared between kernel & process */
25 
26 #ifndef	_SYS_CDIO_H_
27 #define	_SYS_CDIO_H_
28 
29 #ifndef _KERNEL
30 #include <sys/types.h>
31 #endif
32 #include <sys/ioccom.h>
33 
34 union msf_lba {
35 	struct {
36 		unsigned char   unused;
37 		unsigned char   minute;
38 		unsigned char   second;
39 		unsigned char   frame;
40 	} msf;
41 	int     lba;    /* network byte order */
42 	u_char	addr[4];
43 };
44 
45 struct cd_toc_entry {
46 #if BYTE_ORDER == LITTLE_ENDIAN
47 	u_int	:8;
48 	u_int	control:4;
49 	u_int	addr_type:4;
50 #else
51 	u_int	:8;
52 	u_int	addr_type:4;
53 	u_int	control:4;
54 #endif
55 	u_char  track;
56 	u_int	:8;
57 	union msf_lba  addr;
58 };
59 
60 struct cd_sub_channel_header {
61 	u_int	:8;
62 	u_char	audio_status;
63 #define CD_AS_AUDIO_INVALID        0x00
64 #define CD_AS_PLAY_IN_PROGRESS     0x11
65 #define CD_AS_PLAY_PAUSED          0x12
66 #define CD_AS_PLAY_COMPLETED       0x13
67 #define CD_AS_PLAY_ERROR           0x14
68 #define CD_AS_NO_STATUS            0x15
69 	u_char	data_len[2];
70 };
71 
72 struct cd_sub_channel_position_data {
73 	u_char	data_format;
74 	u_int	control:4;
75 	u_int	addr_type:4;
76 	u_char	track_number;
77 	u_char	index_number;
78 	union msf_lba  absaddr;
79 	union msf_lba  reladdr;
80 };
81 
82 struct cd_sub_channel_media_catalog {
83         u_char  data_format;
84         u_int   :8;
85         u_int   :8;
86         u_int   :8;
87         u_int   :7;
88         u_int   mc_valid:1;
89         u_char  mc_number[15];
90 };
91 
92 struct cd_sub_channel_track_info {
93         u_char  data_format;
94         u_int   :8;
95         u_char  track_number;
96         u_int   :8;
97         u_int   :7;
98         u_int   ti_valid:1;
99         u_char  ti_number[15];
100 };
101 
102 struct cd_sub_channel_info {
103 	struct cd_sub_channel_header header;
104 	union {
105 		struct cd_sub_channel_position_data position;
106 		struct cd_sub_channel_media_catalog media_catalog;
107 		struct cd_sub_channel_track_info track_info;
108 	} what;
109 };
110 
111 /***************************************************************\
112 * Ioctls for the CD drive					*
113 \***************************************************************/
114 
115 struct ioc_play_track {
116 	u_char	start_track;
117 	u_char	start_index;
118 	u_char	end_track;
119 	u_char	end_index;
120 };
121 #define	CDIOCPLAYTRACKS	_IOW('c',1,struct ioc_play_track)
122 
123 struct ioc_play_blocks {
124 	int	blk;
125 	int	len;
126 };
127 #define	CDIOCPLAYBLOCKS	_IOW('c',2,struct ioc_play_blocks)
128 
129 struct ioc_read_subchannel {
130 	u_char address_format;
131 #define CD_LBA_FORMAT	1
132 #define CD_MSF_FORMAT	2
133 	u_char data_format;
134 #define CD_SUBQ_DATA		0
135 #define CD_CURRENT_POSITION	1
136 #define CD_MEDIA_CATALOG	2
137 #define CD_TRACK_INFO		3
138 	u_char track;
139 	int	data_len;
140 	struct  cd_sub_channel_info *data;
141 };
142 #define CDIOCREADSUBCHANNEL _IOWR('c', 3 , struct ioc_read_subchannel )
143 
144 struct ioc_toc_header {
145 	u_short len;
146 	u_char  starting_track;
147 	u_char  ending_track;
148 };
149 #define CDIOREADTOCHEADER _IOR('c',4,struct ioc_toc_header)
150 
151 struct ioc_read_toc_entry {
152 	u_char	address_format;
153 	u_char	starting_track;
154 	u_short	data_len;
155 	struct  cd_toc_entry *data;
156 };
157 #define CDIOREADTOCENTRYS _IOWR('c',5,struct ioc_read_toc_entry)
158 
159 struct ioc_read_toc_single_entry {
160 	u_char	address_format;
161 	u_char	track;
162 	struct  cd_toc_entry entry;
163 };
164 #define CDIOREADTOCENTRY _IOWR('c',6,struct ioc_read_toc_single_entry)
165 
166 struct ioc_patch {
167 	u_char	patch[4];	/* one for each channel */
168 };
169 #define	CDIOCSETPATCH	_IOW('c',9,struct ioc_patch)
170 
171 struct ioc_vol {
172 	u_char	vol[4];	/* one for each channel */
173 };
174 #define	CDIOCGETVOL	_IOR('c',10,struct ioc_vol)
175 
176 #define	CDIOCSETVOL	_IOW('c',11,struct ioc_vol)
177 
178 #define	CDIOCSETMONO	_IO('c',12)
179 
180 #define	CDIOCSETSTERIO	_IO('c',13)
181 #define	CDIOCSETSTEREO	_IO('c',13)
182 
183 #define	CDIOCSETMUTE	_IO('c',14)
184 
185 #define	CDIOCSETLEFT	_IO('c',15)
186 
187 #define	CDIOCSETRIGHT	_IO('c',16)
188 
189 #define	CDIOCSETDEBUG	_IO('c',17)
190 
191 #define	CDIOCCLRDEBUG	_IO('c',18)
192 
193 #define	CDIOCPAUSE	_IO('c',19)
194 
195 #define	CDIOCRESUME	_IO('c',20)
196 
197 #define	CDIOCRESET	_IO('c',21)
198 
199 #define	CDIOCSTART	_IO('c',22)
200 
201 #define	CDIOCSTOP	_IO('c',23)
202 
203 #define	CDIOCEJECT	_IO('c',24)
204 
205 struct ioc_play_msf {
206 	u_char	start_m;
207 	u_char	start_s;
208 	u_char	start_f;
209 	u_char	end_m;
210 	u_char	end_s;
211 	u_char	end_f;
212 };
213 #define	CDIOCPLAYMSF	_IOW('c',25,struct ioc_play_msf)
214 
215 #define	CDIOCALLOW	_IO('c',26)
216 
217 #define	CDIOCPREVENT	_IO('c',27)
218 
219 				/*<1>For drives that support it, this*/
220 				/*<1>causes the drive to close its door*/
221 				/*<1>and make the media (if any) ready*/
222 #define CDIOCCLOSE	_IO('c',28)	/*<1>*/
223 
224 struct ioc_pitch {		/*<1>For drives that support it, this*/
225 				/*<1>call instructs the drive to play the*/
226 	short	speed;		/*<1>audio at a faster or slower-than-normal*/
227 };				/*<1>rate. -32767 to -1 is slower, 0==normal,*/
228 				/*<1>and 1 to 32767 is faster.  LSB bits are*/
229 				/*<1>discarded first by drives with less res.*/
230 #define	CDIOCPITCH	_IOW('c',29,struct ioc_pitch)	/*<1>*/
231 
232 struct ioc_capability {			/*<2>*/
233 	u_long	play_function;		/*<2>*/
234 #define CDDOPLAYTRK	0x00000001	/*<2>Can Play tracks/index*/
235 #define	CDDOPLAYMSF	0x00000002	/*<2>Can Play msf to msf*/
236 #define	CDDOPLAYBLOCKS	0x00000004	/*<2>Can Play range of blocks*/
237 #define	CDDOPAUSE	0x00000100	/*<2>Output can be paused*/
238 #define	CDDORESUME	0x00000200	/*<2>Output can be resumed*/
239 #define	CDDORESET	0x00000400	/*<2>Drive can be completely reset*/
240 #define	CDDOSTART	0x00000800	/*<2>Audio can be started*/
241 #define CDDOSTOP	0x00001000	/*<2>Audio can be stopped*/
242 #define CDDOPITCH	0x00002000	/*<2>Audio pitch */
243 
244 	u_long	routing_function;	/*<2>*/
245 #define CDREADVOLUME	0x00000001	/*<2>Volume settings can be read*/
246 #define CDSETVOLUME	0x00000002	/*<2>Volume settings can be set*/
247 #define	CDSETMONO	0x00000100	/*<2>Output can be set to mono*/
248 #define CDSETSTEREO	0x00000200	/*<2>Output can be set to stereo (def)*/
249 #define	CDSETLEFT	0x00000400	/*<2>Output can be set to left only*/
250 #define	CDSETRIGHT	0x00000800	/*<2>Output can be set to right only*/
251 #define	CDSETMUTE	0x00001000	/*<2>Output can be muted*/
252 #define CDSETPATCH	0x00008000	/*<2>Direct routing control allowed*/
253 
254 	u_long	special_function;	/*<2>*/
255 #define	CDDOEJECT	0x00000001	/*<2>The tray can be opened*/
256 #define	CDDOCLOSE	0x00000002	/*<2>The tray can be closed*/
257 #define	CDDOLOCK	0x00000004	/*<2>The tray can be locked*/
258 #define CDREADHEADER	0x00000100	/*<2>Can read Table of Contents*/
259 #define	CDREADENTRIES	0x00000200	/*<2>Can read TOC Entries*/
260 #define	CDREADSUBQ	0x00000200	/*<2>Can read Subchannel info*/
261 #define CDREADRW	0x00000400	/*<2>Can read subcodes R-W*/
262 #define	CDHASDEBUG	0x00004000	/*<2>The tray has dynamic debugging*/
263 };					/*<2>*/
264 
265 #define	CDIOCCAPABILITY	_IOR('c',30,struct ioc_capability)	/*<2>*/
266 
267 #endif /* !_SYS_CDIO_H_ */
268