1 /***
2  * CopyPolicy: GNU Public License 2 applies
3  * Copyright (C) by Monty (xiphmont@mit.edu)
4  ***/
5 
6 #ifndef _p_block_h_
7 #define _p_block_h_
8 
9 #include "../interface/cdda_interface.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 #define min(x,y) ((x)>(y)?(y):(x))
21 #define max(x,y) ((x)<(y)?(y):(x))
22 
23 #include "isort.h"
24 
25 typedef struct linked_list{
26   /* linked list */
27   struct linked_element *head;
28   struct linked_element *tail;
29 
30   void *(*new_poly)();
31   void (*free_poly)(void *poly);
32   long current;
33   long active;
34 
35 } linked_list;
36 
37 typedef struct linked_element{
38   void *ptr;
39   struct linked_element *prev;
40   struct linked_element *next;
41 
42   struct linked_list *list;
43   int stamp;
44 } linked_element;
45 
46 extern linked_list *new_list(void *(*new)(void),void (*free)(void *));
47 extern linked_element *new_elem(linked_list *list);
48 extern linked_element *add_elem(linked_list *list,void *elem);
49 extern void free_list(linked_list *list,int free_ptr); /* unlink or free */
50 extern void free_elem(linked_element *e,int free_ptr); /* unlink or free */
51 extern void *get_elem(linked_element *e);
52 extern linked_list *copy_list(linked_list *list); /* shallow; doesn't copy
53 						     contained structures */
54 
55 typedef struct c_block{
56   /* The buffer */
57   int16_t *vector;
58   long begin;
59   long size;
60 
61   /* auxiliary support structures */
62   unsigned char *flags; /* 1    known boundaries in read data
63 			   2    known blanked data
64 			   4    matched sample
65 			   8    reserved
66 			   16   reserved
67 			   32   reserved
68 			   64   reserved
69 			   128  reserved
70 			 */
71 
72   /* end of session cases */
73   long lastsector;
74   struct cdrom_paranoia *p;
75   struct linked_element *e;
76 
77 } c_block;
78 
79 extern void free_c_block(c_block *c);
80 extern void i_cblock_destructor(c_block *c);
81 extern c_block *new_c_block(struct cdrom_paranoia *p);
82 
83 typedef struct v_fragment{
84   c_block *one;
85 
86   long begin;
87   long size;
88   int16_t *vector;
89 
90   /* end of session cases */
91   long lastsector;
92 
93   /* linked list */
94   struct cdrom_paranoia *p;
95   struct linked_element *e;
96 
97 } v_fragment;
98 
99 extern void free_v_fragment(v_fragment *c);
100 extern v_fragment *new_v_fragment(struct cdrom_paranoia *p,c_block *one,
101 				  long begin, long end, int lastsector);
102 extern int16_t *v_buffer(v_fragment *v);
103 
104 extern c_block *c_first(struct cdrom_paranoia *p);
105 extern c_block *c_last(struct cdrom_paranoia *p);
106 extern c_block *c_next(c_block *c);
107 extern c_block *c_prev(c_block *c);
108 
109 extern v_fragment *v_first(struct cdrom_paranoia *p);
110 extern v_fragment *v_last(struct cdrom_paranoia *p);
111 extern v_fragment *v_next(v_fragment *v);
112 extern v_fragment *v_prev(v_fragment *v);
113 
114 typedef struct root_block{
115   long returnedlimit;
116   long lastsector;
117   struct cdrom_paranoia *p;
118 
119   c_block *vector; /* doesn't use any sorting */
120   int silenceflag;
121   long silencebegin;
122 } root_block;
123 
124 typedef struct offsets{
125 
126   long offpoints;
127   long newpoints;
128   long offaccum;
129   long offdiff;
130   long offmin;
131   long offmax;
132 
133 } offsets;
134 
135 typedef struct cdrom_paranoia{
136   cdrom_drive *d;
137 
138   root_block root;        /* verified/reconstructed cached data */
139   linked_list *cache;     /* our data as read from the cdrom */
140   long cache_limit;
141   linked_list *fragments; /* fragments of blocks that have been 'verified' */
142   sort_info *sortcache;
143 
144   int readahead;          /* sectors of readahead in each readop */
145   int jitter;
146   long lastread;
147 
148   int enable;
149   long cursor;
150   long current_lastsector;
151   long current_firstsector;
152 
153   /* statistics for drift/overlap */
154   struct offsets stage1;
155   struct offsets stage2;
156 
157   long dynoverlap;
158   long dyndrift;
159 
160   /* statistics for verification */
161 
162 } cdrom_paranoia;
163 
164 extern c_block *c_alloc(int16_t *vector,long begin,long size);
165 extern void c_set(c_block *v,long begin);
166 extern void c_insert(c_block *v,long pos,int16_t *b,long size);
167 extern void c_remove(c_block *v,long cutpos,long cutsize);
168 extern void c_overwrite(c_block *v,long pos,int16_t *b,long size);
169 extern void c_append(c_block *v, int16_t *vector, long size);
170 extern void c_removef(c_block *v, long cut);
171 
172 #define ce(v) (v->begin+v->size)
173 #define cb(v) (v->begin)
174 #define cs(v) (v->size)
175 
176 /* pos here is vector position from zero */
177 
178 extern void recover_cache(cdrom_paranoia *p);
179 extern void i_paranoia_firstlast(cdrom_paranoia *p);
180 
181 #define cv(c) (c->vector)
182 
183 #define fe(f) (f->begin+f->size)
184 #define fb(f) (f->begin)
185 #define fs(f) (f->size)
186 #define fv(f) (v_buffer(f))
187 
188 #define CDP_COMPILE
189 #endif
190 
191