p_block.h
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:5k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

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