summaryrefslogtreecommitdiff
path: root/wodim/wodim.h
blob: 0dfdfdc273c585c5d653d02d1782e92865ca01b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
/*
 * This file has been modified for the cdrkit suite.
 *
 * The behaviour and appearence of the program code below can differ to a major
 * extent from the version distributed by the original author(s).
 *
 * For details, see Changelog file distributed with the cdrkit package. If you
 * received this file from another source then ask the distributing person for
 * a log of modifications.
 *
 */

/* @(#)cdrecord.h	1.165 05/06/11 Copyright 1995-2005 J. Schilling */
/*
 *	Definitions for cdrecord
 *
 *	Copyright (c) 1995-2005 J. Schilling
 */
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; see the file COPYING.  If not, write to the Free Software
 * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

/*
 * Make sure it is there. We need it for off_t.
 */
#ifndef	_INCL_SYS_TYPES_H
#include <sys/types.h>
#define	_INCL_SYS_TYPES_H
#endif

#ifndef	_UTYPES_H
#include <utypes.h>
#endif

/*
 * Defines for command line option flags
 */
#define	F_DUMMY		0x00000001L	/* Do dummy (simulation) writes */
#define	F_TOC		0x00000002L	/* Get TOC */
#define	F_EJECT		0x00000004L	/* Eject disk after doing the work */
#define	F_LOAD		0x00000008L	/* Load disk only */
#define	F_MULTI		0x00000010L	/* Create linkable TOC/multi-session */
#define	F_MSINFO	0x00000020L	/* Get multi-session info */
#define	F_FIX		0x00000040L	/* Fixate disk only */
#define	F_NOFIX		0x00000080L	/* Do not fixate disk */
#define	F_VERSION	0x00000100L	/* Print version info */
#define	F_CHECKDRIVE	0x00000200L	/* Check for driver */
#define	F_INQUIRY	0x00000400L	/* Do inquiry */
#define	F_PRCAP		0x00000800L	/* Print capabilities */
#define	F_SCANBUS	0x00001000L	/* Scan SCSI Bus */
#define	F_RESET		0x00002000L	/* Reset SCSI Bus */
#define	F_BLANK		0x00004000L	/* Blank CD-RW */
#define	F_PRATIP	0x00008000L	/* Print ATIP info */
#define	F_PRDINFO	0x00010000L	/* Print disk info (XXX not yet used)  */
#define	F_IGNSIZE	0x00020000L	/* Ignore disk size */
#define	F_SAO		0x00040000L	/* Session at once */
#define	F_RAW		0x00080000L	/* Raw mode */
#define	F_WRITE		0x00100000L	/* Disk is going to be written */
#define	F_FORCE		0x00200000L	/* Force things (e.g. blank on dead disk)  */
#define	F_WAITI		0x00400000L	/* Wait until data is available on stdin */
#define	F_OVERBURN	0x00800000L	/* Allow oveburning */
#define	F_CLONE		0x01000000L	/* Do clone writing */
#define	F_STDIN		0x02000000L	/* We are using stdin as CD data */
#define	F_IMMED		0x04000000L	/* Try tu use IMMED SCSI flag if possible */
#define	F_DLCK		0x08000000L	/* Load disk and lock door */
#define	F_SETDROPTS	0x10000000L	/* Set driver opts and exit */
#define	F_FORMAT	0x20000000L	/* Format media */
#define	F_ABORT		0x40000000L	/* Send abort sequence to drive */

#ifdef	min
#undef	min
#endif
#define	min(a, b)	((a) < (b) ? (a):(b))

#ifdef	max
#undef	max
#endif
#define	max(a, b)	((a) < (b) ? (b):(a))

#undef	roundup
#define	roundup(x, y)	((((x)+((y)-1))/(y))*(y))

/*
 * NOTICE:	You should not make CDR_BUF_SIZE more than
 *		the buffer size of the CD-Recorder.
 *
 * The Philips CDD 521 is the recorder with the smallest buffer.
 * It only has 256kB of buffer RAM.
 *
 * WARNING:	Philips CDD 521 dies if CDR_BUF_SIZE is to big.
 *		If you like to support the CDD 521 keep the buffer
 *		at 63kB.
 */
/*#define	CDR_BUF_SIZE	(126*1024)*/
#define	CDR_BUF_SIZE		(63*1024)
#define	CDR_MAX_BUF_SIZE	(256*1024)

/*
 * Never set MIN_GRACE_TIME < 3 seconds. We need to give
 * the volume management a chance to settle before we
 * start writing.
 */
#ifndef	MIN_GRACE_TIME
#define	MIN_GRACE_TIME	0		/* changed to 0, there is no point in forcing it in this application. Fix your volume management if it breaks because it could not read the medium. */
#endif
#ifndef	GRACE_TIME
#define	GRACE_TIME	4
#endif

/*
 * Some sector sizes used for reading/writing ...
 */
#define	DATA_SEC_SIZE	2048		/* 2048 bytes */
#define	MODE2_SEC_SIZE	2336		/* 2336 bytes */
#define	AUDIO_SEC_SIZE	2352		/* 2352 bytes */
#define	RAW16_SEC_SIZE	(2352+16)	/* 2368 bytes */
#define	RAW96_SEC_SIZE	(2352+96)	/* 2448 bytes */

#define	MAX_TRACK	99	/* Red Book track limit */

#define	PAD_SECS	15	/* NOTE: pad must be less than BUF_SIZE */
#define	PAD_SIZE	(PAD_SECS * DATA_SEC_SIZE)

/*
 * FIFO size must be at least 2x CDR_MAX_BUF_SIZE
 */
#define	DEFAULT_FIFOSIZE (4L*1024L*1024L)

#if	!defined(HAVE_LARGEFILES) && SIZEOF_LLONG > SIZEOF_LONG
typedef	Llong	tsize_t;
#else
typedef	off_t	tsize_t;
#endif

#ifdef	nono
typedef struct tindex {
	int	dummy;		/* Not yet implemented */
} tindex_t;
#endif

typedef struct ofile {
	struct ofile *next;	/* Next open file			*/
	int	f;		/* Open file				*/
	char	*filename;	/* File name				*/
	int	refcnt;		/* open reference count			*/
} ofile_t;

typedef struct track {
	void	*xfp;		/* Open file for this track from xopen()*/
	char	*filename;	/* File name for this track		*/

	tsize_t	itracksize;	/* Size of track bytes (-1 == until EOF)*/
				/* This is in units of isecsize		*/
	tsize_t	tracksize;	/* Size of track bytes (-1 == until EOF)*/
				/* This is in units of secsize		*/

	long	trackstart;	/* Start sector # of this track		*/
	long	tracksecs;	/* Size of this track (sectors)		*/
	long	padsecs;	/* Pad size for this track (sectors)	*/
	long	pregapsize;	/* Pre-gap size for this track (sectors)*/
	long	index0start;	/* Index 0 start within this tr(sectors)*/
	int	isecsize;	/* Read input sector size for this track*/
	int	secsize;	/* Sector size for this track (bytes)	*/
	int	secspt;		/* # of sectors to copy for one transfer*/
	int	pktsize;	/* # of blocks per write packet		*/
	Uchar	dataoff;	/* offset of user data in raw sector	*/
	Uchar	tracks;		/* Number of tracks on this disk	*/
	Uchar	track;		/* Track # as offset in track[] array	*/
	Uchar	trackno;	/* Track # on disk for this track	*/
	Uchar	tracktype;	/* Track type (toc type)		*/
	Uchar	dbtype;		/* Data block type for this track	*/
	int	sectype;	/* Sector type				*/
	int	flags;		/* Flags (see below)			*/
	int	nindex;		/* Number of indices for track		*/
	long	*tindex;	/* Track index descriptor		*/
	char	*isrc;		/* ISRC code for this track / disk MCN	*/
	void	*text;		/* Opaque CD-Text data (txtptr_t *)	*/
} track_t;

