Roughly implemented automatic .wav extraction in cdrskin

This commit is contained in:
Thomas Schmitt 2006-10-17 14:13:30 +00:00
parent f8fd6a21f4
commit 1e80ad2187
6 changed files with 253 additions and 43 deletions

View File

@ -111,10 +111,11 @@ or
cc -g -I. -DCdrskin_build_timestamP='...' \ cc -g -I. -DCdrskin_build_timestamP='...' \
-o cdrskin/cdrskin cdrskin/cdrskin.c cdrskin/cdrfifo.c cdrskin/cleanup.c \ -o cdrskin/cdrskin cdrskin/cdrskin.c cdrskin/cdrfifo.c cdrskin/cleanup.c \
libburn/async.o libburn/crc.o libburn/debug.o libburn/drive.o \ libburn/async.o libburn/crc.o libburn/debug.o libburn/drive.o \
libburn/file.o libburn/init.o libburn/lec.o libburn/message.o \ libburn/file.o libburn/init.o libburn/lec.o \
libburn/mmc.o libburn/options.o libburn/sbc.o libburn/sector.o \ libburn/mmc.o libburn/options.o libburn/sbc.o libburn/sector.o \
libburn/sg.o libburn/spc.o libburn/source.o libburn/structure.o \ libburn/sg.o libburn/spc.o libburn/source.o libburn/structure.o \
libburn/toc.o libburn/util.o libburn/write.o \ libburn/toc.o libburn/util.o libburn/write.o \
libburn/libdax_audioxtr.o libburn/libdax_msgs.o \
-lpthread -lpthread
*/ */
@ -168,6 +169,7 @@ or
#define Cdrskin_libburn_has_convert_scsi_adR 1 #define Cdrskin_libburn_has_convert_scsi_adR 1
#define Cdrskin_libburn_has_burn_msgS 1 #define Cdrskin_libburn_has_burn_msgS 1
#define Cdrskin_libburn_has_burn_aborT 1 #define Cdrskin_libburn_has_burn_aborT 1
#define Cdrskin_libburn_has_audioxtR 1
#endif #endif
#ifndef Cdrskin_libburn_versioN #ifndef Cdrskin_libburn_versioN
@ -275,6 +277,7 @@ or
/* #include <libburn/libburn.h> */ /* #include <libburn/libburn.h> */
#include "../libburn/libburn.h" #include "../libburn/libburn.h"
#include "../libburn/libdax_audioxtr.h"
#ifdef Cdrskin_libburn_has_cleanup_handleR #ifdef Cdrskin_libburn_has_cleanup_handleR
#define Cleanup_set_handlers burn_set_signal_handling #define Cleanup_set_handlers burn_set_signal_handling
@ -764,6 +767,8 @@ struct CdrtracK {
int set_by_padsize; int set_by_padsize;
int sector_pad_up; /* enforce single sector padding */ int sector_pad_up; /* enforce single sector padding */
int track_type; int track_type;
double sector_size;
int track_type_by_default;
/** Optional fifo between input fd and libburn. It uses a pipe(2) to transfer /** Optional fifo between input fd and libburn. It uses a pipe(2) to transfer
data to libburn. data to libburn.
@ -781,6 +786,7 @@ struct CdrtracK {
}; };
int Cdrtrack_destroy(struct CdrtracK **o, int flag); int Cdrtrack_destroy(struct CdrtracK **o, int flag);
int Cdrtrack_set_track_type(struct CdrtracK *o, int track_type, int flag);
/** Create a track resp. data source object. /** Create a track resp. data source object.
@ -795,10 +801,11 @@ int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss,
int trackno, int flag) int trackno, int flag)
{ {
struct CdrtracK *o; struct CdrtracK *o;
int ret; int ret,skin_track_type;
int Cdrskin_get_source(struct CdrskiN *skin, char *source_path, int Cdrskin_get_source(struct CdrskiN *skin, char *source_path,
double *fixed_size, double *padding, double *fixed_size, double *padding,
int *set_by_padsize, int *track_type, int flag); int *set_by_padsize, int *track_type,
int *track_type_by_default, int flag);
int Cdrskin_get_fifo_par(struct CdrskiN *skin, int *fifo_enabled, int Cdrskin_get_fifo_par(struct CdrskiN *skin, int *fifo_enabled,
int *fifo_size, int *fifo_start_empty, int flag); int *fifo_size, int *fifo_start_empty, int flag);
@ -815,6 +822,8 @@ int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss,
o->set_by_padsize= 0; o->set_by_padsize= 0;
o->sector_pad_up= Cdrskin_all_tracks_with_sector_paD; o->sector_pad_up= Cdrskin_all_tracks_with_sector_paD;
o->track_type= BURN_MODE1; o->track_type= BURN_MODE1;
o->sector_size= 2048.0;
o->track_type_by_default= 1;
o->fifo_enabled= 0; o->fifo_enabled= 0;
o->fifo= NULL; o->fifo= NULL;
o->fifo_outlet_fd= -1; o->fifo_outlet_fd= -1;
@ -822,9 +831,11 @@ int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss,
o->fifo_start_empty= 0; o->fifo_start_empty= 0;
o->libburn_track= NULL; o->libburn_track= NULL;
ret= Cdrskin_get_source(boss,o->source_path,&(o->fixed_size),&(o->padding), ret= Cdrskin_get_source(boss,o->source_path,&(o->fixed_size),&(o->padding),
&(o->set_by_padsize),&(o->track_type),0); &(o->set_by_padsize),&(skin_track_type),
&(o->track_type_by_default),0);
if(ret<=0) if(ret<=0)
goto failed; goto failed;
Cdrtrack_set_track_type(o,skin_track_type,0);
#ifndef Cdrskin_extra_leaN #ifndef Cdrskin_extra_leaN
ret= Cdrskin_get_fifo_par(boss, &(o->fifo_enabled),&(o->fifo_size), ret= Cdrskin_get_fifo_par(boss, &(o->fifo_enabled),&(o->fifo_size),
@ -863,11 +874,25 @@ int Cdrtrack_destroy(struct CdrtracK **o, int flag)
} }
int Cdrtrack_set_track_type(struct CdrtracK *o, int track_type, int flag)
{
if(track_type==BURN_AUDIO) {
o->track_type= BURN_AUDIO;
o->sector_size= 2352.0;
} else {
o->track_type= BURN_MODE1;
o->sector_size= 2048.0;
}
return(1);
}
int Cdrtrack_get_size(struct CdrtracK *track, double *size, double *padding, int Cdrtrack_get_size(struct CdrtracK *track, double *size, double *padding,
int flag) double *sector_size, int flag)
{ {
*size= track->fixed_size; *size= track->fixed_size;
*padding= track->padding; *padding= track->padding;
*sector_size= track->sector_size;
return(1); return(1);
} }
@ -879,18 +904,106 @@ int Cdrtrack_get_fifo(struct CdrtracK *track, struct CdrfifO **fifo, int flag)
} }
/** Try wether automatic audio extraction is appropriate and eventually open
a file descriptor to the raw data.
@return -2 could not open track source, no use in retrying
-1 severe error
0 not appropriate to extract, burn plain file content
1 to be extracted, *fd is a filedescriptor delivering raw data
*/
int Cdrtrack_extract_audio(struct CdrtracK *track, int *fd, int flag)
{
int l,ret;
#ifdef Cdrskin_libburn_has_audioxtR
struct libdax_audioxtr *xtr= NULL;
char *fmt,*fmt_info;
int num_channels,sample_rate,bits_per_sample;
#endif
*fd= -1;
if(track->track_type!=BURN_AUDIO && !track->track_type_by_default)
return(0);
l= strlen(track->source_path);
if(l<4)
return(0);
if(strcmp(track->source_path+l-4,".wav")!=0)
return(0);
if(track->track_type_by_default) {
Cdrtrack_set_track_type(track,BURN_AUDIO,0);
track->track_type_by_default= 2;
fprintf(stderr,"cdrskin: NOTE: Activated -audio for '%s'\n",
track->source_path);
}
#ifdef Cdrskin_libburn_has_audioxtR
ret= libdax_audioxtr_new(&xtr,track->source_path,0);
if(ret<=0)
return(ret);
libdax_audioxtr_get_id(xtr,&fmt,&fmt_info,
&num_channels,&sample_rate,&bits_per_sample,0);
if((num_channels!=2) || sample_rate!=44100 || bits_per_sample!=16)
{ret= 0; goto ex;}
ret= libdax_audioxtr_detach_fd(xtr,fd,0);
if(ret<=0)
{ret= -1*!!ret; goto ex;}
fprintf(stderr,"cdrskin: NOTE: Will extract plain audio from '%s'\n",
track->source_path);
ret= 1;
ex:
libdax_audioxtr_destroy(&xtr,0);
return(ret);
#else /* Cdrskin_libburn_has_audioxtR */
return(0);
#endif
}
/** Deliver an open file descriptor corresponding to the source path of track. /** Deliver an open file descriptor corresponding to the source path of track.
@return <=0 error, 1 success @return <=0 error, 1 success
*/ */
int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag) int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag)
{ {
int is_wav= 0;
if(track->source_path[0]=='-' && track->source_path[1]==0) if(track->source_path[0]=='-' && track->source_path[1]==0)
*fd= 0; *fd= 0;
else if(track->source_path[0]=='#' && else if(track->source_path[0]=='#' &&
(track->source_path[1]>='0' && track->source_path[1]<='9')) (track->source_path[1]>='0' && track->source_path[1]<='9'))
*fd= atoi(track->source_path+1); *fd= atoi(track->source_path+1);
else { else {
*fd= -1;
#define Try_auto_extract 1
#ifdef Try_auto_extract
is_wav= Cdrtrack_extract_audio(track,fd,0);
if(is_wav<0 && is_wav!=-2)
return(-1);
if(is_wav==0)
*fd= open(track->source_path,O_RDONLY);
#else /* Try_auto_extract */
if(*fd>=0)
close(*fd);
*fd= open(track->source_path,O_RDONLY); *fd= open(track->source_path,O_RDONLY);
is_wav= 0;
if(*fd>=0 && is_wav==1) {
char wav_head[44];
read(*fd, wav_head, 44);
}
#endif /* ! Try_auto_extract */
if(*fd==-1) { if(*fd==-1) {
fprintf(stderr,"cdrskin: failed to open source address '%s'\n", fprintf(stderr,"cdrskin: failed to open source address '%s'\n",
track->source_path); track->source_path);
@ -900,7 +1013,7 @@ int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag)
if(track->fixed_size<=0) { if(track->fixed_size<=0) {
struct stat stbuf; struct stat stbuf;
if(fstat(*fd,&stbuf)!=-1) if(fstat(*fd,&stbuf)!=-1)
track->fixed_size= stbuf.st_size; track->fixed_size= stbuf.st_size-(44*(is_wav==1));
} }
} }
} }
@ -948,6 +1061,9 @@ int Cdrtrack_attach_fifo(struct CdrtracK *track, int *outlet_fd,
if(ret<=0) if(ret<=0)
return(ret); return(ret);
} else { } else {
/* >>> ??? obtain track sector size and use instead of 2048 ? */
ret= Cdrfifo_new(&ff,source_fd,pipe_fds[1],2048,track->fifo_size,0); ret= Cdrfifo_new(&ff,source_fd,pipe_fds[1],2048,track->fifo_size,0);
if(ret<=0) if(ret<=0)
return(ret); return(ret);
@ -1019,6 +1135,14 @@ int Cdrtrack_add_to_session(struct CdrtracK *track, int trackno,
track->trackno= trackno; track->trackno= trackno;
tr= burn_track_create(); tr= burn_track_create();
track->libburn_track= tr; track->libburn_track= tr;
/* Note: track->track_type may get set in here */
if(track->source_fd==-1) {
ret= Cdrtrack_open_source_path(track,&source_fd,0);
if(ret<=0)
goto ex;
}
padding= 0.0; padding= 0.0;
sector_pad_up= track->sector_pad_up; sector_pad_up= track->sector_pad_up;
if(track->padding>0) { if(track->padding>0) {
@ -1044,11 +1168,6 @@ int Cdrtrack_add_to_session(struct CdrtracK *track, int trackno,
burn_track_define_data(tr,0,(int) lib_padding,sector_pad_up, burn_track_define_data(tr,0,(int) lib_padding,sector_pad_up,
track->track_type); track->track_type);
if(track->source_fd==-1) {
ret= Cdrtrack_open_source_path(track,&source_fd,0);
if(ret<=0)
goto ex;
}
fixed_size= track->fixed_size; fixed_size= track->fixed_size;
if((flag&2) && track->padding>0) { if((flag&2) && track->padding>0) {
if(flag&1) if(flag&1)
@ -2111,6 +2230,7 @@ struct CdrskiN {
/** track_type may be set to BURN_MODE1, BURN_AUDIO, etc. */ /** track_type may be set to BURN_MODE1, BURN_AUDIO, etc. */
int track_type; int track_type;
int track_type_by_default; /* 0= explicit, 1=not set, 2=by file extension */
/** The list of tracks with their data sources and parameters */ /** The list of tracks with their data sources and parameters */
struct CdrtracK *tracklist[Cdrskin_track_maX]; struct CdrtracK *tracklist[Cdrskin_track_maX];
@ -2213,6 +2333,7 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
o->padding= 0.0; o->padding= 0.0;
o->set_by_padsize= 0; o->set_by_padsize= 0;
o->track_type= BURN_MODE1; o->track_type= BURN_MODE1;
o->track_type_by_default= 1;
for(i=0;i<Cdrskin_track_maX;i++) for(i=0;i<Cdrskin_track_maX;i++)
o->tracklist[i]= NULL; o->tracklist[i]= NULL;
o->track_counter= 0; o->track_counter= 0;
@ -2281,13 +2402,15 @@ int Cdrskin_destroy(struct CdrskiN **o, int flag)
/** Return information about current track source */ /** Return information about current track source */
int Cdrskin_get_source(struct CdrskiN *skin, char *source_path, int Cdrskin_get_source(struct CdrskiN *skin, char *source_path,
double *fixed_size, double *padding, double *fixed_size, double *padding,
int *set_by_padsize, int *track_type, int flag) int *set_by_padsize, int *track_type,
int *track_type_by_default, int flag)
{ {
strcpy(source_path,skin->source_path); strcpy(source_path,skin->source_path);
*fixed_size= skin->fixed_size; *fixed_size= skin->fixed_size;
*padding= skin->padding; *padding= skin->padding;
*track_type= skin->track_type;
*set_by_padsize= skin->set_by_padsize; *set_by_padsize= skin->set_by_padsize;
*track_type= skin->track_type;
*track_type_by_default= skin->track_type_by_default;
return(1); return(1);
} }
@ -3432,7 +3555,7 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin,
*/ */
{ {
double bytes_to_write,written_bytes= 0.0,written_total_bytes= 0.0,buffer_size; double bytes_to_write,written_bytes= 0.0,written_total_bytes= 0.0,buffer_size;
double fixed_size,padding; double fixed_size,padding,sector_size,speed_factor;
double measured_total_speed,measured_speed; double measured_total_speed,measured_speed;
double elapsed_time,elapsed_total_time,current_time; double elapsed_time,elapsed_total_time,current_time;
double estim_time,estim_minutes,estim_seconds,percent; double estim_time,estim_minutes,estim_seconds,percent;
@ -3480,10 +3603,6 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin,
} else } else
goto thank_you_for_patience; goto thank_you_for_patience;
bytes_to_write= ((double) p->sectors)*2048.0;
written_total_bytes= ((double) p->sector)*2048.0;
written_bytes= written_total_bytes-*last_count;
old_track_idx= skin->supposed_track_idx; old_track_idx= skin->supposed_track_idx;
#ifdef Cdrskin_progress_track_brokeN #ifdef Cdrskin_progress_track_brokeN
/* with libburn.0.2 there is always reported 0 as p->track */ /* with libburn.0.2 there is always reported 0 as p->track */
@ -3499,13 +3618,25 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin,
#endif /* ! Cdrskin_progress_track_brokeN */ #endif /* ! Cdrskin_progress_track_brokeN */
if(old_track_idx>=0 && old_track_idx<skin->supposed_track_idx) { if(old_track_idx>=0 && old_track_idx<skin->supposed_track_idx) {
Cdrtrack_get_size(skin->tracklist[old_track_idx],&fixed_size,&padding,0); Cdrtrack_get_size(skin->tracklist[old_track_idx],&fixed_size,&padding,
&sector_size,0);
if(skin->verbosity>=Cdrskin_verbose_progresS) if(skin->verbosity>=Cdrskin_verbose_progresS)
printf("\n"); printf("\n");
printf("%sTrack %-2.2d: Total bytes read/written: %.f/%.f (%.f sectors).\n", printf("%sTrack %-2.2d: Total bytes read/written: %.f/%.f (%.f sectors).\n",
debug_mark,old_track_idx+1,fixed_size,fixed_size,fixed_size/2048.0); debug_mark,old_track_idx+1,fixed_size,fixed_size,
fixed_size/sector_size);
} }
sector_size= 2048.0;
if(skin->supposed_track_idx>=0 &&
skin->supposed_track_idx<skin->track_counter)
Cdrtrack_get_size(skin->tracklist[skin->supposed_track_idx],&fixed_size,
&padding,&sector_size,0);
bytes_to_write= ((double) p->sectors)*sector_size;
written_total_bytes= ((double) p->sector)*sector_size;
written_bytes= written_total_bytes-*last_count;
if(written_total_bytes<1024*1024) { if(written_total_bytes<1024*1024) {
thank_you_for_patience:; thank_you_for_patience:;
if(time_to_tell || skin->is_writing) { if(time_to_tell || skin->is_writing) {
@ -3604,8 +3735,7 @@ thank_you_for_patience:;
} }
if(skin->supposed_track_idx >= 0 && if(skin->supposed_track_idx >= 0 &&
skin->supposed_track_idx < skin->track_counter) { skin->supposed_track_idx < skin->track_counter) {
Cdrtrack_get_size(skin->tracklist[skin->supposed_track_idx], /* fixed_size,padding are fetched above via Cdrtrack_get_size() */;
&fixed_size,&padding,0);
} else if(skin->fixed_size!=0) { } else if(skin->fixed_size!=0) {
fixed_size= skin->fixed_size; fixed_size= skin->fixed_size;
padding= skin->padding; padding= skin->padding;
@ -3616,9 +3746,10 @@ thank_you_for_patience:;
(int) ((fixed_size+padding)/1024.0/1024.0)); (int) ((fixed_size+padding)/1024.0/1024.0));
} else } else
sprintf(mb_text,"%4d",(int) (written_total_bytes/1024.0/1024.0)); sprintf(mb_text,"%4d",(int) (written_total_bytes/1024.0/1024.0));
speed_factor= Cdrskin_cd_speed_factoR*sector_size/2048;
printf("\r%sTrack %-2.2d: %s MB written %s[buf 50%%] %4.1fx.", printf("\r%sTrack %-2.2d: %s MB written %s[buf 50%%] %4.1fx.",
debug_mark,skin->supposed_track_idx+1,mb_text,fifo_text, debug_mark,skin->supposed_track_idx+1,mb_text,fifo_text,
measured_speed/Cdrskin_cd_speed_factoR); measured_speed/speed_factor);
fflush(stdout); fflush(stdout);
} }
if(skin->is_writing==0) { if(skin->is_writing==0) {
@ -3682,7 +3813,7 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
int fifo_disabled= 0,fifo_percent,total_min_fill,mb; int fifo_disabled= 0,fifo_percent,total_min_fill,mb;
double put_counter,get_counter,empty_counter,full_counter; double put_counter,get_counter,empty_counter,full_counter;
double start_time,last_time; double start_time,last_time;
double total_count= 0.0,last_count= 0.0,size,padding; double total_count= 0.0,last_count= 0.0,size,padding,sector_size= 2048.0;
printf("cdrskin: beginning to burn disk\n"); printf("cdrskin: beginning to burn disk\n");
@ -3704,7 +3835,7 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
fprintf(stderr,"cdrskin: FATAL : cannot add track %d to session.\n",i+1); fprintf(stderr,"cdrskin: FATAL : cannot add track %d to session.\n",i+1);
return(0); return(0);
} }
Cdrtrack_get_size(skin->tracklist[i],&size,&padding,0); Cdrtrack_get_size(skin->tracklist[i],&size,&padding,&sector_size,0);
skin->fixed_size+= size+padding; skin->fixed_size+= size+padding;
} }
@ -3733,7 +3864,7 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
if(skin->verbosity>=Cdrskin_verbose_progresS) { if(skin->verbosity>=Cdrskin_verbose_progresS) {
for(i=0;i<skin->track_counter;i++) { for(i=0;i<skin->track_counter;i++) {
Cdrtrack_get_size(skin->tracklist[i],&size,&padding,0); Cdrtrack_get_size(skin->tracklist[i],&size,&padding,&sector_size,0);
if(size<=0) { if(size<=0) {
printf("Track %-2.2d: data unknown length",i+1); printf("Track %-2.2d: data unknown length",i+1);
} else { } else {
@ -3762,7 +3893,7 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
if(frac>99) if(frac>99)
frac= 99; frac= 99;
printf("Total size: %5d MB (%-2.2d:%-2.2d.%-2.2d) = %d sectors\n", printf("Total size: %5d MB (%-2.2d:%-2.2d.%-2.2d) = %d sectors\n",
mb,min,sec,frac,(int) (skin->fixed_size/2048)); mb,min,sec,frac,(int) (skin->fixed_size/sector_size));
seconds+= 2; seconds+= 2;
min= seconds/60.0; min= seconds/60.0;
sec= seconds-min*60; sec= seconds-min*60;
@ -3770,7 +3901,7 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
if(frac>99) if(frac>99)
frac= 99; frac= 99;
printf("Lout start: %5d MB (%-2.2d:%-2.2d/%-2.2d) = %d sectors\n", printf("Lout start: %5d MB (%-2.2d:%-2.2d/%-2.2d) = %d sectors\n",
mb,min,sec,frac,(int) (skin->fixed_size/2048)); mb,min,sec,frac,(int) (skin->fixed_size/sector_size));
} }
} }
@ -3883,12 +4014,12 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
printf("\n"); printf("\n");
if(max_track<=0) { if(max_track<=0) {
printf("Track 01: Total bytes read/written: %.f/%.f (%.f sectors).\n", printf("Track 01: Total bytes read/written: %.f/%.f (%.f sectors).\n",
total_count,total_count,total_count/2048.0); total_count,total_count,total_count/sector_size);
} else { } else {
Cdrtrack_get_size(skin->tracklist[max_track],&size,&padding,0); Cdrtrack_get_size(skin->tracklist[max_track],&size,&padding,&sector_size,0);
printf( printf(
"Track %-2.2d: Total bytes read/written: %.f/%.f (%.f sectors).\n", "Track %-2.2d: Total bytes read/written: %.f/%.f (%.f sectors).\n",
max_track+1,size,size,size/2048.0); max_track+1,size,size,size/sector_size);
} }
if(skin->verbosity>=Cdrskin_verbose_progresS) if(skin->verbosity>=Cdrskin_verbose_progresS)
printf("Writing time: %.3fs\n",Sfile_microtime(0)-start_time); printf("Writing time: %.3fs\n",Sfile_microtime(0)-start_time);
@ -4203,6 +4334,7 @@ set_abort_max_wait:;
} else if(strcmp(argv[i],"-audio")==0) { } else if(strcmp(argv[i],"-audio")==0) {
skin->track_type= BURN_AUDIO; skin->track_type= BURN_AUDIO;
skin->track_type_by_default= 0;
} else if(strncmp(argv[i],"-blank=",7)==0) { } else if(strncmp(argv[i],"-blank=",7)==0) {
cpt= argv[i]+7; cpt= argv[i]+7;
@ -4239,6 +4371,7 @@ set_blank:;
/* >>> !!! All Subsequent Tracks Option */ /* >>> !!! All Subsequent Tracks Option */
skin->track_type= BURN_MODE1; skin->track_type= BURN_MODE1;
skin->track_type_by_default= 0;
} else if(strcmp(argv[i],"--demand_a_drive")==0) { } else if(strcmp(argv[i],"--demand_a_drive")==0) {
/* is handled in Cdrpreskin_setup() */; /* is handled in Cdrpreskin_setup() */;

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2006.10.15.133035" #define Cdrskin_timestamP "2006.10.17.141053"

View File

@ -9,6 +9,7 @@ def_opts=
libvers="-DCdrskin_libburn_0_2_3" libvers="-DCdrskin_libburn_0_2_3"
cleanup_src_or_obj="cdrskin/cleanup.c" cleanup_src_or_obj="cdrskin/cleanup.c"
libdax_msgs_o="libburn/libdax_msgs.o" libdax_msgs_o="libburn/libdax_msgs.o"
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
do_strip=0 do_strip=0
static_opts= static_opts=
warn_opts="-Wall" warn_opts="-Wall"
@ -28,16 +29,19 @@ do
elif test "$i" = "-cvs_A60220" elif test "$i" = "-cvs_A60220"
then then
libvers="-DCdrskin_libburn_cvs_A60220_tS" libvers="-DCdrskin_libburn_cvs_A60220_tS"
libdax_audioxtr_o=
libdax_msgs_o="libburn/message.o" libdax_msgs_o="libburn/message.o"
cleanup_src_or_obj="cdrskin/cleanup.c" cleanup_src_or_obj="cdrskin/cleanup.c"
elif test "$i" = "-libburn_0_2_2" elif test "$i" = "-libburn_0_2_2"
then then
libvers="-DCdrskin_libburn_0_2_2" libvers="-DCdrskin_libburn_0_2_2"
libdax_audioxtr_o=
libdax_msgs_o="libburn/message.o" libdax_msgs_o="libburn/message.o"
cleanup_src_or_obj="cdrskin/cleanup.c" cleanup_src_or_obj="cdrskin/cleanup.c"
elif test "$i" = "-libburn_0_2_3" elif test "$i" = "-libburn_0_2_3"
then then
libvers="-DCdrskin_libburn_0_2_3" libvers="-DCdrskin_libburn_0_2_3"
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
libdax_msgs_o="libburn/libdax_msgs.o" libdax_msgs_o="libburn/libdax_msgs.o"
elif test "$i" = "-newapi" -o "$i" = "-experimental" elif test "$i" = "-newapi" -o "$i" = "-experimental"
then then
@ -117,6 +121,7 @@ then
\ \
libburn/sg.o \ libburn/sg.o \
libburn/write.o \ libburn/write.o \
$libdax_audioxtr_o \
$libdax_msgs_o \ $libdax_msgs_o \
\ \
libburn/mmc.o \ libburn/mmc.o \

View File

@ -27,7 +27,7 @@ extern struct libdax_msgs *libdax_messenger;
int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag) int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag)
{ {
int ret; int ret= -1;
struct libdax_audioxtr *o; struct libdax_audioxtr *o;
o= *xtr= (struct libdax_audioxtr *) malloc(sizeof(struct libdax_audioxtr)); o= *xtr= (struct libdax_audioxtr *) malloc(sizeof(struct libdax_audioxtr));
@ -45,12 +45,12 @@ int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag)
ret= libdax_audioxtr_open(o,0); ret= libdax_audioxtr_open(o,0);
if(ret<=0) if(ret<=0)
goto failure; {ret= -2*(ret<0); goto failure;}
return(1); return(1);
failure: failure:
libdax_audioxtr_destroy(xtr,0); libdax_audioxtr_destroy(xtr,0);
return(-1); return(ret);
} }
@ -197,3 +197,24 @@ int libdax_audioxtr_read(struct libdax_audioxtr *o,
return(ret); return(ret);
} }
int libdax_audioxtr_detach_fd(struct libdax_audioxtr *o, int *fd, int flag)
{
if(o->fd<0)
return(-1);
if(strcmp(o->fmt,".wav")!=0)
return(0);
if(flag&1) {
*fd= o->fd;
} else {
*fd= dup(o->fd);
if(*fd>=0 && strcmp(o->path,"-")!=0)
close(o->fd);
}
if(*fd>=0) {
o->fd= -1;
return(1);
}
return(-1);
}

View File

@ -9,6 +9,7 @@
/* Public Macros */ /* Public Macros */
/* Maximum size for address paths and fmt_info strings */
#define LIBDAX_AUDIOXTR_STRLEN 4096 #define LIBDAX_AUDIOXTR_STRLEN 4096
@ -35,7 +36,10 @@ struct libdax_audioxtr;
@param path Address of the audio file to extract. "-" is stdin (but might @param path Address of the audio file to extract. "-" is stdin (but might
be not suitable for all futurely supported formats). be not suitable for all futurely supported formats).
@param flag Bitfield for control purposes (unused yet, submit 0) @param flag Bitfield for control purposes (unused yet, submit 0)
@return >0 success, <=0 failure @return >0 success
0 unsuitable format
-1 severe error
-2 path not found
*/ */
int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag); int libdax_audioxtr_new(struct libdax_audioxtr **xtr, char *path, int flag);
@ -71,6 +75,21 @@ int libdax_audioxtr_read(struct libdax_audioxtr *xtr,
char buffer[], int buffer_size, int flag); char buffer[], int buffer_size, int flag);
/** Try to obtain a file descriptor which will deliver extracted data
to normal calls of read(2). This may fail because the format is
unsuitable for that, but ".wav" is ok. If this call succeeds the xtr
object will have forgotten its file descriptor and libdax_audioxtr_read()
will return a usage error. One may use *fd after libdax_audioxtr_destroy()
and will have to close it via close(2) when done with it.
@param xtr Opaque handle to extractor
@param fd Eventually returns the file descriptor number
@param flag Bitfield for control purposes
bit0= do not dup(2) and close(2) but hand out original fd
@return 1 success, 0 cannot hand out fd , -1 severe error
*/
int libdax_audioxtr_detach_fd(struct libdax_audioxtr *o, int *fd, int flag);
/** Clean up after extraction and destroy extractor object. /** Clean up after extraction and destroy extractor object.
@param xtr Opaque handle to extractor, *xtr is allowed to be NULL, @param xtr Opaque handle to extractor, *xtr is allowed to be NULL,
*xtr is set to NULL by this function *xtr is set to NULL by this function

View File

@ -15,20 +15,26 @@
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>
/* libdax_audioxtr is quite independent of libburn. It only needs
the messaging facility libdax_msgs. So we got two build variations:
*/
#ifdef Dewav_without_libburN #ifdef Dewav_without_libburN
/* This build environment is standalone relying only on libdax components */
#include "../libburn/libdax_msgs.h" #include "../libburn/libdax_msgs.h"
struct libdax_msgs *libdax_messenger= NULL; struct libdax_msgs *libdax_messenger= NULL;
#else /* Dewav_without_libburN */ #else /* Dewav_without_libburN */
/* The API of libburn */ /* This build environment uses libdax_msgs via libburn */
/* Thus the API header of libburn */
#include "../libburn/libburn.h" #include "../libburn/libburn.h"
#endif /* ! Dewav_without_libburN */ #endif /* ! Dewav_without_libburN */
/* The API extension for .wav extraction */ /* The API for .wav extraction */
#include "../libburn/libdax_audioxtr.h" #include "../libburn/libdax_audioxtr.h"
@ -39,6 +45,8 @@ int main(int argc, char **argv)
/* The read-and-extract object for use with in_path */ /* The read-and-extract object for use with in_path */
struct libdax_audioxtr *xtr= NULL; struct libdax_audioxtr *xtr= NULL;
/* The file descriptor eventually detached from xtr */
int xtr_fd= -2;
/* Default output is stdout */ /* Default output is stdout */
int out_fd= 1; int out_fd= 1;
@ -48,7 +56,7 @@ int main(int argc, char **argv)
int num_channels, sample_rate, bits_per_sample; int num_channels, sample_rate, bits_per_sample;
/* Auxiliary variables */ /* Auxiliary variables */
int ret, i, be_strict= 1, buf_count; int ret, i, be_strict= 1, buf_count, detach_fd= 0;
char buf[2048]; char buf[2048];
if(argc < 2) if(argc < 2)
@ -66,6 +74,9 @@ int main(int argc, char **argv)
be_strict= 0; be_strict= 0;
} else if(strcmp(argv[i],"--strict")==0) { } else if(strcmp(argv[i],"--strict")==0) {
be_strict= 1; be_strict= 1;
} else if(strcmp(argv[i],"--detach_fd")==0) {
/* Test the dirty detach method */
detach_fd= 1;
} else if(strcmp(argv[i],"--help")==0) { } else if(strcmp(argv[i],"--help")==0) {
help:; help:;
fprintf(stderr, fprintf(stderr,
@ -84,8 +95,11 @@ help:;
in_path= "-"; in_path= "-";
/* Depending on wether this was built standalone or with full libburn :
*/
#ifdef Dewav_without_libburN #ifdef Dewav_without_libburN
/* Initialize and set up libdax messaging system */
ret= libdax_msgs_new(&libdax_messenger,0); ret= libdax_msgs_new(&libdax_messenger,0);
if(ret<=0) { if(ret<=0) {
fprintf(stderr,"Failed to create libdax_messenger object.\n"); fprintf(stderr,"Failed to create libdax_messenger object.\n");
@ -97,7 +111,7 @@ help:;
#else /* Dewav_without_libburN */ #else /* Dewav_without_libburN */
/* Initialize libburn and set up messaging system */ /* Initialize libburn and set up its messaging system */
if(burn_initialize() == 0) { if(burn_initialize() == 0) {
fprintf(stderr,"Failed to initialize libburn.\n"); fprintf(stderr,"Failed to initialize libburn.\n");
exit(3); exit(3);
@ -126,8 +140,7 @@ help:;
libdax_audioxtr_get_id(xtr, &fmt, &fmt_info, libdax_audioxtr_get_id(xtr, &fmt, &fmt_info,
&num_channels, &sample_rate, &bits_per_sample, 0); &num_channels, &sample_rate, &bits_per_sample, 0);
fprintf(stderr, "Detected format: %s\n", fmt_info); fprintf(stderr, "Detected format: %s\n", fmt_info);
if((num_channels!=2 && num_channels!=4) || if(num_channels!=2 || sample_rate!=44100 || bits_per_sample!=16) {
sample_rate!=44100 || bits_per_sample!=16) {
fprintf(stderr, fprintf(stderr,
"%sAudio source parameters do not comply to cdrskin/README specs\n", "%sAudio source parameters do not comply to cdrskin/README specs\n",
(be_strict ? "" : "WARNING: ")); (be_strict ? "" : "WARNING: "));
@ -135,11 +148,29 @@ help:;
exit(6); exit(6);
} }
if(detach_fd) {
/* Take over fd from xtr */;
ret= libdax_audioxtr_detach_fd(xtr, &xtr_fd, 0);
if(ret<=0) {
fprintf(stderr, "Cannot detach file descriptor from extractor\n");
exit(8);
}
/* not needed any more */
libdax_audioxtr_destroy(&xtr, 0);
fprintf(stderr, "Note: detached fd and freed extractor object.\n");
}
/* Extract and put out raw audio data */; /* Extract and put out raw audio data */;
while(1) { while(1) {
buf_count= libdax_audioxtr_read(xtr, buf, sizeof(buf), 0); if(detach_fd) {
buf_count= read(xtr_fd, buf, sizeof(buf));
if(buf_count==-1)
fprintf(stderr,"Error while reading from detached fd\n(%d) '%s'\n",
errno, strerror(errno));
} else {
buf_count= libdax_audioxtr_read(xtr, buf, sizeof(buf), 0);
}
if(buf_count < 0) if(buf_count < 0)
exit(7); exit(7);
if(buf_count == 0) if(buf_count == 0)
@ -158,6 +189,7 @@ help:;
/* Shutdown */ /* Shutdown */
if(out_fd>2) if(out_fd>2)
close(out_fd); close(out_fd);
/* ( It is permissible to do this with xtr==NULL ) */
libdax_audioxtr_destroy(&xtr, 0); libdax_audioxtr_destroy(&xtr, 0);
#ifdef Dewav_without_libburN #ifdef Dewav_without_libburN