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