#define	track_base(tp)	((tp) - (tp)->track)

/*
 * Defines for tp->flags
 */
#define	TI_AUDIO	0x00001	/* File is an audio track		*/
#define	TI_PREEMP	0x00002	/* Audio track recorded w/preemphasis	*/
#define	TI_MIX		0x00004	/* This is a mixed mode track		*/
#define	TI_RAW		0x00008	/* Write this track in raw mode		*/
#define	TI_PAD		0x00010	/* Pad data track			*/
#define	TI_SWAB		0x00020	/* Swab audio data			*/
#define	TI_ISOSIZE	0x00040	/* Use iso size for track		*/
#define	TI_NOAUHDR	0x00080	/* Don't look for audio header		*/
#define	TI_FIRST	0x00100	/* This is the first track		*/
#define	TI_LAST		0x00200	/* This is the last track		*/
#define	TI_PACKET	0x00400	/* Fixed- or variable-packet track	*/
#define	TI_NOCLOSE	0x00800	/* Don't close the track after writing	*/
#define	TI_TAO		0x01000	/* This track is written in TAO mode	*/
#define	TI_PREGAP	0x02000	/* Prev. track incl. pregap of this tr. */
#define	TI_SCMS		0x04000	/* Force to follow the SCMS rules	*/
#define	TI_COPY		0x08000	/* Allow digital copy			*/
#define	TI_SHORT_TRACK	0x10000	/* Ignore min 4 second Red Book	std.	*/
#define	TI_RAW16	0x20000	/* This track uses 16 bytes subch.	*/
#define	TI_RAW96R	0x40000	/* This track uses 96 bytes RAW subch.	*/
#define	TI_CLONE	0x80000	/* Special clone treatment needed	*/
#define	TI_TEXT		0x100000 /* This track holds CD-Text information */
#define	TI_DVD		0x200000 /* We are writing a DVD track		*/
#define	TI_SAO		0x400000 /* This track is written in SAO mode	*/
#define	TI_USEINFO	0x800000 /* Use information from *.inf files	*/
#define	TI_QUADRO	0x1000000 /* Four Channel Audio Data		*/


#define	is_audio(tp)	(((tp)->flags & TI_AUDIO) != 0)
#define	is_preemp(tp)	(((tp)->flags & TI_PREEMP) != 0)
#define	is_pad(tp)	(((tp)->flags & TI_PAD) != 0)
#define	is_swab(tp)	(((tp)->flags & TI_SWAB) != 0)
#define	is_first(tp)	(((tp)->flags & TI_FIRST) != 0)
#define	is_last(tp)	(((tp)->flags & TI_LAST) != 0)
#define	is_packet(tp)	(((tp)->flags & TI_PACKET) != 0)
#define	is_noclose(tp)	(((tp)->flags & TI_NOCLOSE) != 0)
#define	is_tao(tp)	(((tp)->flags & TI_TAO) != 0)
#define	is_sao(tp)	(((tp)->flags & TI_SAO) != 0)
#define	is_raw(tp)	(((tp)->flags & TI_RAW) != 0)
#define	is_raw16(tp)	(((tp)->flags & TI_RAW16) != 0)
#define	is_raw96(tp)	(((tp)->flags & (TI_RAW|TI_RAW16)) == TI_RAW)
#define	is_raw96p(tp)	(((tp)->flags & (TI_RAW|TI_RAW16|TI_RAW96R)) == TI_RAW)
#define	is_raw96r(tp)	(((tp)->flags & (TI_RAW|TI_RAW16|TI_RAW96R)) == (TI_RAW|TI_RAW96R))
#define	is_pregap(tp)	(((tp)->flags & TI_PREGAP) != 0)
#define	is_scms(tp)	(((tp)->flags & TI_SCMS) != 0)
#define	is_copy(tp)	(((tp)->flags & TI_COPY) != 0)
#define	is_shorttrk(tp)	(((tp)->flags & TI_SHORT_TRACK) != 0)
#define	is_clone(tp)	(((tp)->flags & TI_CLONE) != 0)
#define	is_text(tp)	(((tp)->flags & TI_TEXT) != 0)
#define	is_quadro(tp)	(((tp)->flags & TI_QUADRO) != 0)

/*
 * Defines for toc type / track type
 */
#define	TOC_DA		0	/* CD-DA				*/
#define	TOC_ROM		1	/* CD-ROM				*/
#define	TOC_XA1		2	/* CD_ROM XA with first track in mode 1 */
#define	TOC_XA2		3	/* CD_ROM XA with first track in mode 2 */
#define	TOC_CDI		4	/* CDI					*/

#define	TOC_MASK	7	/* Mask needed for toctname[]		*/

/*
 * Additional flags in toc type / trackp->tracktype
 * XXX TOCF_DUMMY istr schon in dp->cdr_cmdflags & F_DUMMY
 * XXX TOCF_MULTI istr schon in dp->cdr_cmdflags & F_MULTI
 */
#define	TOCF_DUMMY	0x10	/* Write in dummy (simulation) mode	*/
#define	TOCF_MULTI	0x20	/* Multisession (Open Next Programarea) */

#define	TOCF_MASK	0xF0	/* All possible flags in tracktype	*/

extern	char	*toc2name[];	/* Convert toc type to name		*/
extern	int	toc2sess[];	/* Convert toc type to session format	*/

/*
 * Defines for sector type
 *
 * Mode is 2 bits
 * Aud  is 1 bit
 *
 * Sector is: aud << 2 | mode
 */
#define	ST_ROM_MODE1	1	/* CD-ROM in mode 1 (vanilla cdrom)	*/
#define	ST_ROM_MODE2	2	/* CD-ROM in mode 2			*/
#define	ST_AUDIO_NOPRE	4	/* CD-DA stereo without preemphasis	*/
#define	ST_AUDIO_PRE	5	/* CD-DA stereo with preemphasis	*/

#define	ST_PREEMPMASK	0x01	/* Mask for preemphasis bit		*/
#define	ST_AUDIOMASK	0x04	/* Mask for audio bit			*/
#define	ST_MODEMASK	0x03	/* Mask for mode bits in sector type	*/
#define	ST_MASK		0x07	/* Mask needed for sectname[]		*/

/*
 * There are 6 different generic basic sector types.
 */
#define	ST_MODE_AUDIO	 0x00	/* Generic Audio mode			*/
#define	ST_MODE_0	 0x10	/* Generic Zero mode			*/
#define	ST_MODE_1	 0x20	/* Generic CD-ROM mode	(ISO/IEC 10149)	*/
#define	ST_MODE_2	 0x30	/* Generic Mode 2	(ISO/IEC 10149)	*/
#define	ST_MODE_2_FORM_1 0x40	/* Generic Mode 2 form 1		*/
#define	ST_MODE_2_FORM_2 0x50	/* Generic Mode 2 form 2		*/
#define	ST_MODE_2_MIXED	 0x60	/* Generic Mode 2 mixed form (1/2)	*/

#define	ST_MODE_MASK	 0x70	/* Mask needed to get generic sectype	*/

#define	ST_MODE_RAW	 0x08	/* Do not touch EDC & subchannels	*/
#define	ST_NOSCRAMBLE	 0x80	/* Do not srcamble sectors 		*/

