cdio.h revision 25460
1/*
2 * 16 Feb 93	Julian Elischer	(julian@dialix.oz.au)
3 *
4 *	$Id: cdio.h,v 1.16 1997/02/22 09:44:53 peter Exp $
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
34union 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
45struct cd_toc_entry {
46	u_char	:8;
47	u_char	control:4;
48	u_char	addr_type:4;
49	u_char  track;
50	u_char	:8;
51	union msf_lba  addr;
52};
53
54struct cd_sub_channel_header {
55	u_char	:8;
56	u_char	audio_status;
57#define CD_AS_AUDIO_INVALID        0x00
58#define CD_AS_PLAY_IN_PROGRESS     0x11
59#define CD_AS_PLAY_PAUSED          0x12
60#define CD_AS_PLAY_COMPLETED       0x13
61#define CD_AS_PLAY_ERROR           0x14
62#define CD_AS_NO_STATUS            0x15
63	u_char	data_len[2];
64};
65
66struct cd_sub_channel_position_data {
67	u_char	data_format;
68	u_char	control:4;
69	u_char	addr_type:4;
70	u_char	track_number;
71	u_char	index_number;
72	union msf_lba  absaddr;
73	union msf_lba  reladdr;
74};
75
76struct cd_sub_channel_media_catalog {
77        u_char  data_format;
78        u_char  :8;
79        u_char  :8;
80        u_char  :8;
81        u_char  :7;
82        u_char  mc_valid:1;
83        u_char  mc_number[15];
84};
85
86struct cd_sub_channel_track_info {
87        u_char  data_format;
88        u_char  :8;
89        u_char  track_number;
90        u_char  :8;
91        u_char  :7;
92        u_char  ti_valid:1;
93        u_char  ti_number[15];
94};
95
96struct cd_sub_channel_info {
97	struct cd_sub_channel_header header;
98	union {
99		struct cd_sub_channel_position_data position;
100		struct cd_sub_channel_media_catalog media_catalog;
101		struct cd_sub_channel_track_info track_info;
102	} what;
103};
104
105
106/***************************************************************\
107* Ioctls for the CD drive					*
108\***************************************************************/
109
110struct ioc_play_track
111{
112	u_char	start_track;
113	u_char	start_index;
114	u_char	end_track;
115	u_char	end_index;
116};
117#define	CDIOCPLAYTRACKS	_IOW('c',1,struct ioc_play_track)
118
119
120struct ioc_play_blocks
121{
122	int	blk;
123	int	len;
124};
125#define	CDIOCPLAYBLOCKS	_IOW('c',2,struct ioc_play_blocks)
126
127
128struct ioc_read_subchannel {
129	u_char address_format;
130#define CD_LBA_FORMAT	1
131#define CD_MSF_FORMAT	2
132	u_char data_format;
133#define CD_SUBQ_DATA		0
134#define CD_CURRENT_POSITION	1
135#define CD_MEDIA_CATALOG	2
136#define CD_TRACK_INFO		3
137	u_char track;
138	int	data_len;
139	struct  cd_sub_channel_info *data;
140};
141#define CDIOCREADSUBCHANNEL _IOWR('c', 3 , struct ioc_read_subchannel )
142
143
144struct 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
152struct ioc_read_toc_entry {
153	u_char	address_format;
154	u_char	starting_track;
155	u_short	data_len;
156	struct  cd_toc_entry *data;
157};
158#define CDIOREADTOCENTRYS _IOWR('c',5,struct ioc_read_toc_entry)
159
160
161struct ioc_read_toc_single_entry {
162	u_char	address_format;
163	u_char	track;
164	struct  cd_toc_entry entry;
165};
166#define CDIOREADTOCENTRY _IOWR('c',6,struct ioc_read_toc_single_entry)
167
168
169struct	ioc_patch
170{
171	u_char	patch[4];	/* one for each channel */
172};
173#define	CDIOCSETPATCH	_IOW('c',9,struct ioc_patch)
174
175
176struct	ioc_vol
177{
178	u_char	vol[4];	/* one for each channel */
179};
180#define	CDIOCGETVOL	_IOR('c',10,struct ioc_vol)
181
182#define	CDIOCSETVOL	_IOW('c',11,struct ioc_vol)
183
184#define	CDIOCSETMONO	_IO('c',12)
185
186#define	CDIOCSETSTERIO	_IO('c',13)
187#define	CDIOCSETSTEREO	_IO('c',13)
188
189#define	CDIOCSETMUTE	_IO('c',14)
190
191#define	CDIOCSETLEFT	_IO('c',15)
192
193#define	CDIOCSETRIGHT	_IO('c',16)
194
195#define	CDIOCSETDEBUG	_IO('c',17)
196
197#define	CDIOCCLRDEBUG	_IO('c',18)
198
199#define	CDIOCPAUSE	_IO('c',19)
200
201#define	CDIOCRESUME	_IO('c',20)
202
203#define	CDIOCRESET	_IO('c',21)
204
205#define	CDIOCSTART	_IO('c',22)
206
207#define	CDIOCSTOP	_IO('c',23)
208
209#define	CDIOCEJECT	_IO('c',24)
210
211
212struct ioc_play_msf
213{
214	u_char	start_m;
215	u_char	start_s;
216	u_char	start_f;
217	u_char	end_m;
218	u_char	end_s;
219	u_char	end_f;
220};
221#define	CDIOCPLAYMSF	_IOW('c',25,struct ioc_play_msf)
222
223#define	CDIOCALLOW	_IO('c',26)
224
225#define	CDIOCPREVENT	_IO('c',27)
226
227				/*<1>For drives that support it, this*/
228				/*<1>causes the drive to close its door*/
229				/*<1>and make the media (if any) ready*/
230#define CDIOCCLOSE	_IO('c',28)	/*<1>*/
231
232
233struct	ioc_pitch		/*<1>For drives that support it, this*/
234{				/*<1>call instructs the drive to play the*/
235	short	speed;		/*<1>audio at a faster or slower-than-normal*/
236};				/*<1>rate. -32767 to -1 is slower, 0==normal,*/
237				/*<1>and 1 to 32767 is faster.  LSB bits are*/
238				/*<1>discarded first by drives with less res.*/
239#define	CDIOCPITCH	_IOW('c',29,struct ioc_pitch)	/*<1>*/
240
241struct ioc_capability {			/*<2>*/
242	u_long	play_function;		/*<2>*/
243#define CDDOPLAYTRK	0x00000001	/*<2>Can Play tracks/index*/
244#define	CDDOPLAYMSF	0x00000002	/*<2>Can Play msf to msf*/
245#define	CDDOPLAYBLOCKS	0x00000004	/*<2>Can Play range of blocks*/
246#define	CDDOPAUSE	0x00000100	/*<2>Output can be paused*/
247#define	CDDORESUME	0x00000200	/*<2>Output can be resumed*/
248#define	CDDORESET	0x00000400	/*<2>Drive can be completely reset*/
249#define	CDDOSTART	0x00000800	/*<2>Audio can be started*/
250#define CDDOSTOP	0x00001000	/*<2>Audio can be stopped*/
251#define CDDOPITCH	0x00002000	/*<2>Audio pitch */
252
253	u_long	routing_function;	/*<2>*/
254#define CDREADVOLUME	0x00000001	/*<2>Volume settings can be read*/
255#define CDSETVOLUME	0x00000002	/*<2>Volume settings can be set*/
256#define	CDSETMONO	0x00000100	/*<2>Output can be set to mono*/
257#define CDSETSTEREO	0x00000200	/*<2>Output can be set to stereo (def)*/
258#define	CDSETLEFT	0x00000400	/*<2>Output can be set to left only*/
259#define	CDSETRIGHT	0x00000800	/*<2>Output can be set to right only*/
260#define	CDSETMUTE	0x00001000	/*<2>Output can be muted*/
261#define CDSETPATCH	0x00008000	/*<2>Direct routing control allowed*/
262
263	u_long	special_function;	/*<2>*/
264#define	CDDOEJECT	0x00000001	/*<2>The tray can be opened*/
265#define	CDDOCLOSE	0x00000002	/*<2>The tray can be closed*/
266#define	CDDOLOCK	0x00000004	/*<2>The tray can be locked*/
267#define CDREADHEADER	0x00000100	/*<2>Can read Table of Contents*/
268#define	CDREADENTRIES	0x00000200	/*<2>Can read TOC Entries*/
269#define	CDREADSUBQ	0x00000200	/*<2>Can read Subchannel info*/
270#define CDREADRW	0x00000400	/*<2>Can read subcodes R-W*/
271#define	CDHASDEBUG	0x00004000	/*<2>The tray has dynamic debugging*/
272};					/*<2>*/
273
274#define	CDIOCCAPABILITY	_IOR('c',30,struct ioc_capability)	/*<2>*/
275
276#endif /* !_SYS_CDIO_H_ */
277