|
Packit |
cb6d3d |
/*
|
|
Packit |
cb6d3d |
Copyright (C) 2004, 2005, 2007, 2008 Rocky Bernstein <rocky@gnu.org>
|
|
Packit |
cb6d3d |
Copyright (C) 2014 Robert Kausch <robert.kausch@freac.org>
|
|
Packit |
cb6d3d |
Copyright (C) 1998 Monty xiphmont@mit.edu
|
|
Packit |
cb6d3d |
*/
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#ifdef HAVE_CONFIG_H
|
|
Packit |
cb6d3d |
# include "config.h"
|
|
Packit |
cb6d3d |
# define __CDIO_CONFIG_H__ 1
|
|
Packit |
cb6d3d |
#endif
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#ifdef HAVE_STDLIB_H
|
|
Packit |
cb6d3d |
#include <stdlib.h>
|
|
Packit |
cb6d3d |
#endif
|
|
Packit |
cb6d3d |
#include <stdio.h>
|
|
Packit |
cb6d3d |
#ifdef HAVE_STRING_H
|
|
Packit |
cb6d3d |
#include <string.h>
|
|
Packit |
cb6d3d |
#endif
|
|
Packit |
cb6d3d |
#include <limits.h>
|
|
Packit |
cb6d3d |
#include "p_block.h"
|
|
Packit |
cb6d3d |
#include <cdio/paranoia/cdda.h>
|
|
Packit |
cb6d3d |
#include <cdio/paranoia/paranoia.h>
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
linked_list_t *new_list(void *(*newp)(void),void (*freep)(void *))
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
linked_list_t *ret=calloc(1,sizeof(linked_list_t));
|
|
Packit |
cb6d3d |
ret->new_poly=newp;
|
|
Packit |
cb6d3d |
ret->free_poly=freep;
|
|
Packit |
cb6d3d |
return(ret);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
linked_element *add_elem(linked_list_t *l,void *elem)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
linked_element *ret=calloc(1,sizeof(linked_element));
|
|
Packit |
cb6d3d |
ret->stamp=l->current++;
|
|
Packit |
cb6d3d |
ret->ptr=elem;
|
|
Packit |
cb6d3d |
ret->list=l;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
if(l->head)
|
|
Packit |
cb6d3d |
l->head->prev=ret;
|
|
Packit |
cb6d3d |
else
|
|
Packit |
cb6d3d |
l->tail=ret;
|
|
Packit |
cb6d3d |
ret->next=l->head;
|
|
Packit |
cb6d3d |
ret->prev=NULL;
|
|
Packit |
cb6d3d |
l->head=ret;
|
|
Packit |
cb6d3d |
l->active++;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
return(ret);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
linked_element *
|
|
Packit |
cb6d3d |
new_elem(linked_list_t *p_list)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
void *p_new=p_list->new_poly();
|
|
Packit |
cb6d3d |
return(add_elem(p_list,p_new));
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
free_elem(linked_element *e,int free_ptr)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
linked_list_t *l=e->list;
|
|
Packit |
cb6d3d |
if(free_ptr)l->free_poly(e->ptr);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
if(e==l->head)
|
|
Packit |
cb6d3d |
l->head=e->next;
|
|
Packit |
cb6d3d |
if(e==l->tail)
|
|
Packit |
cb6d3d |
l->tail=e->prev;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
if(e->prev)
|
|
Packit |
cb6d3d |
e->prev->next=e->next;
|
|
Packit |
cb6d3d |
if(e->next)
|
|
Packit |
cb6d3d |
e->next->prev=e->prev;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
l->active--;
|
|
Packit |
cb6d3d |
free(e);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
free_list(linked_list_t *list,int free_ptr)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
while(list->head)
|
|
Packit |
cb6d3d |
free_elem(list->head,free_ptr);
|
|
Packit |
cb6d3d |
free(list);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void *get_elem(linked_element *e)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
return(e->ptr);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
linked_list_t *copy_list(linked_list_t *list)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
linked_list_t *new=new_list(list->new_poly,list->free_poly);
|
|
Packit |
cb6d3d |
linked_element *i=list->tail;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
while(i){
|
|
Packit |
cb6d3d |
add_elem(new,i->ptr);
|
|
Packit |
cb6d3d |
i=i->prev;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
return(new);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/**** C_block stuff ******************************************************/
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
static c_block_t *
|
|
Packit |
cb6d3d |
i_cblock_constructor(cdrom_paranoia_t *p)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
c_block_t *ret=calloc(1,sizeof(c_block_t));
|
|
Packit |
cb6d3d |
return(ret);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
i_cblock_destructor(c_block_t *c)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(c){
|
|
Packit |
cb6d3d |
if(c->vector)free(c->vector);
|
|
Packit |
cb6d3d |
if(c->flags)free(c->flags);
|
|
Packit |
cb6d3d |
c->e=NULL;
|
|
Packit |
cb6d3d |
free(c);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
c_block_t *
|
|
Packit |
cb6d3d |
new_c_block(cdrom_paranoia_t *p)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
linked_element *e=new_elem(p->cache);
|
|
Packit |
cb6d3d |
c_block_t *c=e->ptr;
|
|
Packit |
cb6d3d |
c->e=e;
|
|
Packit |
cb6d3d |
c->p=p;
|
|
Packit |
cb6d3d |
return(c);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void free_c_block(c_block_t *c)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
/* also rid ourselves of v_fragments that reference this block */
|
|
Packit |
cb6d3d |
v_fragment_t *v=v_first(c->p);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
while(v){
|
|
Packit |
cb6d3d |
v_fragment_t *next=v_next(v);
|
|
Packit |
cb6d3d |
if(v->one==c)free_v_fragment(v);
|
|
Packit |
cb6d3d |
v=next;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
free_elem(c->e,1);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
static v_fragment_t *
|
|
Packit |
cb6d3d |
i_vfragment_constructor(void)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
v_fragment_t *ret=calloc(1,sizeof(v_fragment_t));
|
|
Packit |
cb6d3d |
return(ret);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
static void
|
|
Packit |
cb6d3d |
i_v_fragment_destructor(v_fragment_t *v)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
free(v);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
v_fragment_t *
|
|
Packit |
cb6d3d |
new_v_fragment(cdrom_paranoia_t *p, c_block_t *one,
|
|
Packit |
cb6d3d |
long int begin, long int end, int last)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
linked_element *e=new_elem(p->fragments);
|
|
Packit |
cb6d3d |
v_fragment_t *b=e->ptr;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
b->e=e;
|
|
Packit |
cb6d3d |
b->p=p;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
b->one=one;
|
|
Packit |
cb6d3d |
b->begin=begin;
|
|
Packit |
cb6d3d |
b->vector=one->vector+begin-one->begin;
|
|
Packit |
cb6d3d |
b->size=end-begin;
|
|
Packit |
cb6d3d |
b->lastsector=last;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
#if TRACE_PARANOIA
|
|
Packit |
cb6d3d |
fprintf(stderr, "- Verified [%ld-%ld] (0x%04X...0x%04X)%s\n",
|
|
Packit |
cb6d3d |
begin, end,
|
|
Packit |
cb6d3d |
b->vector[0]&0xFFFF, b->vector[b->size-1]&0xFFFF,
|
|
Packit |
cb6d3d |
last ? " *" : "");
|
|
Packit |
cb6d3d |
#endif
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
return(b);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void free_v_fragment(v_fragment_t *v)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
free_elem(v->e,1);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
c_block_t *
|
|
Packit |
cb6d3d |
c_first(cdrom_paranoia_t *p)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(p->cache->head)
|
|
Packit |
cb6d3d |
return(p->cache->head->ptr);
|
|
Packit |
cb6d3d |
return(NULL);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
c_block_t *
|
|
Packit |
cb6d3d |
c_last(cdrom_paranoia_t *p)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(p->cache->tail)
|
|
Packit |
cb6d3d |
return(p->cache->tail->ptr);
|
|
Packit |
cb6d3d |
return(NULL);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
c_block_t *
|
|
Packit |
cb6d3d |
c_next(c_block_t *c)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(c->e->next)
|
|
Packit |
cb6d3d |
return(c->e->next->ptr);
|
|
Packit |
cb6d3d |
return(NULL);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
c_block_t *
|
|
Packit |
cb6d3d |
c_prev(c_block_t *c)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(c->e->prev)
|
|
Packit |
cb6d3d |
return(c->e->prev->ptr);
|
|
Packit |
cb6d3d |
return(NULL);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
v_fragment_t *
|
|
Packit |
cb6d3d |
v_first(cdrom_paranoia_t *p)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(p->fragments->head){
|
|
Packit |
cb6d3d |
return(p->fragments->head->ptr);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
return(NULL);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
v_fragment_t *
|
|
Packit |
cb6d3d |
v_last(cdrom_paranoia_t *p)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(p->fragments->tail)
|
|
Packit |
cb6d3d |
return(p->fragments->tail->ptr);
|
|
Packit |
cb6d3d |
return(NULL);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
v_fragment_t *
|
|
Packit |
cb6d3d |
v_next(v_fragment_t *v)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(v->e->next)
|
|
Packit |
cb6d3d |
return(v->e->next->ptr);
|
|
Packit |
cb6d3d |
return(NULL);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
v_fragment_t *
|
|
Packit |
cb6d3d |
v_prev(v_fragment_t *v)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(v->e->prev)
|
|
Packit |
cb6d3d |
return(v->e->prev->ptr);
|
|
Packit |
cb6d3d |
return(NULL);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
recover_cache(cdrom_paranoia_t *p)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
linked_list_t *l=p->cache;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* Are we at/over our allowed cache size? */
|
|
Packit |
cb6d3d |
while(l->active>p->cache_limit)
|
|
Packit |
cb6d3d |
/* cull from the tail of the list */
|
|
Packit |
cb6d3d |
free_c_block(c_last(p));
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
int16_t *
|
|
Packit |
cb6d3d |
v_buffer(v_fragment_t *v)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
if(!v->one)return(NULL);
|
|
Packit |
cb6d3d |
if(!cv(v->one))return(NULL);
|
|
Packit |
cb6d3d |
return(v->vector);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* alloc a c_block not on a cache list */
|
|
Packit |
cb6d3d |
c_block_t *
|
|
Packit |
cb6d3d |
c_alloc(int16_t *vector, long begin, long size)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
c_block_t *c=calloc(1,sizeof(c_block_t));
|
|
Packit |
cb6d3d |
c->vector=vector;
|
|
Packit |
cb6d3d |
c->begin=begin;
|
|
Packit |
cb6d3d |
c->size=size;
|
|
Packit |
cb6d3d |
return(c);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void c_set(c_block_t *v,long begin){
|
|
Packit |
cb6d3d |
v->begin=begin;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* pos here is vector position from zero */
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
c_insert(c_block_t *v,long pos,int16_t *b,long size)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
int vs=cs(v);
|
|
Packit |
cb6d3d |
if(pos<0 || pos>vs)return;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
if(v->vector) {
|
|
Packit |
cb6d3d |
v->vector = realloc(v->vector,sizeof(int16_t)*(size+vs));
|
|
Packit |
cb6d3d |
} else {
|
|
Packit |
cb6d3d |
v->vector = calloc(1, sizeof(int16_t)*size);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
if(pos<vs)memmove(v->vector+pos+size,v->vector+pos,
|
|
Packit |
cb6d3d |
(vs-pos)*sizeof(int16_t));
|
|
Packit |
cb6d3d |
memcpy(v->vector+pos,b,size*sizeof(int16_t));
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
v->size+=size;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
c_remove(c_block_t *v, long cutpos, long cutsize)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
int vs=cs(v);
|
|
Packit |
cb6d3d |
if(cutpos<0 || cutpos>vs)return;
|
|
Packit |
cb6d3d |
if(cutpos+cutsize>vs)cutsize=vs-cutpos;
|
|
Packit |
cb6d3d |
if(cutsize<0)cutsize=vs-cutpos;
|
|
Packit |
cb6d3d |
if(cutsize<1)return;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
memmove(v->vector+cutpos,v->vector+cutpos+cutsize,
|
|
Packit |
cb6d3d |
(vs-cutpos-cutsize)*sizeof(int16_t));
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
v->size-=cutsize;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
c_overwrite(c_block_t *v,long pos,int16_t *b,long size)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
int vs=cs(v);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
if(pos<0)return;
|
|
Packit |
cb6d3d |
if(pos+size>vs)size=vs-pos;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
memcpy(v->vector+pos,b,size*sizeof(int16_t));
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
c_append(c_block_t *v, int16_t *vector, long size)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
int vs=cs(v);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* update the vector */
|
|
Packit |
cb6d3d |
if(v->vector)
|
|
Packit |
cb6d3d |
v->vector=realloc(v->vector,sizeof(int16_t)*(size+vs));
|
|
Packit |
cb6d3d |
else {
|
|
Packit |
cb6d3d |
v->vector=calloc(1, sizeof(int16_t)*size);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
memcpy(v->vector+vs,vector,sizeof(int16_t)*size);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
v->size+=size;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
c_removef(c_block_t *v, long cut)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
c_remove(v,0,cut);
|
|
Packit |
cb6d3d |
v->begin+=cut;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/**** Initialization *************************************************/
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/*! Get the beginning and ending sector bounds given cursor position.
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
There are a couple of subtle differences between this and the
|
|
Packit |
cb6d3d |
cdda_firsttrack_sector and cdda_lasttrack_sector. If the cursor is
|
|
Packit |
cb6d3d |
an a sector later than cdda_firsttrack_sector, that sectur will be
|
|
Packit |
cb6d3d |
used. As for the difference between cdda_lasttrack_sector, if the CD
|
|
Packit |
cb6d3d |
is mixed and there is a data track after the cursor but before the
|
|
Packit |
cb6d3d |
last audio track, the end of the audio sector before that is used.
|
|
Packit |
cb6d3d |
*/
|
|
Packit |
cb6d3d |
void
|
|
Packit |
cb6d3d |
i_paranoia_firstlast(cdrom_paranoia_t *p)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
track_t i, j;
|
|
Packit |
cb6d3d |
cdrom_drive_t *d=p->d;
|
|
Packit |
cb6d3d |
const track_t i_first_track = cdio_get_first_track_num(d->p_cdio);
|
|
Packit |
cb6d3d |
const track_t i_last_track = cdio_get_last_track_num(d->p_cdio);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
p->current_lastsector = p->current_firstsector = -1;
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
i = cdda_sector_gettrack(d, p->cursor);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
if ( CDIO_INVALID_TRACK != i ) {
|
|
Packit |
cb6d3d |
if ( 0 == i ) i++;
|
|
Packit |
cb6d3d |
j = i;
|
|
Packit |
cb6d3d |
/* In the below loops, We assume the cursor already is on an audio
|
|
Packit |
cb6d3d |
sector. Not sure if this is correct if p->cursor is in the pregap
|
|
Packit |
cb6d3d |
before the first track.
|
|
Packit |
cb6d3d |
*/
|
|
Packit |
cb6d3d |
for ( ; i < i_last_track; i++)
|
|
Packit |
cb6d3d |
if( !cdda_track_audiop(d,i) ) {
|
|
Packit |
cb6d3d |
p->current_lastsector=cdda_track_lastsector(d,i-1);
|
|
Packit |
cb6d3d |
break;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
i = j;
|
|
Packit |
cb6d3d |
for ( ; i >= i_first_track; i-- )
|
|
Packit |
cb6d3d |
if( !cdda_track_audiop(d,i) ) {
|
|
Packit |
cb6d3d |
p->current_firstsector = cdda_track_firstsector(d,i+1);
|
|
Packit |
cb6d3d |
break;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
if (p->current_lastsector == -1)
|
|
Packit |
cb6d3d |
p->current_lastsector = cdda_disc_lastsector(d);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
if(p->current_firstsector == -1)
|
|
Packit |
cb6d3d |
p->current_firstsector = cdda_disc_firstsector(d);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
cdrom_paranoia_t *
|
|
Packit |
cb6d3d |
paranoia_init(cdrom_drive_t *d)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
cdrom_paranoia_t *p=calloc(1,sizeof(cdrom_paranoia_t));
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
p->cache=new_list((void *)&i_cblock_constructor,
|
|
Packit |
cb6d3d |
(void *)&i_cblock_destructor);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
p->fragments=new_list((void *)&i_vfragment_constructor,
|
|
Packit |
cb6d3d |
(void *)&i_v_fragment_destructor);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
p->cdcache_begin= 9999999;
|
|
Packit |
cb6d3d |
p->cdcache_end= 9999999;
|
|
Packit |
cb6d3d |
p->cdcache_size=CACHEMODEL_SECTORS;
|
|
Packit |
cb6d3d |
p->sortcache=sort_alloc(p->cdcache_size*CD_FRAMEWORDS);
|
|
Packit |
cb6d3d |
p->d=d;
|
|
Packit |
cb6d3d |
p->dynoverlap=MAX_SECTOR_OVERLAP*CD_FRAMEWORDS;
|
|
Packit |
cb6d3d |
p->cache_limit=JIGGLE_MODULO;
|
|
Packit |
cb6d3d |
p->enable=(paranoia_cb_mode_t)PARANOIA_MODE_FULL;
|
|
Packit |
cb6d3d |
p->cursor=cdda_disc_firstsector(d);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* One last one... in case data and audio tracks are mixed... */
|
|
Packit |
cb6d3d |
i_paranoia_firstlast(p);
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
return(p);
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
void paranoia_set_range(cdrom_paranoia_t *p, long start, long end)
|
|
Packit |
cb6d3d |
{
|
|
Packit |
cb6d3d |
p->cursor = start;
|
|
Packit |
cb6d3d |
p->current_firstsector = start;
|
|
Packit |
cb6d3d |
p->current_lastsector = end;
|
|
Packit |
cb6d3d |
}
|
|
Packit |
cb6d3d |
|
|
Packit |
cb6d3d |
/* sectors < 0 indicates a query. Returns the number of sectors before the call */
|
|
Packit |
cb6d3d |
int paranoia_cachemodel_size(cdrom_paranoia_t *p,int sectors){
|
|
Packit |
cb6d3d |
int ret = p->cdcache_size;
|
|
Packit |
cb6d3d |
if(sectors>=0)
|
|
Packit |
cb6d3d |
p->cdcache_size=sectors;
|
|
Packit |
cb6d3d |
return ret;
|
|
Packit |
cb6d3d |
}
|