#define	SECT_AUDIO	(ST_AUDIO_NOPRE  | ST_MODE_AUDIO)
#define	SECT_AUDIO_NOPRE (ST_AUDIO_NOPRE | ST_MODE_AUDIO)
#define	SECT_AUDIO_PRE	(ST_AUDIO_PRE    | ST_MODE_AUDIO)
#define	SECT_MODE_0	(ST_ROM_MODE1    | ST_MODE_0)
#define	SECT_ROM	(ST_ROM_MODE1    | ST_MODE_1)
#define	SECT_MODE_2	(ST_ROM_MODE2    | ST_MODE_2)
#define	SECT_MODE_2_F1	(ST_ROM_MODE2    | ST_MODE_2_FORM_1)
#define	SECT_MODE_2_F2	(ST_ROM_MODE2    | ST_MODE_2_FORM_2)
#define	SECT_MODE_2_MIX	(ST_ROM_MODE2    | ST_MODE_2_MIXED)

extern	char	*st2name[];	/* Convert sector type to name		*/
extern	int	st2mode[];	/* Convert sector type to control nibble*/

/*
 * Control nibble bits:
 *
 * 0	with preemphasis (audio) / incremental (data)
 * 1	digital copy permitted
 * 2	data (not audio) track
 * 3	4 channels (not 2)
 */
#define	TM_PREEM	0x1	/* Audio track with preemphasis	*/
#define	TM_INCREMENTAL	0x1	/* Incremental data track	*/
#define	TM_ALLOW_COPY	0x2	/* Digital copy permitted	*/
#define	TM_DATA		0x4	/* This is a data track		*/
#define	TM_QUADRO	0x8	/* Four channel audio		*/

/*
 * Adr nibble:
 */
#define	ADR_NONE	0	/* Sub-Q mode info not supplied		*/
#define	ADR_POS		1	/* Sub-Q encodes position data		*/
#define	ADR_MCN		2	/* Sub-Q encodes Media Catalog Number	*/
#define	ADR_ISRC	3	/* Sub-Q encodes ISRC			*/

/*
 * Defines for write type (from SCSI-3/mmc)
 */
#define	WT_PACKET	0x0	/* Packet writing	*/
#define	WT_TAO		0x1	/* Track at once	*/
#define	WT_SAO		0x2	/* Session at once	*/
#define	WT_RAW		0x3	/* Raw			*/
#define	WT_RES_4	0x4	/* Reserved		*/
#define	WT_RES_5	0x5	/* Reserved		*/
#define	WT_RES_6	0x6	/* Reserved		*/
#define	WT_RES_7	0x7	/* Reserved		*/
#define	WT_RES_8	0x8	/* Reserved		*/
#define	WT_RES_9	0x9	/* Reserved		*/
#define	WT_RES_A	0xA	/* Reserved		*/
#define	WT_RES_B	0xB	/* Reserved		*/
#define	WT_RES_C	0xC	/* Reserved		*/
#define	WT_RES_D	0xD	/* Reserved		*/
#define	WT_RES_E	0xE	/* Reserved		*/
#define	WT_RES_F	0xF	/* Reserved		*/

/*
 * Data block layout:
 *
 *	-	Sync pattern 12 Bytes:	0x00 0xFF 0xFF ... 0xFF 0xFF 0x00
 *	-	Block header 4  Bytes:	| minute | second | frame | mode |
 *		Mode byte:
 *			Bits 7, 6, 5	Run-in/Run-out/Link
 *			Bits 4, 3, 2	Reserved
 *			Bits 1, 0	Mode
 *	-	Rest of sector see below.
 *
 * Mode 0 Format:
 *	0	12   Bytes Sync header
 *	12	4    Bytes Block header with Data mode == 0
 *	16	2336 Bytes of zero data
 *
 * Mode 1 Format:
 *	0	12   Bytes Sync header
 *	12	4    Bytes Block header with Data mode == 1
 *	16	2048 Bytes of user data
 *	2064	4    Bytes CRC for Bytes 0-2063
 *	2068	8    Bytes Zero fill
 *	2076	172  Bytes P parity symbols
 *	2248	104  Bytes Q parity symbols
 *
 * Mode 2 Format (formless):
 *	0	12   Bytes Sync header
 *	12	4    Bytes Block header with Data mode == 2
 *	16	2336 Bytes of user data
 *
 * Mode 2 form 1 Format:
 *	0	12   Bytes Sync header
 *	12	4    Bytes Block header with Data mode == 2
 *	16	4    Bytes subheader first copy
 *	20	4    Bytes subheader second copy
 *	24	2048 Bytes of user data
 *	2072	4    Bytes CRC for Bytes 16-2071
 *	2076	172  Bytes P parity symbols
 *	2248	104  Bytes Q parity symbols
 *
 * Mode 2 form 2 Format:
 *	0	12   Bytes Sync header
 *	12	4    Bytes Block header with Data mode == 2
 *	16	4    Bytes subheader first copy
 *	20	4    Bytes subheader second copy
 *	24	2324 Bytes of user data
 *	2348	4    Bytes Optional CRC for Bytes 16-2347
 */

/*
 * Mode Byte definitions (the 4th Byte in the Block header)
 */
#define	SH_MODE_DATA	0x00	/* User Data Block	*/
#define	SH_MODE_RI4	0x20	/* Fourth run in Block	*/
#define	SH_MODE_RI3	0x40	/* Third run in Block	*/
#define	SH_MODE_RI2	0x60	/* Second run in Block	*/
#define	SH_MODE_RI1	0x80	/* First run in Block	*/
#define	SH_MODE_LINK	0xA0	/* Link Block		*/
#define	SH_MODE_RO2	0xC0	/* Second run out Block	*/
#define	SH_MODE_RO1	0xE0	/* First run out Block	*/
#define	SH_MODE_M0	0x00	/* Mode 0 Data		*/
#define	SH_MODE_M1	0x01	/* Mode 1 Data		*/
#define	SH_MODE_M2	0x02	/* Mode 2 Data		*/
#define	SH_MODE_MR	0x03	/* Reserved		*/

/*
 * Defines for data block type (from SCSI-3/mmc)
 *
 * Mandatory are only:
 *	DB_ROM_MODE1	(8)	Mode 1     (ISO/IEC 10149)
 *	DB_XA_MODE2	(10)	Mode 2-F1  (CD-ROM XA form 1)
 *	DB_XA_MODE2_MIX	(13)	Mode 2-MIX (CD-ROM XA 1/2+subhdr)
 */
#define	DB_RAW		0	/* 2352 bytes of raw data		  */
#define	DB_RAW_PQ	1	/* 2368 bytes (raw data + P/Q Subchannel) */
#define	DB_RAW_PW	2	/* 2448 bytes (raw data + P-W Subchannel) */
#define	DB_RAW_PW_R	3	/* 2448 bytes (raw data + P-W raw Subchannel)*/
#define	DB_RES_4	4	/* -	Reserved			  */
#define	DB_RES_5	5	/* -	Reserved			  */
#define	DB_RES_6	6	/* -	Reserved			  */
#define	DB_VU_7		7	/* -	Vendor specific			  */
#define	DB_ROM_MODE1	8	/* 2048 bytes Mode 1 (ISO/IEC 10149)	  */
#define	DB_ROM_MODE2	9	/* 2336 bytes Mode 2 (ISO/IEC 10149)	  */
#define	DB_XA_MODE2	10	/* 2048 bytes Mode 2 (CD-ROM XA form 1)   */
#define	DB_XA_MODE2_F1	11	/* 2056 bytes Mode 2 (CD-ROM XA form 1)	  */
#define	DB_XA_MODE2_F2	12	/* 2324 bytes Mode 2 (CD-ROM XA form 2)	  */
#define	DB_XA_MODE2_MIX	13	/* 2332 bytes Mode 2 (CD-ROM XA 1/2+subhdr) */
#define	DB_RES_14	14	/* -	Reserved			  */
#define	DB_VU_15	15	/* -	Vendor specific			  */

