1 /* @(#)p_block.h	1.22 19/04/02 J. Schilling from cdparanoia-III-alpha9.8 */
2 /*
3  * CopyPolicy: GNU Lesser General Public License v2.1 applies
4  * Copyright (C) 1997-2001 by Monty (xiphmont@mit.edu)
5  * Copyright (C) 2002-2019 by J. Schilling
6  */
7 
8 #ifndef	_P_BLOCK_H
9 #define	_P_BLOCK_H
10 
11 #define	MIN_WORDS_OVERLAP	  64	/* 16 bit words */
12 #define	MIN_WORDS_SEARCH	  64	/* 16 bit words */
13 #define	MIN_WORDS_RIFT		  16	/* 16 bit words */
14 #define	MAX_SECTOR_OVERLAP	  32	/* sectors */
15 #define	MIN_SECTOR_EPSILON	 128	/* words */
16 #define	MIN_SECTOR_BACKUP	  16	/* sectors */
17 #define	JIGGLE_MODULO		  15	/* sectors */
18 #define	MIN_SILENCE_BOUNDARY	1024	/* 16 bit words */
19 
20 #undef	abs
21 #define	abs(x)		((x) < 0 ? -(x) : (x))
22 #undef	min
23 #define	min(x, y)	((x) < (y) ? (x) : (y))
24 #undef	max
25 #define	max(x, y)	((x) < (y) ? (y) : (x))
26 
27 #include "isort.h"
28 
29 typedef struct linked_list {
30 	/* linked list */
31 	struct linked_element	*head;
32 	struct linked_element	*tail;
33 
34 	void			*(*new_poly)	__PR((void));
35 	void			(*free_poly)	__PR((void *poly));
36 	long			current;
37 	long			active;
38 
39 } linked_list;
40 
41 typedef struct linked_element {
42 	void			*ptr;
43 	struct linked_element	*prev;
44 	struct linked_element	*next;
45 
46 	struct linked_list	*list;
47 	int			stamp;
48 } linked_element;
49 
50 extern linked_list	*new_list	__PR((void *(*newp) (void),
51 						void (*freep) (void *)));
52 extern linked_element	*new_elem	__PR((linked_list * list));
53 extern linked_element	*add_elem	__PR((linked_list * list, void *elem));
54 extern void		free_list	__PR((linked_list * list, int free_ptr));	/* unlink or free */
55 extern void		free_elem	__PR((linked_element * e, int free_ptr));	/* unlink or free */
56 extern void		*get_elem	__PR((linked_element * e));
57 extern linked_list	*copy_list	__PR((linked_list * list));	/* shallow; doesn't copy */
58 									/* contained structures */
59 
60 typedef struct c_block {
61 	Int16_t		*vector; /* The buffer */
62 	long		begin;	/* Begin diskoff, multiples of 16bit samples */
63 	long		size;	/* Size, multiples of 16bit samples */
64 	long		fsize;	/* # bytes in flags, # Int16_t in vector */
65 
66 	/* auxiliary support structures */
67 	unsigned char 	*flags;
68 				/*
69 				 * 1    known boundaries in read data
70 				 * 2    known blanked data
71 				 * 4    matched sample
72 				 * 8    C2 error in sample
73 				 * 16   reserved
74 				 * 32   reserved
75 				 * 64   reserved
76 				 * 128  reserved
77 				 */
78 
79 	/* end of session cases */
80 	long		lastsector;
81 	struct cdrom_paranoia	*p;
82 	struct linked_element	*e;
83 } c_block;
84 
85 extern void	free_c_block		__PR((c_block * c));
86 extern void	i_cblock_destructor	__PR((c_block * c));
87 extern c_block	*new_c_block		__PR((struct cdrom_paranoia * p));
88 
89 typedef struct v_fragment {
90 	c_block		*one;
91 
92 	long		begin;
93 	long		size;
94 	Int16_t		*vector;
95 
96 	/* end of session cases */
97 	long		lastsector;
98 
99 	/* linked list */
100 	struct cdrom_paranoia	*p;
101 	struct linked_element	*e;
102 
103 } v_fragment;
104 
105 extern void	free_v_fragment		__PR((v_fragment * c));
106 extern v_fragment *new_v_fragment	__PR((struct cdrom_paranoia * p,
107 						c_block * one,
108 						long begin, long end,
109 						int lastsector));
110 extern Int16_t	*v_buffer		__PR((v_fragment * v));
111 
112 extern c_block	*c_first		__PR((struct cdrom_paranoia * p));
113 extern c_block	*c_last			__PR((struct cdrom_paranoia * p));
114 extern c_block	*c_next			__PR((c_block * c));
115 extern c_block	*c_prev			__PR((c_block * c));
116 
117 extern v_fragment *v_first		__PR((struct cdrom_paranoia * p));
118 extern v_fragment *v_last		__PR((struct cdrom_paranoia * p));
119 extern v_fragment *v_next		__PR((v_fragment * v));
120 extern v_fragment *v_prev		__PR((v_fragment * v));
121 
122 typedef struct root_block {
123 	long		returnedlimit;
124 	long		lastsector;
125 	struct cdrom_paranoia	*p;
126 
127 	c_block		*vector;	/* doesn't use any sorting */
128 	int		silenceflag;
129 	long		silencebegin;
130 } root_block;
131 
132 typedef struct offsets {
133 	long	offpoints;
134 	long	newpoints;
135 	long	offaccum;
136 	long	offdiff;
137 	long	offmin;
138 	long	offmax;
139 
140 } offsets;
141 
142 typedef struct cdrom_paranoia {
143 	void	*d;		/* A pointer to the driver interface */
144 
145 	long	(*d_read) __PR((void *d, void *buffer,		/* -> long sectors */
146 			long beginsector, long sectors));
147 	long	(*d_disc_firstsector) __PR((void *d));		/* -> long sector */
148 	long	(*d_disc_lastsector) __PR((void *d));		/* -> long sector */
149 	int	(*d_tracks)	__PR((void *d));		/* -> int tracks */
150 	long	(*d_track_firstsector) __PR((void *d, int track)); /* -> long sector */
151 	long	(*d_track_lastsector) __PR((void *d, int track)); /* -> long sector */
152 	int	(*d_sector_gettrack) __PR((void *d, long sector)); /* -> int trackno */
153 	int	(*d_track_audiop) __PR((void *d, int track));	/* -> int Is audiotrack */
154 
155 	int		nsectors;	/* # of sectors that fit into DMA buf */
156 	int		sectsize;	/* size of a sector, 2353 or 2646 bytes */
157 	int		sectwords;	/* words in a sector, 2353/2 or 2646/2 */
158 
159 	root_block	root;		/* verified/reconstructed cached data */
160 	linked_list	*cache;		/* our data as read from the cdrom */
161 	long		cache_limit;
162 	linked_list	*fragments;	/* fragments of blocks that have been */
163 					/* 'verified' */
164 	sort_info	*sortcache;
165 
166 	int		readahead;	/* sectors of readahead in each readop */
167 	int		jitter;
168 	long		lastread;
169 
170 	int		enable;		/* modes from paranoia_modeset() */
171 	long		cursor;
172 	long		current_lastsector;
173 	long		current_firstsector;
174 
175 	/* statistics for drift/overlap */
176 	struct offsets	stage1;
177 	struct offsets	stage2;
178 
179 	long		mindynoverlap;
180 	long		maxdynoverlap;
181 	long		dynoverlap;
182 	long		dyndrift;
183 
184 	/* statistics for verification */
185 
186 } cdrom_paranoia;
187 
188 extern c_block	*c_alloc		__PR((Int16_t * vector,
189 						long begin, long size));
190 extern void	c_set			__PR((c_block * v, long begin));
191 extern void	c_insert		__PR((c_block * v, long pos,
192 						Int16_t * b, long size));
193 extern void	c_remove		__PR((c_block * v, long cutpos,
194 						long cutsize));
195 extern void	c_overwrite		__PR((c_block * v, long pos,
196 						Int16_t * b, long size));
197 extern void	c_append		__PR((c_block * v, Int16_t * vector,
198 						long size));
199 extern void	c_removef		__PR((c_block * v, long cut));
200 
201 #define	ce(v)	((v)->begin + (v)->size)
202 #define	cb(v)	((v)->begin)
203 #define	cs(v)	((v)->size)
204 
205 /*
206  * pos here is vector position from zero
207  */
208 extern void	recover_cache		__PR((cdrom_paranoia * p));
209 extern void	i_paranoia_firstlast	__PR((cdrom_paranoia * p));
210 
211 #define	cv(c)	((c)->vector)
212 
213 #define	fe(f)	((f)->begin + (f)->size)
214 #define	fb(f)	((f)->begin)
215 #define	fs(f)	((f)->size)
216 #define	fv(f)	(v_buffer(f))
217 
218 #define	CDP_COMPILE
219 #endif	/* _P_BLOCK_H */
220