Blame lib/paranoia/p_block.h

Packit cb6d3d
/*
Packit cb6d3d
  Copyright (C) 2004, 2005, 2008 Rocky Bernstein <rocky@gnu.org>
Packit cb6d3d
  Copyright (C) 2014 Robert Kausch <robert.kausch@freac.org>
Packit cb6d3d
  Copyright (C) by Monty (xiphmont@mit.edu)
Packit cb6d3d
Packit cb6d3d
  This program is free software: you can redistribute it and/or modify
Packit cb6d3d
  it under the terms of the GNU General Public License as published by
Packit cb6d3d
  the Free Software Foundation, either version 3 of the License, or
Packit cb6d3d
  (at your option) any later version.
Packit cb6d3d
Packit cb6d3d
  This program is distributed in the hope that it will be useful,
Packit cb6d3d
  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit cb6d3d
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit cb6d3d
  GNU General Public License for more details.
Packit cb6d3d
Packit cb6d3d
  You should have received a copy of the GNU General Public License
Packit cb6d3d
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit cb6d3d
*/
Packit cb6d3d
Packit cb6d3d
#ifndef _P_BLOCK_H_
Packit cb6d3d
#define _P_BLOCK_H_
Packit cb6d3d
Packit cb6d3d
#include <cdio/paranoia/paranoia.h>
Packit cb6d3d
#include <cdio/paranoia/cdda.h>
Packit cb6d3d
Packit cb6d3d
#define MIN_WORDS_OVERLAP    64     /* 16 bit words */
Packit cb6d3d
#define MIN_WORDS_SEARCH     64     /* 16 bit words */
Packit cb6d3d
#define MIN_WORDS_RIFT       16     /* 16 bit words */
Packit cb6d3d
#define MAX_SECTOR_OVERLAP   32     /* sectors */
Packit cb6d3d
#define MIN_SECTOR_EPSILON  128     /* words */
Packit cb6d3d
#define MIN_SECTOR_BACKUP    16     /* sectors */
Packit cb6d3d
#define JIGGLE_MODULO        15     /* sectors */
Packit cb6d3d
#define MIN_SILENCE_BOUNDARY 1024   /* 16 bit words */
Packit cb6d3d
#define CACHEMODEL_SECTORS   1200
Packit cb6d3d
Packit cb6d3d
#define min(x,y) ((x)>(y)?(y):(x))
Packit cb6d3d
#define max(x,y) ((x)<(y)?(y):(x))
Packit cb6d3d
Packit cb6d3d
#include "isort.h"
Packit cb6d3d
Packit cb6d3d
typedef struct {
Packit cb6d3d
  /* linked list */
Packit cb6d3d
  struct linked_element *head;
Packit cb6d3d
  struct linked_element *tail;
Packit cb6d3d
Packit cb6d3d
  void *(*new_poly)();
Packit cb6d3d
  void (*free_poly)(void *poly);
Packit cb6d3d
  long current;
Packit cb6d3d
  long active;
Packit cb6d3d
Packit cb6d3d
} linked_list_t;
Packit cb6d3d
Packit cb6d3d
typedef struct linked_element{
Packit cb6d3d
  void *ptr;
Packit cb6d3d
  struct linked_element *prev;
Packit cb6d3d
  struct linked_element *next;
Packit cb6d3d
  
Packit cb6d3d
  linked_list_t *list;
Packit cb6d3d
  int stamp;
Packit cb6d3d
} linked_element;
Packit cb6d3d
Packit cb6d3d
extern linked_list_t *new_list(void *(*new_fn)(void),void (*free)(void *));
Packit cb6d3d
extern linked_element *new_elem(linked_list_t *list);
Packit cb6d3d
extern linked_element *add_elem(linked_list_t *list,void *elem);
Packit cb6d3d
extern void free_list(linked_list_t *list,int free_ptr); /* unlink or free */
Packit cb6d3d
extern void free_elem(linked_element *e,int free_ptr); /* unlink or free */
Packit cb6d3d
extern void *get_elem(linked_element *e);
Packit cb6d3d
Packit cb6d3d
/* This is a shallow copy; it doesn't copy contained structures */
Packit cb6d3d
extern linked_list_t *copy_list(linked_list_t *p_list); 
Packit cb6d3d
Packit cb6d3d
typedef struct c_block {
Packit cb6d3d
  /* The buffer */
Packit cb6d3d
  int16_t *vector;
Packit cb6d3d
  long begin;
Packit cb6d3d
  long size;
Packit cb6d3d
Packit cb6d3d
  /* auxiliary support structures */
Packit cb6d3d
  unsigned char *flags; /* 1    known boundaries in read data
Packit cb6d3d
			   2    known blanked data
Packit cb6d3d
			   4    matched sample
Packit cb6d3d
			   8    reserved
Packit cb6d3d
			   16   reserved
Packit cb6d3d
			   32   reserved
Packit cb6d3d
			   64   reserved
Packit cb6d3d
			   128  reserved
Packit cb6d3d
			 */
Packit cb6d3d
Packit cb6d3d
  /* end of session cases */
Packit cb6d3d
  long lastsector;
Packit cb6d3d
  cdrom_paranoia_t *p;
Packit cb6d3d
  struct linked_element *e;
Packit cb6d3d
Packit cb6d3d
} c_block_t;
Packit cb6d3d
Packit cb6d3d
extern void free_c_block(c_block_t *c);
Packit cb6d3d
extern void i_cblock_destructor(c_block_t *c);
Packit cb6d3d
extern c_block_t *new_c_block(cdrom_paranoia_t *p);
Packit cb6d3d
Packit cb6d3d
typedef struct v_fragment_s {
Packit cb6d3d
  c_block_t *one;
Packit cb6d3d
Packit cb6d3d
  long begin;
Packit cb6d3d
  long size;
Packit cb6d3d
  int16_t *vector;
Packit cb6d3d
Packit cb6d3d
  /* end of session cases */
Packit cb6d3d
  long lastsector;
Packit cb6d3d
Packit cb6d3d
  /* linked list */
Packit cb6d3d
  cdrom_paranoia_t *p;
Packit cb6d3d
  struct linked_element *e;
Packit cb6d3d
Packit cb6d3d
} v_fragment_t;
Packit cb6d3d
Packit cb6d3d
extern void free_v_fragment(v_fragment_t *c);
Packit cb6d3d
extern v_fragment_t *new_v_fragment(cdrom_paranoia_t *p, c_block_t *one,
Packit cb6d3d
				  long int begin, long int end, 
Packit cb6d3d
				  int lastsector);