extern	char	*db2name[];	/* Convert data block type to name	  */

/*
 * Defines for multi session type (from SCSI-3/mmc)
 */
#define	MS_NONE		0	/* No B0 pointer. Next session not allowed*/
#define	MS_FINAL	1	/* B0 = FF:FF:FF. Next session not allowed*/
#define	MS_RES		2	/* Reserved				  */
#define	MS_MULTI	3	/* B0 = Next PA.  Next session allowed	  */

/*
 * Defines for session format (from SCSI-3/mmc)
 */
#define	SES_DA_ROM	0x00	/* CD-DA or CD-ROM disk			  */
#define	SES_CDI		0x10	/* CD-I disk				  */
#define	SES_XA		0x20	/* CD-ROM XA disk			  */
#define	SES_UNDEF	0xFF	/* Undefined disk type (read disk info)	  */

/*
 * Defines for blanking of CD-RW discs (from SCSI-3/mmc)
 */
#define	BLANK_DISC	0x00	/* Erase the entire disc		  */
#define	BLANK_MINIMAL	0x01	/* Erase the PMA, 1st session TOC, pregap */
#define	BLANK_TRACK	0x02	/* Erase an incomplete track		  */
#define	BLANK_UNRESERVE	0x03	/* Unreserve a track			  */
#define	BLANK_TAIL	0x04	/* Erase the tail of a track		  */
#define	BLANK_UNCLOSE	0x05	/* Unclose the last session		  */
#define	BLANK_SESSION	0x06	/* Erase the last session		  */

/*
 * Defines for formating DVD (custom values)
 */
#define	FULL_FORMAT       0x00    /* Interactive format  */
#define	BACKGROUND_FORMAT 0x01    /* Background format   */
#define	FORCE_FORMAT      0x02    /* Force reformat      */

/*
 * Defines for formating DVD (custom values)
 */
#define	FULL_FORMAT       0x00    /* Interactive format  */
#define	BACKGROUND_FORMAT 0x01    /* Background format   */
#define	FORCE_FORMAT      0x02    /* Force reformat      */

/*
 * Useful definitions for audio tracks
 */
#define	msample		(44100 * 2)		/* one 16bit audio sample */
#define	ssample		(msample * 2)		/* one stereo sample	*/
#define	samples(v)	((v) / ssample)		/* # of stereo samples	*/
#define	hsamples(v)	((v) / (ssample/100))	/* 100* # of stereo samples/s*/
#define	fsamples(v)	((v) / (ssample/75))	/* 75* # of stereo samples/s */

#define	minutes(v)	((int)(samples(v) / 60))
#define	seconds(v)	((int)(samples(v) % 60))
#define	hseconds(v)	((int)(hsamples(v) % 100))
#define	frames(v)	((int)(fsamples(v) % 75))

/*
 * sector based macros
 */
#define	Sminutes(s)	((int)((s) / (60*75)))
#define	Sseconds(s)	((int)((s) / 75))
#define	Shseconds(s)	((int)(((s) % 75)*100)/75)
#define	Sframes(s)	((int)((s) % 75))

typedef struct msf {
	char	msf_min;
	char	msf_sec;
	char	msf_frame;
} msf_t;

/*
 * Definitions for read TOC/PMA/ATIP command
 */
#define	FMT_TOC		0
#define	FMT_SINFO	1
#define	FMT_FULLTOC	2
#define	FMT_PMA		3
#define	FMT_ATIP	4
#define	FMT_CDTEXT	5

/*
 * Definitions for read disk information "recording flags"
 * used in UInt16_t "ds_cdrflags".
 */
#define	RF_WRITE	0x0001	/* Disk is going to be written		*/
#define	RF_BLANK	0x0002	/* Disk is going to be erased		*/
#define	RF_PRATIP	0x0004	/* Print ATIP info			*/
#define	RF_LEADIN	0x0008	/* Lead-in has been "manually" written	*/
#define	RF_BURNFREE	0x0010	/* BUFFER underrun free recording	*/
#define	RF_VARIREC	0x0020	/* Plextor VariRec			*/
#define	RF_AUDIOMASTER	0x0040	/* Yamaha AudioMaster			*/
#define	RF_FORCESPEED	0x0080	/* WriteSpeed forced high		*/
#define	RF_DID_STAT	0x0100	/* Already did call cdrstats()		*/
#define	RF_DID_CDRSTAT	0x0200	/* Already did call (*dp->cdr_stats)()	*/
#define	RF_WR_WAIT	0x0400	/* Wait during writing to free bus	*/
#define	RF_SINGLESESS	0x0800	/* Plextor single sess. mode		*/
#define	RF_HIDE_CDR	0x1000	/* Plextor hide CDR features		*/
#define	RF_SPEEDREAD	0x2000	/* Plextor SpeedReed			*/
#define	RF_GIGAREC	0x4000	/* Plextor GigaRec			*/

/*
 * Definitions for read disk information "disk status"
 * used in "ds_diskstat".
 */
#define	DS_EMPTY	0	/* Empty disk				*/
#define	DS_APPENDABLE	1	/* Incomplete disk (appendable)		*/
#define	DS_COMPLETE	2	/* Complete disk (closed/no B0 pointer)	*/
#define	DS_RESERVED	3	/* Reserved				*/

/*
 * Definitions for read disk information "session status"
 * used in "ds_sessstat".
 */
#define	SS_EMPTY	0	/* Empty session			*/
#define	SS_APPENDABLE	1	/* Incomplete session			*/
#define	SS_RESERVED	2	/* Reserved				*/
#define	SS_COMPLETE	3	/* Complete session (needs DS_COMPLETE)	*/

/*
 * Definitions for disk_status write mode
 * used in "ds_wrmode".
 */
#define	WM_NONE		0	/* No write mode selected		*/
#define	WM_BLANK	1	/* Blanking mode			*/
#define	WM_FORMAT	2	/* Formatting				*/
#define	WM_PACKET	4	/* Packet writing			*/
#define	WM_TAO		8	/* Track at Once			*/
#define	WM_SAO		12	/* Session at Once w/ cooked sectors	*/
#define	WM_SAO_RAW16	13	/* Session at Once RAW+16 byte sectors	*/
#define	WM_SAO_RAW96P	14	/* Session at Once RAW+96P byte sectors	*/
#define	WM_SAO_RAW96R	15	/* Session at Once RAW+96R byte sectors	*/
#define	WM_RAW		16	/* RAW with cooked sectors is impossible*/
#define	WM_RAW_RAW16	17	/* RAW with RAW+16 byte sectors		*/
#define	WM_RAW_RAW96P	18	/* RAW with RAW+96P byte sectors	*/
#define	WM_RAW_RAW96R	19	/* RAW with RAW+96R byte sectors	*/

#define	wm_base(wm)	((wm)/4*4) /* The basic write mode for this mode */

/*
 * Definitions for disk_status flags
 * used in UInt16_t "ds_flags".
 */
#define	DSF_DID_V	0x0001	/* Disk id valid			*/
#define	DSF_DBC_V	0x0002	/* Disk bar code valid			*/
#define	DSF_URU		0x0004	/* Disk is for unrestricted use		*/
#define	DSF_ERA		0x0008	/* Disk is erasable			*/
#define	DSF_HIGHSP_ERA	0x0010	/* Disk is high speed erasable		*/
#define	DSF_ULTRASP_ERA	0x0020	/* Disk is ultra speed erasable		*/
#define	DSF_ULTRASPP_ERA 0x0040	/* Disk is ultra speed+ erasable	*/


