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