Packit cb6d3d
extern int16_t *v_buffer(v_fragment_t *v);
Packit cb6d3d
Packit cb6d3d
extern c_block_t *c_first(cdrom_paranoia_t *p);
Packit cb6d3d
extern c_block_t *c_last(cdrom_paranoia_t *p);
Packit cb6d3d
extern c_block_t *c_next(c_block_t *c);
Packit cb6d3d
extern c_block_t *c_prev(c_block_t *c);
Packit cb6d3d
Packit cb6d3d
extern v_fragment_t *v_first(cdrom_paranoia_t *p);
Packit cb6d3d
extern v_fragment_t *v_last(cdrom_paranoia_t *p);
Packit cb6d3d
extern v_fragment_t *v_next(v_fragment_t *v);
Packit cb6d3d
extern v_fragment_t *v_prev(v_fragment_t *v);
Packit cb6d3d
Packit cb6d3d
typedef struct root_block{
Packit cb6d3d
  long returnedlimit;   
Packit cb6d3d
  long lastsector;
Packit cb6d3d
  cdrom_paranoia_t *p;
Packit cb6d3d
Packit cb6d3d
  c_block_t *vector; /* doesn't use any sorting */
Packit cb6d3d
  int silenceflag;
Packit cb6d3d
  long silencebegin;
Packit cb6d3d
} root_block;
Packit cb6d3d
Packit cb6d3d
typedef struct offsets{
Packit cb6d3d
  
Packit cb6d3d
  long offpoints;
Packit cb6d3d
  long newpoints;
Packit cb6d3d
  long offaccum;
Packit cb6d3d
  long offdiff;
Packit cb6d3d
  long offmin;
Packit cb6d3d
  long offmax;
Packit cb6d3d
Packit cb6d3d
} offsets;
Packit cb6d3d
Packit cb6d3d
struct cdrom_paranoia_s {
Packit cb6d3d
  cdrom_drive_t *d;
Packit cb6d3d
Packit cb6d3d
  root_block root;           /* verified/reconstructed cached data */
Packit cb6d3d
  linked_list_t *cache;      /* our data as read from the cdrom */
Packit cb6d3d
  long int cache_limit;
Packit cb6d3d
  linked_list_t *fragments;  /* fragments of blocks that have been 'verified' */
Packit cb6d3d
  sort_info_t *sortcache;
Packit cb6d3d
Packit cb6d3d
  /* cache tracking */
Packit cb6d3d
  int cdcache_size;
Packit cb6d3d
  int cdcache_begin;
Packit cb6d3d
  int cdcache_end;
Packit cb6d3d
  int jitter;           
Packit cb6d3d
Packit cb6d3d
  paranoia_cb_mode_t enable;
Packit cb6d3d
  long int cursor;
Packit cb6d3d
  long int current_lastsector;
Packit cb6d3d
  long int current_firstsector;
Packit cb6d3d
Packit cb6d3d
  /* statistics for drift/overlap */
Packit cb6d3d
  struct offsets stage1;
Packit cb6d3d
  struct offsets stage2;
Packit cb6d3d
Packit cb6d3d
  long dynoverlap;
Packit cb6d3d
  long dyndrift;
Packit cb6d3d
Packit cb6d3d
  /* statistics for verification */
Packit cb6d3d
Packit cb6d3d
};
Packit cb6d3d
Packit cb6d3d
extern c_block_t *c_alloc(int16_t *vector,long begin,long size);
Packit cb6d3d
extern void c_set(c_block_t *v,long begin);
Packit cb6d3d
extern void c_insert(c_block_t *v,long pos,int16_t *b,long size);
Packit cb6d3d
extern void c_remove(c_block_t *v,long cutpos,long cutsize);
Packit cb6d3d
extern void c_overwrite(c_block_t *v,long pos,int16_t *b,long size);
Packit cb6d3d
extern void c_append(c_block_t *v, int16_t *vector, long size);
Packit cb6d3d
extern void c_removef(c_block_t *v, long cut);
Packit cb6d3d
Packit cb6d3d
#define ce(v) (v->begin+v->size)
Packit cb6d3d
#define cb(v) (v->begin)
Packit cb6d3d
#define cs(v) (v->size)
Packit cb6d3d
Packit cb6d3d
/* pos here is vector position from zero */
Packit cb6d3d
Packit cb6d3d
extern void recover_cache(cdrom_paranoia_t *p);
Packit cb6d3d
extern void i_paranoia_firstlast(cdrom_paranoia_t *p);
Packit cb6d3d
Packit cb6d3d
#define cv(c) (c->vector)
Packit cb6d3d
Packit cb6d3d
#define fe(f) (f->begin+f->size)
Packit cb6d3d
#define fb(f) (f->begin)
Packit cb6d3d
#define fs(f) (f->size)
Packit cb6d3d
#define fv(f) (v_buffer(f))
Packit cb6d3d
Packit cb6d3d
#ifndef DO_NOT_WANT_PARANOIA_COMPATIBILITY
Packit cb6d3d
/** For compatibility with good ol' paranoia */
Packit cb6d3d
#define linked_list linked_list_t
Packit cb6d3d
#endif /*DO_NOT_WANT_PARANOIA_COMPATIBILITY*/
Packit cb6d3d
Packit cb6d3d
#define CDP_COMPILE
Packit cb6d3d
#endif /*_P_BLOCK_H_*/
Packit cb6d3d