#define	DSF_DVD		0x0100	/* Disk is a DVD			*/
#define	DSF_DVD_PLUS_R	0x0200	/* Disk is a DVD+R			*/
#define	DSF_DVD_PLUS_RW	0x0400	/* Disk is a DVD+RW			*/
#define	DSF_NEED_FORMAT	0x0800	/* Disk needs to be formatted		*/

/*
 * Definitions for disktype flags
 */
#define DT_CD           0x001  /*is a CD                                */
#define DT_DVD          0x002  /*is a DVD                               */

/*
 * Definitions for disktype flags
 */
#define DT_CD           0x001  /*is a CD                                */
#define DT_DVD          0x002  /*is a DVD                               */

/*
 * Definitions for disk_status disk type
 * used in "ds_type".
 */
/* None defined yet */

typedef	struct disk_status	dstat_t;

struct disk_status {
	UInt32_t ds_diskid;		/* Disk identification		*/
	UInt16_t ds_cdrflags;		/* Recording flags from cdrecord*/
	UInt16_t ds_flags;		/* Disk_status flags		*/
	Uchar	 ds_wrmode;		/* Selected write mode		*/
	Uchar	 ds_type;		/* Abstract disk type		*/

	Uchar	 ds_disktype;		/* Disk type (from TOC/PMA)	*/
	Uchar	 ds_diskstat;		/* Disk status (MMC)		*/
	Uchar	 ds_sessstat;		/* Status of last sesion (MMC)	*/
	Uchar	 ds_trfirst;		/* first track #		*/
	Uchar	 ds_trlast;		/* last track #			*/
	Uchar	 ds_trfirst_ls;		/* first track # in last session*/
	Uchar	 ds_barcode[8];		/* Disk bar code		*/

	Int32_t	 ds_first_leadin;	/* Start of first lead in (ATIP)*/
	Int32_t	 ds_last_leadout;	/* Start of last lead out (ATIP)*/
	Int32_t	 ds_curr_leadin;	/* Start of next lead in	*/
	Int32_t	 ds_curr_leadout;	/* Start of next lead out	*/

	Int32_t	 ds_maxblocks;		/* # of official blocks on disk	*/
	Int32_t	 ds_maxrblocks;		/* # real blocks on disk	*/
	Int32_t	 ds_fwa;		/* first writable addr		*/

	Int32_t	 ds_startsec;		/* Actual start sector		*/
	Int32_t	 ds_endsec;		/* Actual end sector		*/
	Int32_t	 ds_buflow;		/* # of times drive buffer empty*/

	UInt16_t ds_minbuf;		/* Minimum drive bufer fill rt.	*/

	UInt16_t ds_at_min_speed;	/* The minimal ATIP write speed	*/
	UInt16_t ds_at_max_speed;	/* The maximal ATIP write speed	*/
	UInt16_t ds_dr_cur_rspeed;	/* The drive's cur read speed	*/
	UInt16_t ds_dr_max_rspeed;	/* The drive's max read speed	*/
	UInt16_t ds_dr_cur_wspeed;	/* The drive's cur write speed	*/
	UInt16_t ds_dr_max_wspeed;	/* The drive's max write speed	*/
	UInt16_t ds_wspeed;		/* The selected/drive wr. speed */
};

/*
 * First approach of a CDR device abstraction layer.
 * This interface will change as long as I did not find the
 * optimum that fits for all devices.
 *
 * Called with pointer to whole track array:
 *	cdr_send_cue()
 *	cdr_write_leadin()
 *	cdr_open_session()
 *	cdr_fixate()
 *
 * Called with (track_t *) 0 or pointer to current track:
 *	cdr_next_wr_address()
 *
 * Called with pointer to current track:
 *	cdr_open_track()
 *	cdr_close_track()
 *
 * Calling sequence:
 *	cdr_identify()					May modify driver
 *	Here, the cdr_t will be allocated and
 *	copied to a new writable area.
 *	cdr_attach()					Get drive properties
 *	cdr_buffer_cap()
 *	cdr_getdisktype()				GET ATIP
 *	cdr_init()					set TAO for -msinfo
 *	cdr_check_session				XXX ????
 *	cdr_opt1()					set early options
 *	cdr_set_speed_dummy(usalp, dp, &speed)
 *	<---	Grace time processing goes here
 *	{ do_opc(); cdr_blank() }
 *	cdr_opt2()					set late options
 *	cdr_open_session()				set up params (no wrt.)
 *	do_opc()
 *	cdr_write_leadin()				start writing
 *	LOOP {
 *		cdr_open_track()
 *		cdr_next_wr_address()			only TAO / Packet
 *		write_track_data()
 *		cdr_close_track()
 *	}
 *	write_leadout()				XXX should go -> driver!
 *	cdr_fixate()
 *	cdr_stats()
 */
/*--------------------------------------------------------------------------*/
typedef	struct cdr_cmd	cdr_t;

#ifdef	_SCG_SCSITRANSP_H
struct cdr_cmd {
	int	cdr_dev;						/* Numerical device type */
	UInt32_t cdr_cmdflags;			/* Command line options */
	UInt32_t cdr_flags;				/* Drive related flags	*/
	UInt8_t	 cdr_cdrw_support;	/* CD-RW write media types */
	UInt16_t cdr_speeddef;			/* Default write speed	*/
	UInt16_t cdr_speedmax;			/* Max. write speed	*/

	char	*cdr_drname;				/* Driver ID string	*/
	char	*cdr_drtext;				/* Driver ID text	*/
	struct cd_mode_page_2A *cdr_cdcap;
	dstat_t	*cdr_dstat;
#ifdef	_SCG_SCSIREG_H
	/* identify drive */
	cdr_t	*(*cdr_identify)(SCSI *usalp, cdr_t *, struct scsi_inquiry *);	
#else
	/* identify drive */
	cdr_t	*(*cdr_identify)(SCSI *usalp, cdr_t *, void *);		
#endif
	/* init error decoding etc*/
	int	(*cdr_attach)(SCSI *usalp, cdr_t *);
	/* init drive to useful deflts */
	int	(*cdr_init)(SCSI *usalp, cdr_t *);
	/* get disk type */
	int	(*cdr_getdisktype)(SCSI *usalp, cdr_t *);
	/* load disk */
	int	(*cdr_load)(SCSI *usalp, cdr_t *);
	/* unload disk */
	int	(*cdr_unload)(SCSI *usalp, cdr_t *);	
	/* read buffer capacity */
	int	(*cdr_buffer_cap)(SCSI *usalp, long *sizep, long *freep);
	/* check if recover is needed */
	int	(*cdr_check_recovery)(SCSI *usalp, cdr_t *);
	/* do recover */
	int	(*cdr_recover)(SCSI *usalp, cdr_t *, int track);
	/* set recording speed & dummy write */
	int	(*cdr_set_speed_dummy)(SCSI *usalp, cdr_t *, int *speedp);
	/* set sector size */
	int	(*cdr_set_secsize)(SCSI *usalp, int secsize);
	/* get next writable addr. */
	int	(*cdr_next_wr_address)(SCSI *usalp, track_t *trackp, long *ap);
	/* reserve track for future use */
	int	(*cdr_reserve_track)(SCSI *usalp, Ulong len);
	int	(*cdr_write_trackdata)(SCSI *usalp, caddr_t buf, long daddr, long bytecnt, 
										  int seccnt, BOOL islast);
	/* generate cue sheet */
	int	(*cdr_gen_cue)(track_t *trackp, void *cuep, BOOL needgap);
	/* send cue sheet */
	int	(*cdr_send_cue)(SCSI *usalp, cdr_t *, track_t *trackp);
	/* write leadin */
	int	(*cdr_write_leadin)(SCSI *usalp, cdr_t *, track_t *trackp);
	/* open new track */
	int	(*cdr_open_track)(SCSI *usalp, cdr_t *, track_t *trackp);
	/* close written track */
	int	(*cdr_close_track)(SCSI *usalp, cdr_t *, track_t *trackp);
	/* open new session */
	int	(*cdr_open_session)(SCSI *usalp, cdr_t *, track_t *trackp);
	/* really needed ??? */
	int	(*cdr_close_session)(SCSI *usalp, cdr_t *);
	/* abort current write */
	int	(*cdr_abort_session)(SCSI *usalp, cdr_t *);
	/* read session offset*/
	int	(*cdr_session_offset)(SCSI *usalp, long *soff);
	/* write toc on disk */
	int	(*cdr_fixate)(SCSI *usalp, cdr_t *, track_t *trackp);
	/* final statistics printing*/
	int	(*cdr_stats)(SCSI *usalp, cdr_t *);
	/* blank something */
	int	(*cdr_blank)(SCSI *usalp, cdr_t *, long addr, int blanktype);
	/* format media */
	int	(*cdr_format)(SCSI *usalp, cdr_t *, int fmtflags);
	/* Do OPC */
	int	(*cdr_opc)(SCSI *usalp, caddr_t bp, int cnt, int doopc);
	/* do early option processing*/
	int	(*cdr_opt1)(SCSI *usalp, cdr_t *);
	/* do late option processing */
	int	(*cdr_opt2)(SCSI *usalp, cdr_t *);
	/* calculate optimale split */
	int	(*cdr_layer_split)(SCSI *usalp, cdr_t *, long tsize);
	int	profile;
	BOOL	is_dvd;
};
#endif

