cdrtools/libparanoia/p_block.h

220 lines
6.2 KiB
C
Raw Normal View History

2025-06-15 04:19:58 +08:00
/* @(#)p_block.h 1.21 15/09/20 J.^ Schilling from cdparanoia-III-alpha9.8 */
/*
* CopyPolicy: GNU Lesser General Public License v2.1 applies
* Copyright (C) 1997-2001 by Monty (xiphmont@mit.edu)
* Copyright (C) 2002-2015 by J. Schilling
*/
#ifndef _P_BLOCK_H
#define _P_BLOCK_H
#define MIN_WORDS_OVERLAP 64 /* 16 bit words */
#define MIN_WORDS_SEARCH 64 /* 16 bit words */
#define MIN_WORDS_RIFT 16 /* 16 bit words */
#define MAX_SECTOR_OVERLAP 32 /* sectors */
#define MIN_SECTOR_EPSILON 128 /* words */
#define MIN_SECTOR_BACKUP 16 /* sectors */
#define JIGGLE_MODULO 15 /* sectors */
#define MIN_SILENCE_BOUNDARY 1024 /* 16 bit words */
#undef abs
#define abs(x) ((x) < 0 ? -(x) : (x))
#undef min
#define min(x, y) ((x) < (y) ? (x) : (y))
#undef max
#define max(x, y) ((x) < (y) ? (y) : (x))
#include "isort.h"
typedef struct linked_list {
/* linked list */
struct linked_element *head;
struct linked_element *tail;
void *(*new_poly) __PR((void));
void (*free_poly) __PR((void *poly));
long current;
long active;
} linked_list;
typedef struct linked_element {
void *ptr;
struct linked_element *prev;
struct linked_element *next;
struct linked_list *list;
int stamp;
} linked_element;
extern linked_list *new_list __PR((void *(*newp) (void),
void (*freep) (void *)));
extern linked_element *new_elem __PR((linked_list * list));
extern linked_element *add_elem __PR((linked_list * list, void *elem));
extern void free_list __PR((linked_list * list, int free_ptr)); /* unlink or free */
extern void free_elem __PR((linked_element * e, int free_ptr)); /* unlink or free */
extern void *get_elem __PR((linked_element * e));
extern linked_list *copy_list __PR((linked_list * list)); /* shallow; doesn't copy */
/* contained structures */
typedef struct c_block {
/* The buffer */
Int16_t *vector;
long begin; /* Begin diskoff, multiples of 16bit samples */
long size; /* Size, multiples of 16bit samples */
/* auxiliary support structures */
unsigned char *flags;
/*
* 1 known boundaries in read data
* 2 known blanked data
* 4 matched sample
* 8 reserved
* 16 reserved
* 32 reserved
* 64 reserved
* 128 reserved
*/
/* end of session cases */
long lastsector;
struct cdrom_paranoia *p;
struct linked_element *e;
} c_block;
extern void free_c_block __PR((c_block * c));
extern void i_cblock_destructor __PR((c_block * c));
extern c_block *new_c_block __PR((struct cdrom_paranoia * p));
typedef struct v_fragment {
c_block *one;
long begin;
long size;
Int16_t *vector;
/* end of session cases */
long lastsector;
/* linked list */
struct cdrom_paranoia *p;
struct linked_element *e;
} v_fragment;
extern void free_v_fragment __PR((v_fragment * c));
extern v_fragment *new_v_fragment __PR((struct cdrom_paranoia * p,
c_block * one,
long begin, long end,
int lastsector));
extern Int16_t *v_buffer __PR((v_fragment * v));
extern c_block *c_first __PR((struct cdrom_paranoia * p));
extern c_block *c_last __PR((struct cdrom_paranoia * p));
extern c_block *c_next __PR((c_block * c));
extern c_block *c_prev __PR((c_block * c));
extern v_fragment *v_first __PR((struct cdrom_paranoia * p));
extern v_fragment *v_last __PR((struct cdrom_paranoia * p));
extern v_fragment *v_next __PR((v_fragment * v));
extern v_fragment *v_prev __PR((v_fragment * v));
typedef struct root_block {
long returnedlimit;
long lastsector;
struct cdrom_paranoia *p;
c_block *vector; /* doesn't use any sorting */
int silenceflag;
long silencebegin;
} root_block;
typedef struct offsets {
long offpoints;
long newpoints;
long offaccum;
long offdiff;
long offmin;
long offmax;
} offsets;
typedef struct cdrom_paranoia {
void *d; /* A pointer to the driver interface */
long (*d_read) __PR((void *d, void *buffer, /* -> long sectors */
long beginsector, long sectors));
long (*d_disc_firstsector) __PR((void *d)); /* -> long sector */
long (*d_disc_lastsector) __PR((void *d)); /* -> long sector */
int (*d_tracks) __PR((void *d)); /* -> int tracks */
long (*d_track_firstsector) __PR((void *d, int track)); /* -> long sector */
long (*d_track_lastsector) __PR((void *d, int track)); /* -> long sector */
int (*d_sector_gettrack) __PR((void *d, long sector)); /* -> int trackno */
int (*d_track_audiop) __PR((void *d, int track)); /* -> int Is audiotrack */
int nsectors; /* # of sectors that fit into DMA buf */
int sectsize; /* size of a sector, 2353 or 2646 bytes */
int sectwords; /* words in a sector, 2353/2 or 2646/2 */
root_block root; /* verified/reconstructed cached data */
linked_list *cache; /* our data as read from the cdrom */
long cache_limit;
linked_list *fragments; /* fragments of blocks that have been */
/* 'verified' */
sort_info *sortcache;
int readahead; /* sectors of readahead in each readop */
int jitter;
long lastread;
int enable; /* modes from paranoia_modeset() */
long cursor;
long current_lastsector;
long current_firstsector;
/* statistics for drift/overlap */
struct offsets stage1;
struct offsets stage2;
long mindynoverlap;
long maxdynoverlap;
long dynoverlap;
long dyndrift;
/* statistics for verification */
} cdrom_paranoia;
extern c_block *c_alloc __PR((Int16_t * vector,
long begin, long size));
extern void c_set __PR((c_block * v, long begin));
extern void c_insert __PR((c_block * v, long pos,
Int16_t * b, long size));
extern void c_remove __PR((c_block * v, long cutpos,
long cutsize));
extern void c_overwrite __PR((c_block * v, long pos,
Int16_t * b, long size));
extern void c_append __PR((c_block * v, Int16_t * vector,
long size));
extern void c_removef __PR((c_block * v, long cut));
#define ce(v) ((v)->begin + (v)->size)
#define cb(v) ((v)->begin)
#define cs(v) ((v)->size)
/*
* pos here is vector position from zero
*/
extern void recover_cache __PR((cdrom_paranoia * p));
extern void i_paranoia_firstlast __PR((cdrom_paranoia * p));
#define cv(c) ((c)->vector)
#define fe(f) ((f)->begin + (f)->size)
#define fb(f) ((f)->begin)
#define fs(f) ((f)->size)
#define fv(f) (v_buffer(f))
#define CDP_COMPILE
#endif /* _P_BLOCK_H */