2 * This file has been modified for the cdrkit suite.
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).
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.
13 /* @(#)p_block.h 1.16 04/02/20 J. Schilling from cdparanoia-III-alpha9.8 */
15 * Modifications to make the code portable Copyright (c) 2002 J. Schilling
18 * CopyPolicy: GNU Public License 2 applies
19 * Copyright (C) by Monty (xiphmont@mit.edu)
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 */
34 #define min(x, y) ((x) > (y)?(y):(x))
35 #define max(x, y) ((x) < (y)?(y):(x))
39 typedef struct linked_list {
41 struct linked_element *head;
42 struct linked_element *tail;
44 void *(*new_poly)(void);
45 void (*free_poly)(void *poly);
51 typedef struct linked_element {
53 struct linked_element *prev;
54 struct linked_element *next;
56 struct linked_list *list;
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 */
70 typedef struct c_block {
76 /* auxiliary support structures */
79 * 1 known boundaries in read data
80 * 2 known blanked data
89 /* end of session cases */
91 struct cdrom_paranoia *p;
92 struct linked_element *e;
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);
99 typedef struct v_fragment {
106 /* end of session cases */
110 struct cdrom_paranoia *p;
111 struct linked_element *e;
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,
119 extern Int16_t *v_buffer(v_fragment *v);
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);
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);
131 typedef struct root_block {
134 struct cdrom_paranoia *p;
136 c_block *vector; /* doesn't use any sorting */
141 typedef struct offsets {
151 typedef struct cdrom_paranoia {
152 void *d; /* A pointer to the driver interface */
153 int nsectors; /* # of sectors that fit into DMA buf */
155 root_block root; /* verified/reconstructed cached data */
156 linked_list *cache; /* our data as read from the cdrom */
158 linked_list *fragments; /* fragments of blocks that have been */
160 sort_info *sortcache;
162 int readahead; /* sectors of readahead in each readop */
168 long current_lastsector;
169 long current_firstsector;
171 /* statistics for drift/overlap */
172 struct offsets stage1;
173 struct offsets stage2;
180 /* statistics for verification */
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);
192 #define ce(v) ((v)->begin + (v)->size)
193 #define cb(v) ((v)->begin)
194 #define cs(v) ((v)->size)
197 * pos here is vector position from zero
199 extern void recover_cache(cdrom_paranoia *p);
200 extern void i_paranoia_firstlast(cdrom_paranoia *p);
202 #define cv(c) ((c)->vector)
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))