/*
 * Definitions for cdr_flags
 */
#define	CDR_TAO		0x01		/* Drive supports Track at once	*/
#define	CDR_SAO		0x02		/* Drive supports Sess at once	*/
#define	CDR_PACKET	0x04		/* Drive supports packet writing*/
#define	CDR_RAW		0x08		/* Drive supports raw writing	*/
#define	CDR_RAW16	0x10		/* Drive supports RAW raw16	*/
#define	CDR_RAW96P	0x20		/* Drive supports RAW raw96 pak	*/
#define	CDR_RAW96R	0x40		/* Drive supports RAW raw96 raw	*/
#ifdef	__needed__
#define	CDR_SRAW16	0x100		/* Drive supports SAO raw16	*/
#endif
#define	CDR_SRAW96P	0x200		/* Drive supports SAO raw96 pak	*/
#define	CDR_SRAW96R	0x400		/* Drive supports SAO raw96 raw */
#define	CDR_SWABAUDIO	0x1000		/* Drive swabs audio data	*/
#define	CDR_ISREADER	0x2000		/* Drive is s CD-ROM reader	*/
#define	CDR_TRAYLOAD	0x4000		/* Drive loads CD with tray	*/
#define	CDR_CADDYLOAD	0x8000		/* Drive loads CD with caddy	*/
#define	CDR_NO_LOLIMIT	0x10000		/* Drive ignores lead-out limit	*/
#define	CDR_DVD		0x20000		/* Drive is a DVD drive		*/
#define	CDR_SIMUL	0x40000		/* Drive is simulated		*/
#define	CDR_BURNFREE	0x80000		/* Drive sup. BUFund. free rec.	*/
#define	CDR_VARIREC	0x100000	/* Drive sup. VariRec	 Plex.	*/
#define	CDR_AUDIOMASTER	0x200000	/* Drive sup. AudioMaster Yamah.*/
#define	CDR_FORCESPEED	0x400000	/* Drive sup. WriteSpeed ctl.	*/
#define	CDR_DISKTATTOO	0x800000	/* Drive sup. Yamaha DiskT@2	*/
#define	CDR_SINGLESESS	0x1000000	/* Drive sup. single sess. mode */
#define	CDR_HIDE_CDR	0x2000000	/* Drive sup. hide CDR features	*/
#define	CDR_SPEEDREAD	0x4000000	/* Drive sup. SpeedReed		*/
#define	CDR_GIGAREC	0x8000000	/* Drive sup. GigaRec	 Plex.	*/
#define	CDR_MMC		0x10000000	/* Drive is MMC compliant	*/
#define	CDR_MMC2	0x20000000	/* Drive is MMC-2 compliant	*/
#define	CDR_MMC3	0x40000000	/* Drive is MMC-3 compliant	*/
#ifdef	PROTOTYPES
#define	CDR_ALLOC	0x80000000UL	/* structure is allocated	*/
#else
#define	CDR_ALLOC	0x80000000	/* structure is allocated	*/
#endif

/*
 * Definitions for cdr_cdrw_support
 */
#define	CDR_CDRW_NONE	0x00		/* CD-RW writing not supported */
#define	CDR_CDRW_MULTI	0x01		/* CD-RW multi speed supported */
#define	CDR_CDRW_HIGH	0x02		/* CD-RW high speed supported */
#define	CDR_CDRW_ULTRA	0x04		/* CD-RW ultra high speed supported */
#define	CDR_CDRW_ULTRAP	0x08		/* CD-RW ultra high speed+ supported */
#define	CDR_CDRW_ALL	0xFF		/* All bits set: unknown - support all */

/*
 * cdrecord.c
 */
extern	int	read_buf(int f, char *bp, int size);
extern	int	fill_buf(int f, track_t *trackp, long secno, char *bp, int size);
extern	int	get_buf(int f, track_t *trackp, long secno, char **bpp, int size);
#ifdef	_SCG_SCSITRANSP_H
extern	int	write_secs(SCSI *usalp, cdr_t *dp, char *bp, long startsec, 
								  int bytespt, int secspt, BOOL islast);
extern	int	pad_track(SCSI *usalp, cdr_t *dp, track_t *trackp,
								 long startsec, Llong amt,
								 BOOL dolast, Llong *bytesp);
extern	void	load_media(SCSI *usalp, cdr_t *, BOOL);
extern	void	unload_media(SCSI *usalp, cdr_t *, int);
extern	void	reload_media(SCSI *usalp, cdr_t *);
#endif
extern	void	raisepri(int);
extern	int	getnum(char *arg, long *valp);

/*
 * cd_misc.c
 */
extern	int	from_bcd(int b);
extern	int	to_bcd(int i);
extern	long	msf_to_lba(int m, int s, int f, BOOL force_positive);
extern	BOOL	lba_to_msf(long lba, msf_t *mp);
extern	void	sec_to_msf(long sec, msf_t *mp);
extern	void	print_min_atip(long li, long lo);

/*
 * fifo.c
 */
extern	void	init_fifo(long);
extern	BOOL	init_faio(track_t *track, int);
extern	BOOL	await_faio(void);
extern	void	kill_faio(void);
extern	int	wait_faio(void);
extern	int	faio_read_buf(int f, char *bp, int size);
extern	int	faio_get_buf(int f, char **bpp, int size);
extern	void	fifo_stats(void);
extern	int	fifo_percent(BOOL addone);

/*
 * wm_session.c
 */
#ifdef	_SCG_SCSITRANSP_H
extern	int	write_session_data(SCSI *usalp, cdr_t *dp, track_t *trackp);
#endif

/*
 * wm_track.c
 */
#ifdef	_SCG_SCSITRANSP_H
/*extern	int	write_track_data __PR((SCSI *usalp, cdr_t *dp, track_t *trackp));*/
#endif

