|
|
1.1 root 1: /*
2: * cd_commands.h: header file for cd_commands.c
3: *
4: * History
5: * -------
6: * Mon Sep 16 15:57:35 PDT 1991 James C. Lee at NeXT
7: * Created
8: */
9:
10: #ifndef CD_COMMANDS
11: #define CD_COMMANDS
12:
13: #import <sys/types.h>
14: #import <libc.h>
15: #import <bsd/dev/scsireg.h>
16: #import <sys/time.h>
17:
18: /* start/stop command (C6OP_STARTSTOP = 1Bh) */
19: struct start_stop_cmd {
20: u_char ssc_opcode;
21: u_char ssc_lun:3,
22: ssc_reserved:4,
23: ssc_imm:1;
24: u_int ssc_reserved2:22,
25: ssc_loej:1,
26: ssc_start:1,
27: ssc_control:8;
28: };
29:
30: /* read toc reply header */
31: struct rtr_header {
32: u_int rtr_datalength:16,
33: rtr_firsttrack:8,
34: rtr_lasttrack:8;
35: };
36:
37: /* read toc reply descriptor */
38: struct rtr10_desc {
39: u_int t10d_reserved:12,
40: t10d_control:4,
41: t10d_track:8,
42: t10d_reserved2:8;
43: u_int t10d_hour:8,
44: t10d_min:8,
45: t10d_sec:8,
46: t10d_frame:8;
47: };
48:
49: /* read toc reply with one descriptor, to read more than 1 descriptor
50: blocks at a time, one must allocate
51: sizeof(struct rtr10_desc)*num_descriptrs+sizeof(struct_rtr_header) bytes,
52: and then traverse through the memory */
53:
54: struct toc10_reply {
55: struct rtr_header h;
56: struct rtr10_desc d; /* one descriptor block */
57: };
58:
59: /* an entry to toc info */
60: struct toc_info {
61: u_char control; /* control bits */
62: u_int hour:8, /* msf address */
63: min:8,
64: sec:8,
65: frame; /* not too sure what this byte is */
66: };
67:
68: /* control bits */
69: #define PRE_EMPHASIS 0x1 /* pre-emphasis or not */
70: #define DIGITAL_COPY 0x2 /* digital copy permitted (1) or not (0) */
71: #define DATA_TRACK 0x4 /* data track (1) or autio track (0) */
72: #define FOUR_CHANNEL 0x8 /* four channel (1) or two channel (0) */
73:
74: /* entire table of contents */
75: struct toc_all {
76: u_short firsttrack:8,
77: lasttrack:8;
78: int naudio, /* number of audio tracks */
79: ndata, /* number of data tracks */
80: lastDataBlock; /* very last data block */
81: struct toc_info info[101]; /* 0-99 + transition area (100) */
82: };
83:
84: #define C10OP_READTOC 0x43 /* read toc10 command */
85: /* read toc10 command (C10OP_READTOC = 43h) */
86: struct readtoc10_cmd {
87: u_char rt10_op_code;
88: u_char rt10_lun:3,
89: rt10_reserved:3,
90: rt10_msf:1,
91: rt10_reserved2:1;
92: u_int rt10_reserved3;
93: u_int rt10_starttrack:8,
94: rt10_length:16,
95: rt10_control:8;
96: };
97:
98: #define C6OP_PLAYAUDIO 0xc8
99: /* play audio command (C6OP_PLAYAUDIO = c8h) */
100: struct playaudio_cmd {
101: u_char pa_op_code;
102: u_char pa_lun:3,
103: pa_reserved:5;
104: u_int pa_lba; /* lba to start playing */
105: u_int pa_reserved2:8,
106: pa_length:16,
107: pa_control:8;
108: };
109:
110: #define C10OP_PAUSE 0xc5
111: /* pause audio commnad (C10OP_PAUSE = c5h) */
112: struct pause_cmd {
113: u_char p_op_code;
114: u_int p_lun:3,
115: p_pause:1,
116: p_reserved:28;
117: u_int p_reserved2;
118: u_char p_control;
119: };
120:
121: /* msf data format */
122: struct msf {
123: u_int hour:8,
124: min:8,
125: sec:8,
126: frame:8;
127: };
128:
129: #define C10OP_PLAYAUDIO_MSF 0x47
130: /* play audio msf command (C6OP_PLAYAUDIO = 47h) */
131: struct playaudio_msf_cmd {
132: u_char pam_op_code;
133: u_char pam_lun:3,
134: pam_reserved:5;
135: u_int pam_reserved2:8,
136: pam_start_min:8,
137: pam_start_sec:8,
138: pam_start_frame:8;
139: u_int pam_end_min:8,
140: pam_end_sec:8,
141: pam_end_frame:8,
142: pam_control:8;
143: };
144:
145: /**********************************************************
146: * sub channel
147: **********************************************************/
148: #define C10OP_READSUBHCANNEL 0x42
149: /* read sub-channel (C10OP_READSUBHCANNEL = 42h) */
150: struct readsc_cmd {
151: u_int rsc_op_code:8,
152: rsc_lun:3,
153: rsc_reserved:3,
154: rsc_msf:1,
155: rsc_reserved2:2,
156: rsc_subq:1, /* sub-channel data or not (not=just header) */
157: rsc_reserved3:6,
158: rsc_dformat:8;
159: u_short rsc_reserved4;
160: u_int rsc_track:8,
161: rsc_length:16,
162: rsc_control:8;
163: };
164:
165: /* sub-channel data header */
166: struct sc_header {
167: u_int sch_reserved:8,
168: sch_astatus:8, /* audio status */
169: sch_length:16; /* sub-channel data length */
170: };
171:
172: /* sub-channel data format page 1: CD-ROM current position data block */
173: struct sc_cur_pos {
174: u_int sc1_data_code:8,
175: sc1_reserved:4,
176: sc1_control:4,
177: sc1_track:8,
178: sc1_index:8;
179: u_int sc1_abs_addr;
180: u_int sc1_rel_addr;
181: };
182:
183: /* sub-channel data format page 2: Media Catalog Number Data Format */
184: struct sc_med_cat {
185: u_int sc2_data_code:8,
186: sc2_reserved:24;
187: u_char sc2_mcval:1,
188: sc2_reserved2:7;
189: u_char sc2_med_cat[15];
190: };
191:
192: /* sub-channel data format page 3: Track International Standard Recording Data
193: Format */
194: struct sc_isrc {
195: u_int sc3_data_code:8,
196: sc3_reserved:8,
197: sc3_track:8,
198: sc3_reserved2:8;
199: u_char sc3_tcval:1,
200: sc3_reserved3:7;
201: u_char sc3_isrc[15];
202: };
203:
204: /* sub-channel reply */
205: struct sc_reply {
206: struct sc_header scr_header;
207: union {
208: struct sc_cur_pos u_scr_cur_pos;
209: struct sc_med_cat u_scr_med_cat;
210: struct sc_isrc u_scr_isrc;
211: }u;
212: };
213:
214: /**********************************************************
215: * playback status & playback control
216: **********************************************************/
217: #define C10OP_PLAYBACKCONTROL 0xc9
218: #define C10OP_PLAYBACKSTATUS 0xc4
219: struct playback_cmd {
220: u_char pb_opcode;
221: u_int pb_lun:3,
222: pb_reserved:29;
223: u_int pb_reserved2:16,
224: pb_length:16;
225: u_char pb_control;
226: };
227:
228: struct playback_data {
229: u_int pbd_reserved;
230: u_int pbd_reserved2;
231: u_short pbd_reserved3;
232: u_int pbd_reserved4:4,
233: pbd_ch0_sel:4,
234: pbd_ch0_vol:8,
235: pbd_reserved5:4,
236: pbd_ch1_sel:4,
237: pbd_ch1_vol:8;
238: u_int pbd_reserved6:4,
239: pbd_ch2_sel:4,
240: pbd_ch2_vol:8,
241: pbd_reserved7:4,
242: pbd_ch3_sel:4,
243: pbd_ch3_vol:8;
244: };
245:
246: int do_eject(int fd, struct timeval *tvp, struct esense_reply *erp);
247: int do_spinup(int fd, struct timeval *tvp, struct esense_reply *erp);
248: int do_readtoc(int fd, int track, struct toc10_reply *tocr,
249: struct esense_reply *erp);
250: int do_readtoc_all(int fd, struct toc_all *toc_all, struct esense_reply *erp);
251: int do_playaudio(int fd, int lba, int length, struct esense_reply *erp);
252: int do_pauseaudio(int fd, int pause, struct esense_reply *erp);
253: int do_playaudio_msf(int fd, struct msf startmsf, struct msf endmsf,
254: struct esense_reply *erp);
255: int do_readsubchannel(int fd, int msf, int subq, int page, int track,
256: struct sc_reply *scrp, struct esense_reply *erp);
257: int do_playbackstatus(int fd, struct playback_data *pbdatap,
258: struct esense_reply *erp);
259: int do_playbackcontrol(int fd, struct playback_data *pbdatap,
260: struct esense_reply *erp);
261:
262:
263: void printf_sc(int page, struct sc_reply *scrp);
264: void printf_pb(struct playback_data *pbdatap);
265:
266: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.