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