/*
 * wm_packet.c
 */
#ifdef	_SCG_SCSITRANSP_H
extern	int	write_packet_data(SCSI *usalp, cdr_t *dp, track_t *trackp);
#endif

/*
 * modes.c
 */
#ifdef	_SCG_SCSITRANSP_H
extern	BOOL	get_mode_params(SCSI *usalp, int page, char *pagename,
										 Uchar *modep, Uchar *cmodep,
										 Uchar *dmodep, Uchar *smodep,
										 int *lenp);
extern	BOOL	set_mode_params(SCSI *usalp, char *pagename, Uchar *modep,
										 int len, int save, int secsize);
#endif

/*
 * misc.c
 */
#ifdef	timerclear
extern	void	timevaldiff(struct timeval *start, struct timeval *stop);
extern	void	prtimediff(const char *fmt, struct timeval *start,
								  struct timeval *stop);
#endif

/*
 * getnum.c
 */
extern	int	getnum(char *arg, long *valp);
extern	int	getllnum(char *arg, Llong *lvalp);

/*
 * scsi_cdr.c
 */
#ifdef	_SCG_SCSITRANSP_H
extern	BOOL	unit_ready(SCSI *usalp);
extern	BOOL	wait_unit_ready(SCSI *usalp, int secs);
extern	BOOL	scsi_in_progress(SCSI *usalp);
extern	BOOL	cdr_underrun(SCSI *usalp);
extern	int	test_unit_ready(SCSI *usalp);
extern	int	rezero_unit(SCSI *usalp);
extern	int	request_sense(SCSI *usalp);
extern	int	request_sense_b(SCSI *usalp, caddr_t bp, int cnt);
extern	int	inquiry(SCSI *usalp, caddr_t, int);
extern	int	read_capacity(SCSI *usalp);
#ifdef	EOF	/* stdio.h has been included */
extern	void	print_capacity(SCSI *usalp, FILE *f);
#endif
extern	int	scsi_load_unload(SCSI *usalp, int);
extern	int	scsi_prevent_removal(SCSI *usalp, int);
extern	int	scsi_start_stop_unit(SCSI *usalp, int, int, BOOL immed);

#define	ROTCTL_CLV	0	/* CLV or PCAV	*/
#define	ROTCTL_CAV	1	/* True CAV	*/

extern	int	scsi_set_speed(SCSI *usalp, int readspeed, int writespeed, 
										int rotctl);
extern	int	scsi_get_speed(SCSI *usalp, int *readspeedp, int *writespeedp);
extern	int	qic02(SCSI *usalp, int);
extern	int	write_xscsi(SCSI *usalp, caddr_t, long, long, int);
extern	int	write_xg0(SCSI *usalp, caddr_t, long, long, int);
extern	int	write_xg1(SCSI *usalp, caddr_t, long, long, int);
extern	int	write_xg5(SCSI *usalp, caddr_t, long, long, int);
extern	int	seek_scsi(SCSI *usalp, long addr);
extern	int	seek_g0(SCSI *usalp, long addr);
extern	int	seek_g1(SCSI *usalp, long addr);
extern	int	scsi_flush_cache(SCSI *usalp, BOOL immed);
extern	int	read_buffer(SCSI *usalp, caddr_t bp, int cnt, int mode);
extern	int	write_buffer(SCSI *usalp, char *buffer, long length, int mode, 
									 int bufferid, long offset);
extern	int	read_subchannel(SCSI *usalp, caddr_t bp, int track, int cnt, 
										 int msf, int subq, int fmt);
extern	int	read_toc(SCSI *usalp, caddr_t, int, int, int, int);
extern	int	read_toc_philips(SCSI *usalp, caddr_t, int, int, int, int);
extern	int	read_header(SCSI *usalp, caddr_t, long, int, int);
extern	int	read_disk_info(SCSI *usalp, caddr_t, int);

#define	TI_TYPE_LBA	0	/* Address is LBA */
#define	TI_TYPE_TRACK	1	/* Address: 0 -> TOC, xx -> Track xx, 0xFF -> Inv Track */
#define	TI_TYPE_SESS	2	/* Address is session # */
extern	int	read_track_info(SCSI *usalp, caddr_t, int type, int addr, int cnt);
extern	int	read_rzone_info(SCSI *usalp, caddr_t bp, int cnt);
extern	int	reserve_tr_rzone(SCSI *usalp, long size);
extern	int	read_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int addr, 
											 int layer, int fmt);
extern	int	send_dvd_structure(SCSI *usalp, caddr_t bp, int cnt, int layer, 
											 int fmt);
extern	int	send_opc(SCSI *usalp, caddr_t, int cnt, int doopc);

#define	CL_TYPE_STOP_DEICE	0	/* Stop De-icing a DVD+RW Media */
#define	CL_TYPE_TRACK		1	/* Close Track # */
#define	CL_TYPE_SESSION		2	/* Close Session/Border / Stop backgrnd. format */
#define	CL_TYPE_INTER_BORDER	3	/* Close intermediate Border */
#define	CL_TYPE_OPEN_SESSION	4	/* Close the Open Session and Record an Extended lead-out */
#define	CL_TYPE_FINALISE_MINRAD	5	/* Finalize the Disc with a Minimum Recorded Radius */
#define	CL_TYPE_FINALISE	6	/* Finalize the disc */
extern	int	scsi_close_tr_session(SCSI *usalp, int type, int track, 
												 BOOL immed);
