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