extern	int	read_master_cue(SCSI *usalp, caddr_t bp, int sheet, int cnt);
extern	int	send_cue_sheet(SCSI *usalp, caddr_t bp, long size);
extern	int	read_buff_cap(SCSI *usalp, long *, long *);
extern	int	scsi_blank(SCSI *usalp, long addr, int blanktype, BOOL immed);
extern	BOOL	allow_atapi(SCSI *usalp, BOOL new);
extern	int	mode_select(SCSI *usalp, Uchar *, int, int, int);
extern	int	mode_sense(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
extern	int	mode_select_sg0(SCSI *usalp, Uchar *, int, int, int);
extern	int	mode_sense_sg0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
extern	int	mode_select_g0(SCSI *usalp, Uchar *, int, int, int);
extern	int	mode_select_g1(SCSI *usalp, Uchar *, int, int, int);
extern	int	mode_sense_g0(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
extern	int	mode_sense_g1(SCSI *usalp, Uchar *dp, int cnt, int page, int pcf);
extern	int	read_tochdr(SCSI *usalp, cdr_t *, int *, int *);
extern	int	read_cdtext(SCSI *usalp);
extern	int	read_trackinfo(SCSI *usalp, int, long *, struct msf *, int *, 
										int *, int *);
extern	int	read_B0(SCSI *usalp, BOOL isbcd, long *b0p, long *lop);
extern	int	read_session_offset(SCSI *usalp, long *);
extern	int	read_session_offset_philips(SCSI *usalp, long *);
extern	int	sense_secsize(SCSI *usalp, int current);
extern	int	select_secsize(SCSI *usalp, int);
extern	BOOL	is_cddrive(SCSI *usalp);
extern	BOOL	is_unknown_dev(SCSI *usalp);
extern	int	read_scsi(SCSI *usalp, caddr_t, long, int);
extern	int	read_g0(SCSI *usalp, caddr_t, long, int);
extern	int	read_g1(SCSI *usalp, caddr_t, long, int);
extern	BOOL	getdev(SCSI *usalp, BOOL);
#ifdef	EOF	/* stdio.h has been included */
extern	void	printinq(SCSI *usalp, FILE *f);
#endif
extern	void	printdev(SCSI *usalp);
extern	BOOL	do_inquiry(SCSI *usalp, BOOL);
extern	BOOL	recovery_needed(SCSI *usalp, cdr_t *);
extern	int	scsi_load(SCSI *usalp, cdr_t *);
extern	int	scsi_unload(SCSI *usalp, cdr_t *);
extern	int	scsi_cdr_write(SCSI *usalp, caddr_t bp, long sectaddr, 
										long size, int blocks, BOOL islast);
extern	struct cd_mode_page_2A *mmc_cap(SCSI *usalp, Uchar *modep);
extern	void	mmc_getval(struct cd_mode_page_2A *mp, BOOL *cdrrp, BOOL *cdwrp,
								  BOOL *cdrrwp, BOOL *cdwrwp, BOOL *dvdp, BOOL *dvdwp);
extern	BOOL	is_mmc(SCSI *usalp, BOOL *cdwp, BOOL *dvdwp);
extern	BOOL	mmc_check(SCSI *usalp, BOOL *cdrrp, BOOL *cdwrp, BOOL *cdrrwp, 
								 BOOL *cdwrwp, BOOL *dvdp, BOOL *dvdwp);
extern	void	print_capabilities(SCSI *usalp);
#endif

/*
 * scsi_cdr.c
 */
#ifdef	_SCG_SCSITRANSP_H
extern	void	print_capabilities_mmc4(SCSI *usalp);
#endif

/*
 * scsi_mmc.c
 */
#ifdef	_SCG_SCSITRANSP_H
extern	int	get_configuration(SCSI *usalp, caddr_t bp, int cnt, 
											int st_feature, int rt);
extern	int	get_curprofile(SCSI *usalp);
extern	int	print_profiles(SCSI *usalp);
extern	int	get_proflist(SCSI *usalp, BOOL *wp, BOOL *cdp, BOOL *dvdp,
									 BOOL *dvdplusp, BOOL *ddcdp);
extern	int	get_wproflist(SCSI *usalp, BOOL *cdp, BOOL *dvdp,
									  BOOL *dvdplusp, BOOL *ddcdp);
extern char *mmc_obtain_profile_name(int profile_number);
#endif

/*
 * scsi_mmc.c
 */
#ifdef	_SCG_SCSITRANSP_H
extern	int	get_supported_cdrw_media_types(SCSI *usalp);
#endif

/*
 * mmc_misc.c
 */
#ifdef	_SCG_SCSITRANSP_H
extern	int	check_writemodes_mmc(SCSI *usalp, cdr_t *dp);
#endif	/* _SCG_SCSITRANSP_H */

/*
 * cdr_drv.c
 */
#ifdef	_SCG_SCSITRANSP_H
#ifdef	_SCG_SCSIREG_H
extern	cdr_t	*drive_identify(SCSI *usalp, cdr_t *, struct scsi_inquiry *ip);
#else
extern	cdr_t	*drive_identify(SCSI *usalp, cdr_t *, void *ip);
#endif
extern	int	drive_attach(SCSI *usalp, cdr_t *);
#endif
extern	int	attach_unknown(void);
#ifdef	_SCG_SCSITRANSP_H
extern	int	blank_dummy(SCSI *usalp, cdr_t *, long addr, int blanktype);
int	format_dummy(SCSI *usalp, cdr_t *, int fmtflags);
extern	int	drive_getdisktype(SCSI *usalp, cdr_t *dp);
extern	int	cmd_ill(SCSI *usalp);
extern	int	cmd_dummy(SCSI *usalp, cdr_t *);
extern	int	no_sendcue(SCSI *usalp, cdr_t *, track_t *trackp);
extern	int	buf_dummy(SCSI *usalp, long *sp, long *fp);
#endif
extern	BOOL	set_cdrcmds(char *name, cdr_t **dpp);
#ifdef	_SCG_SCSITRANSP_H
extern	cdr_t	*get_cdrcmds(SCSI *usalp);
#endif


/*
 * drv_mmc.c
 */
extern	void	mmc_opthelp(cdr_t *dp, int excode);
extern	char	*hasdrvopt(char *optstr, char *optname);
#ifdef	_SCG_SCSITRANSP_H
extern struct ricoh_mode_page_30 *get_justlink_ricoh(SCSI *usalp, Uchar *mode);
#endif

/*
 * isosize.c
 */
extern	Llong	isosize(int f);

/*
 * audiosize.c
 */
extern	BOOL	is_auname(const char *name);
extern	off_t	ausize(int f);
extern	BOOL	is_wavname(const char *name);
extern	off_t	wavsize(int f);

/*
 * auinfo.c
 */
extern	BOOL	auinfosize(char *name, track_t *trackp);
extern	void	auinfo(char *name, int track, track_t *trackp);
#ifdef CDTEXT_H
extern	textptr_t *gettextptr(int track, track_t *trackp);
#endif
extern	void	setmcn(char *mcn, track_t *trackp);
extern	void	setisrc(char *isrc, track_t *trackp);
extern	void	setindex(char *tindex, track_t *trackp);

/*
 * diskid.c
 */
extern	void	pr_manufacturer(msf_t *mp, BOOL rw, BOOL audio);
extern	int	manufacturer_id(msf_t *mp);
extern	long	disk_rcap(msf_t *mp, long maxblock, BOOL rw, BOOL audio);

/*--------------------------------------------------------------------------*/
/* Test only								    */
/*--------------------------------------------------------------------------*/
#ifdef _SCSIMMC_H
/*extern	int	do_cue		__PR((track_t *trackp, struct mmc_cue **cuep));*/
#else
/*extern	int	do_cue		__PR((track_t *trackp, void *cuep));*/
#endif

/*
 * subchan.c
 */
extern	int	do_leadin(track_t *trackp);
#ifdef	_SCG_SCSITRANSP_H
extern	int	write_leadin(SCSI *usalp, cdr_t *dp, track_t *trackp, 
									 int leadinstart);
extern	int	write_leadout(SCSI *usalp, cdr_t *dp, track_t *trackp);
#endif
extern	void	fillsubch(track_t *trackp, Uchar *sp, int secno, int nsecs);
extern	void	filltpoint(Uchar *sub, int ctrl_adr, int point, msf_t *mp);
extern	void	fillttime(Uchar *sub, msf_t *mp);
extern	void	qpto96(Uchar *sub, Uchar *subq, int dop);
extern	void	addrw(Uchar *sub, Uchar	*subrwptr);
extern	void	qwto16(Uchar *subq, Uchar *subptr);
extern	void	subrecodesecs(track_t *trackp, Uchar *bp, int address, int nsecs);

/*
 * sector.c
 */
extern	int	encspeed(BOOL be_verbose);
extern	void	encsectors(track_t *trackp, Uchar *bp, int address, int nsecs);
extern	void	scrsectors(track_t *trackp, Uchar *bp, int address, int nsecs);
extern	void	encodesector(Uchar *sp, int sectype, int address);
extern	void	fillsector(Uchar *sp, int sectype, int address);

/*
 * clone.c
 */
extern	void	clone_toc(track_t *trackp);
extern	void	clone_tracktype(track_t *trackp);

/*
 * cdtext.c
 */
extern	BOOL	checktextfile(char *fname);
extern	void	packtext(int tracks, track_t *trackp);
#ifdef	_SCG_SCSITRANSP_H
extern	int	write_cdtext(SCSI *usalp, cdr_t *dp, long startsec);
#endif

/*
 * cue.c
 */
extern	int	parsecue(char *cuefname, track_t trackp[]);
#ifdef	EOF	/* stdio.h has been included */
extern	void	fparsecue(FILE *f, track_t trackp[]);
#endif