Partly implemented options cuefile= and -text

This commit is contained in:
Thomas Schmitt 2011-12-25 10:51:01 +00:00
parent 8cdba24ff9
commit 74fa33bc42
3 changed files with 250 additions and 121 deletions

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps .\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1) .\" other parameters are allowed: see man(7), man(1)
.TH CDRSKIN 1 "Dec 18, 2011" .TH CDRSKIN 1 "Dec 25, 2011"
.\" Please adjust this date whenever revising the manpage. .\" Please adjust this date whenever revising the manpage.
.\" .\"
.\" Some roff macros, for reference: .\" Some roff macros, for reference:
@ -80,15 +80,19 @@ Emulated drives
The input-output entities which get processed are called tracks. The input-output entities which get processed are called tracks.
A \fBtrack\fP stores a stream of bytes. A \fBtrack\fP stores a stream of bytes.
.br .br
Each track is initiated by one track source address argument, which may either
be "-" for standard input or the address of a readable file. If no write mode
is given explicitly then one will be chosen which matches the peculiarities
of track sources and the state of the output media.
.PP
More than one track can be burned by a single run of cdrskin. More than one track can be burned by a single run of cdrskin.
In the terms of the MMC standard all tracks written by the same run constitute In the terms of the MMC standard all tracks written by the same run constitute
a \fBsession\fP. a \fBsession\fP.
.br .br
Normally, each track is initiated by one track source address argument,
which may either be "-" for standard input or the address of a readable file.
Alternatively, option cuefile= may be used to read a session description
from a text file and to read the session content from a single data file.
.br
If no write mode
is given explicitly then one will be chosen which matches the peculiarities
of track sources and the state of the output media.
.PP
Some media types can be kept appendable so that further tracks can Some media types can be kept appendable so that further tracks can
be written to them in subsequent runs of cdrskin (see option -multi). be written to them in subsequent runs of cdrskin (see option -multi).
Info about the addresses of burned tracks is kept in a table of Info about the addresses of burned tracks is kept in a table of
@ -130,8 +134,8 @@ eventual multi-session capabilities.
A more restrictive mode A more restrictive mode
.B -sao .B -sao
(alias -dao) which usually demands a predictable track size and is not (alias -dao) which usually demands a predictable track size and is not
necessarily capable of multi-session. It may have advantages for some necessarily capable of multi-session. It can be used to write CD-TEXT and
readers resp. players of the recorded tracks. it is the only one that works with option cuefile=.
.br .br
If none of the options -dao, -tao or -sao is given then the program will If none of the options -dao, -tao or -sao is given then the program will
try to choose a write mode which matches the defined recording job, try to choose a write mode which matches the defined recording job,
@ -494,6 +498,18 @@ Print this list of blanking types.
Retrieve some info about the addressed drive and then exit. Retrieve some info about the addressed drive and then exit.
Exits with non-zero value if the drive cannot be found and opened. Exits with non-zero value if the drive cannot be found and opened.
.TP .TP
.BI cuefile= path
Read a session description from a cue sheet file in CDRWIN format.
Base the tracks on a single file which is given in the sheet by command FILE.
To enable CD-TEXT from the cue sheet file, cdrskin option -text has to be
present.
.br
cdrskin currently supports TRACK datatypes AUDIO and MODE1/2048 which may
not be mixed. It ignores commands POSTGAP, PREGAP, and FLAGS. Only INDEX 01
is interpreted yet. Commands CATALOG and ISRC only affect CD-TEXT but not
the Q sub-channel of the program area. Data source may be of FILE type BINARY
or MOTOROLA.
.TP
.BI \-dao .BI \-dao
Alias for option -sao. Write CD in Session at Once mode Alias for option -sao. Write CD in Session at Once mode
or DVD-R[W] in Disc-at-once mode. or DVD-R[W] in Disc-at-once mode.
@ -760,6 +776,11 @@ the only mode which allows -multi.
.br .br
Mode -tao is not usable for minimally blanked DVD-RW and for DVD-R DL. Mode -tao is not usable for minimally blanked DVD-RW and for DVD-R DL.
.TP .TP
.BI \-text
Enable writing of CD-TEXT attributes read by option cuefile=.
Without option -text, cue sheet file command CDTEXTFILE will be ignored and
no CD-TEXT attributes will be read from the file.
.TP
.BI textfile= path .BI textfile= path
Read CD-TEXT packs from the file depicted by path and put them into the Read CD-TEXT packs from the file depicted by path and put them into the
Lead-in of the emerging session. This session has to be done by Session At Once Lead-in of the emerging session. This session has to be done by Session At Once

View File

@ -897,6 +897,7 @@ struct CdrtracK {
int ff_idx; int ff_idx;
struct burn_track *libburn_track; struct burn_track *libburn_track;
int libburn_track_is_own;
#ifdef Cdrskin_use_libburn_fifO #ifdef Cdrskin_use_libburn_fifO
struct burn_source *libburn_fifo; struct burn_source *libburn_fifo;
@ -913,6 +914,7 @@ int Cdrtrack_set_track_type(struct CdrtracK *o, int track_type, int flag);
@param boss The cdrskin control object (corresponds to session) @param boss The cdrskin control object (corresponds to session)
@param trackno The index in the cdrskin tracklist array (is not constant) @param trackno The index in the cdrskin tracklist array (is not constant)
@param flag Bitfield for control purposes: @param flag Bitfield for control purposes:
bit0= do not set parameters by Cdrskin_get_source()
bit1= track is originally stdin bit1= track is originally stdin
*/ */
int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss, int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss,
@ -959,10 +961,14 @@ int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss,
o->ff_fifo= NULL; o->ff_fifo= NULL;
o->ff_idx= -1; o->ff_idx= -1;
o->libburn_track= NULL; o->libburn_track= NULL;
o->libburn_track_is_own= 0;
#ifdef Cdrskin_use_libburn_fifO #ifdef Cdrskin_use_libburn_fifO
o->libburn_fifo= NULL; o->libburn_fifo= NULL;
#endif /* Cdrskin_use_libburn_fifO */ #endif /* Cdrskin_use_libburn_fifO */
if(flag & 1)
return(1);
ret= Cdrskin_get_source(boss,o->source_path,&(o->fixed_size), ret= Cdrskin_get_source(boss,o->source_path,&(o->fixed_size),
&(o->tao_to_sao_tsize),&(o->use_data_image_size), &(o->tao_to_sao_tsize),&(o->use_data_image_size),
&(o->padding),&(o->set_by_padsize),&(skin_track_type), &(o->padding),&(o->set_by_padsize),&(skin_track_type),
@ -1002,7 +1008,7 @@ int Cdrtrack_destroy(struct CdrtracK **o, int flag)
Cdrfifo_destroy(&(track->fifo),0); Cdrfifo_destroy(&(track->fifo),0);
#endif #endif
if(track->libburn_track!=NULL) if(track->libburn_track != NULL && track->libburn_track_is_own)
burn_track_free(track->libburn_track); burn_track_free(track->libburn_track);
if(track->iso_fs_descr!=NULL) if(track->iso_fs_descr!=NULL)
free((char *) track->iso_fs_descr); free((char *) track->iso_fs_descr);
@ -1631,6 +1637,7 @@ 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;
track->libburn_track_is_own= 1;
/* Note: track->track_type may get set in here */ /* Note: track->track_type may get set in here */
if(track->source_fd==-1) { if(track->source_fd==-1) {
@ -1739,6 +1746,7 @@ int Cdrtrack_cleanup(struct CdrtracK *track, int flag)
{ {
if(track->libburn_track==NULL) if(track->libburn_track==NULL)
return(0); return(0);
if(track->libburn_track_is_own)
burn_track_free(track->libburn_track); burn_track_free(track->libburn_track);
track->libburn_track= NULL; track->libburn_track= NULL;
return(1); return(1);
@ -2896,8 +2904,12 @@ see_cdrskin_eng_html:;
fprintf(stderr,"\ttsize=#\t\tannounces exact size of source data\n"); fprintf(stderr,"\ttsize=#\t\tannounces exact size of source data\n");
fprintf(stderr,"\tpadsize=#\tAmount of padding\n"); fprintf(stderr,"\tpadsize=#\tAmount of padding\n");
fprintf(stderr,
"\t-text\t\tWrite CD-Text from information from *.cue files\n");
fprintf(stderr, fprintf(stderr,
"\ttextfile=name\tSet the file with CD-Text data to 'name'\n"); "\ttextfile=name\tSet the file with CD-Text data to 'name'\n");
fprintf(stderr,
"\tcuefile=name\tSet the file with CDRWIN CUE data to 'name'\n");
fprintf(stderr,"\t-audio\t\tSubsequent tracks are CD-DA audio tracks\n"); fprintf(stderr,"\t-audio\t\tSubsequent tracks are CD-DA audio tracks\n");
fprintf(stderr, fprintf(stderr,
"\t-data\t\tSubsequent tracks are CD-ROM data mode 1 (default)\n"); "\t-data\t\tSubsequent tracks are CD-ROM data mode 1 (default)\n");
@ -3319,6 +3331,10 @@ struct CdrskiN {
int track_type_by_default; /* 0= explicit, 1=not set, 2=by file extension */ int track_type_by_default; /* 0= explicit, 1=not set, 2=by file extension */
int swap_audio_bytes; int swap_audio_bytes;
/** CDRWIN cue sheet file */
char cuefile[Cdrskin_adrleN];
int use_cdtext;
/** CD-TEXT */ /** CD-TEXT */
unsigned char *text_packs; unsigned char *text_packs;
int num_text_packs; int num_text_packs;
@ -3328,6 +3344,7 @@ struct CdrskiN {
int cdtext_test; int cdtext_test;
/** 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];
int track_counter; int track_counter;
@ -3348,7 +3365,7 @@ struct CdrskiN {
int fifo_size; int fifo_size;
int fifo_start_at; int fifo_start_at;
int fifo_per_track; int fifo_per_track;
struct burn_source *cuefile_fifo;
/** User defined address translation */ /** User defined address translation */
struct CdradrtrN *adr_trn; struct CdradrtrN *adr_trn;
@ -3479,6 +3496,8 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
o->fill_up_media= 0; o->fill_up_media= 0;
o->track_type= BURN_MODE1; o->track_type= BURN_MODE1;
o->swap_audio_bytes= 1; /* cdrecord default is big-endian (msb_first) */ o->swap_audio_bytes= 1; /* cdrecord default is big-endian (msb_first) */
o->cuefile[0] = 0;
o->use_cdtext = 0;
o->text_packs= NULL; o->text_packs= NULL;
o->num_text_packs= 0; o->num_text_packs= 0;
o->sheet_v07t_blocks= 0; o->sheet_v07t_blocks= 0;
@ -3496,6 +3515,7 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
o->fifo_size= 4*1024*1024; o->fifo_size= 4*1024*1024;
o->fifo_start_at= -1; o->fifo_start_at= -1;
o->fifo_per_track= 0; o->fifo_per_track= 0;
o->cuefile_fifo= NULL;
o->adr_trn= NULL; o->adr_trn= NULL;
o->drives= NULL; o->drives= NULL;
o->n_drives= 0; o->n_drives= 0;
@ -3551,6 +3571,8 @@ int Cdrskin_destroy(struct CdrskiN **o, int flag)
Cdradrtrn_destroy(&(skin->adr_trn),0); Cdradrtrn_destroy(&(skin->adr_trn),0);
#endif /* ! Cdrskin_extra_leaN */ #endif /* ! Cdrskin_extra_leaN */
if(skin->cuefile_fifo != NULL)
burn_source_free(skin->cuefile_fifo);
if(skin->text_packs != NULL) if(skin->text_packs != NULL)
free(skin->text_packs); free(skin->text_packs);
Cdrpreskin_destroy(&(skin->preskin),0); Cdrpreskin_destroy(&(skin->preskin),0);
@ -4613,7 +4635,8 @@ int Cdrskin_obtain_nwa(struct CdrskiN *skin, int *nwa, int flag)
/* @param flag bit0-3= source of text packs: /* @param flag bit0-3= source of text packs:
0= CD Lead-in 0= CD Lead-in
0= session and tracks 1= session and tracks
2= textfile=
*/ */
int Cdrskin_print_text_packs(struct CdrskiN *skin, unsigned char *text_packs, int Cdrskin_print_text_packs(struct CdrskiN *skin, unsigned char *text_packs,
int num_packs, int flag) int num_packs, int flag)
@ -4627,6 +4650,8 @@ int Cdrskin_print_text_packs(struct CdrskiN *skin, unsigned char *text_packs,
from_text= " from CD Lead-in"; from_text= " from CD Lead-in";
else if(from == 1) else if(from == 1)
from_text= " from session and tracks"; from_text= " from session and tracks";
else if(from == 2)
from_text= " from textfile= or cuefile= CDTEXTFILE";
printf("CD-TEXT data%s:\n", from_text); printf("CD-TEXT data%s:\n", from_text);
for(i= 0; i < num_packs; i++) { for(i= 0; i < num_packs; i++) {
pack= text_packs + 18 * i; pack= text_packs + 18 * i;
@ -5333,71 +5358,12 @@ ex:;
int Cdrskin_read_textfile(struct CdrskiN *skin, char *path, int flag) int Cdrskin_read_textfile(struct CdrskiN *skin, char *path, int flag)
{ {
int ret= 0, num_packs= 0, residue= 0; int ret, num_packs = 0;
struct stat stbuf; unsigned char *text_packs = NULL;
FILE *fp= NULL;
unsigned char *text_packs = NULL, head[4], tail[1];
if(stat(path, &stbuf) == -1) { ret= burn_cdtext_from_packfile(path, &text_packs, &num_packs, 0);
cannot_open:; if(ret <= 0)
fprintf(stderr, "cdrskin: SORRY : Cannot open textfile='%s'\n", path); goto ex;
fprintf(stderr, "cdrskin: %s (errno=%d)\n", strerror(errno), errno);
ret= 0; goto ex;
}
if(!S_ISREG(stbuf.st_mode))
goto not_a_textfile;
residue= (stbuf.st_size % 18);
if(residue != 4 && residue != 0 && residue != 1) {
not_a_textfile:;
fprintf(stderr,
"cdrskin: SORRY : File is not of usable type or content: textfile='%s'\n",
path);
ret= 0; goto ex;
}
if(stbuf.st_size < 18)
goto not_a_textfile;
fp= fopen(path, "rb");
if(fp == NULL)
goto cannot_open;
if(residue == 4) { /* This is for files from cdrecord -vv -toc */
ret= fread(head, 4, 1, fp);
if(ret != 1) {
cannot_read:;
fprintf(stderr,
"cdrskin: SORRY : Cannot read all bytes from textfile='%s'\n", path);
fprintf(stderr, "cdrskin: %s (errno=%d)\n", strerror(errno), errno);
ret= 0; goto ex;
}
if(head[0] * 256 + head[1] != stbuf.st_size - 2)
goto not_a_textfile;
}
num_packs= (stbuf.st_size - residue) / 18;
if(num_packs > 2048) {
/* Each block can have 256 text packs. There are 8 blocks at most. */
fprintf(stderr,
"cdrskin: SORRY : File too large (max. 65524 bytes): textfile='%s'\n",
path);
goto not_a_textfile;
}
text_packs= calloc(num_packs, 18);
if(text_packs == NULL) {
fprintf(stderr,
"cdrskin: FATAL : Cannot allocate %d bytes of memory for CD-TEXT\n",
num_packs * 18);
ret= -1; goto ex;
}
ret= fread(text_packs, num_packs * 18, 1, fp);
if(ret != 1)
goto cannot_read;
if(residue == 1) { /* This is for Sony CDTEXT files */
ret= fread(tail, 1, 1, fp);
if(ret != 1)
goto cannot_read;
if(tail[0] != 0)
goto not_a_textfile;
}
if(skin->text_packs != NULL) if(skin->text_packs != NULL)
free(skin->text_packs); free(skin->text_packs);
@ -5407,8 +5373,6 @@ cannot_read:;
ex:; ex:;
if(ret <= 0 && text_packs != NULL) if(ret <= 0 && text_packs != NULL)
free(text_packs); free(text_packs);
if(fp != NULL)
fclose(fp);
return(ret); return(ret);
} }
@ -5779,6 +5743,27 @@ ex:;
} }
int Cdrskin__libburn_fifo_status(struct burn_source *current_fifo,
char fifo_text[80], int flag)
{
int ret, size, free_space, fill, fifo_percent;
char *status_text= "";
ret= burn_fifo_inquire_status(current_fifo, &size, &free_space,
&status_text);
if(ret <= 0 || ret >= 4) {
strcpy(fifo_text, "(fifo 0%) ");
} else if(ret == 1) {
burn_fifo_next_interval(current_fifo, &fill);
fifo_percent= 100.0 * ((double) fill) / (double) size;
if(fifo_percent<100 && fill>0)
fifo_percent++;
sprintf(fifo_text, "(fifo %3d%%) ", fifo_percent);
}
return(1);
}
/** Report burn progress. This is done partially in cdrecord style. /** Report burn progress. This is done partially in cdrecord style.
Actual reporting happens only if write progress hit the next MB or if in Actual reporting happens only if write progress hit the next MB or if in
non-write-progress states a second has elapsed since the last report. non-write-progress states a second has elapsed since the last report.
@ -5821,8 +5806,12 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin,
#ifdef Cdrskin_use_libburn_fifO #ifdef Cdrskin_use_libburn_fifO
struct burn_source *current_fifo= NULL; struct burn_source *current_fifo= NULL;
#ifdef NIX
int size, free_space; int size, free_space;
char *status_text= ""; char *status_text= "";
#endif
#endif /* Cdrskin_use_libburn_fifO */ #endif /* Cdrskin_use_libburn_fifO */
/* for debugging */ /* for debugging */
@ -5881,7 +5870,8 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin,
old_track_idx= skin->supposed_track_idx; old_track_idx= skin->supposed_track_idx;
skin->supposed_track_idx= p->track; skin->supposed_track_idx= p->track;
if(old_track_idx>=0 && old_track_idx<skin->supposed_track_idx) { if(old_track_idx>=0 && old_track_idx<skin->supposed_track_idx &&
skin->supposed_track_idx < skin->track_counter) {
Cdrtrack_get_size(skin->tracklist[old_track_idx],&fixed_size,&padding, Cdrtrack_get_size(skin->tracklist[old_track_idx],&fixed_size,&padding,
&sector_size,&use_data_image_size,1); &sector_size,&use_data_image_size,1);
if(skin->verbosity>=Cdrskin_verbose_progresS) if(skin->verbosity>=Cdrskin_verbose_progresS)
@ -5979,27 +5969,19 @@ thank_you_for_patience:;
curr_fifo_in= last_fifo_in; curr_fifo_in= last_fifo_in;
curr_fifo_out= last_fifo_out; curr_fifo_out= last_fifo_out;
if(skin->cuefile_fifo != NULL)
Cdrskin__libburn_fifo_status(skin->cuefile_fifo, fifo_text, 0);
#ifdef Cdrskin_use_libburn_fifO #ifdef Cdrskin_use_libburn_fifO
/* Inquire fifo fill and format fifo pacifier text */ /* Inquire fifo fill and format fifo pacifier text */
if(skin->fifo == NULL && skin->supposed_track_idx >= 0 && if(skin->fifo == NULL && skin->supposed_track_idx >= 0 &&
skin->supposed_track_idx < skin->track_counter && skin->supposed_track_idx < skin->track_counter &&
skin->fifo_size > 0) { skin->fifo_size > 0 && fifo_text[0] == 0) {
Cdrtrack_get_libburn_fifo(skin->tracklist[skin->supposed_track_idx], Cdrtrack_get_libburn_fifo(skin->tracklist[skin->supposed_track_idx],
&current_fifo, 0); &current_fifo, 0);
if(current_fifo != NULL) { if(current_fifo != NULL) {
ret= burn_fifo_inquire_status(current_fifo, &size, &free_space, Cdrskin__libburn_fifo_status(current_fifo, fifo_text, 0);
&status_text);
if(ret <= 0 || ret >= 4) {
strcpy(fifo_text, "(fifo 0%) ");
} else if(ret == 1) {
burn_fifo_next_interval(current_fifo, &fill);
fifo_percent= 100.0 * ((double) fill) / (double) size;
if(fifo_percent<100 && fill>0)
fifo_percent++;
sprintf(fifo_text, "(fifo %3d%%) ", fifo_percent);
} else
strcpy(fifo_text, "(fifo 100%) ");
} else if(skin->fifo_size > 0) { } else if(skin->fifo_size > 0) {
strcpy(fifo_text, "(fifo 100%) "); strcpy(fifo_text, "(fifo 100%) ");
} }
@ -6453,6 +6435,10 @@ int Cdrskin_cdtext_test(struct CdrskiN *skin, struct burn_write_opts *o,
int ret, num_packs; int ret, num_packs;
unsigned char *text_packs = NULL; unsigned char *text_packs = NULL;
if(skin->num_text_packs > 0) {
Cdrskin_print_text_packs(skin, skin->text_packs, skin->num_text_packs, 2);
ret= 1; goto ex;
}
ret= burn_cdtext_from_session(session, &text_packs, &num_packs, 0); ret= burn_cdtext_from_session(session, &text_packs, &num_packs, 0);
if(ret < 0) if(ret < 0)
goto ex; goto ex;
@ -6478,6 +6464,58 @@ int Cdrskin_read_input_sheet_v07t(struct CdrskiN *skin, char *path, int block,
} }
int Cdrskin_cdrtracks_from_session(struct CdrskiN *skin,
struct burn_session *session, int flag)
{
int ret, num_tracks, i;
struct burn_track **tracks;
struct CdrtracK *t;
double sectors;
for(i= 0; i < skin->track_counter; i++)
Cdrtrack_destroy(&(skin->tracklist[i]), 0);
skin->track_counter= 0;
tracks= burn_session_get_tracks(session, &num_tracks);
if(num_tracks <= 0) {
fprintf(stderr, "cdrskin: SORRY : No tracks defined for burn run.\n");
ret= 0; goto ex;
}
for(i= 0; i < num_tracks; i++) {
/* Create Cdrtrack without reading parameters from skin */
ret= Cdrtrack_new(&(skin->tracklist[skin->track_counter]), skin,
skin->track_counter, 1);
if(ret <= 0) {
fprintf(stderr,
"cdrskin: FATAL : Creation of track control object failed.\n");
goto ex;
}
/* Set essential properties */
t= skin->tracklist[skin->track_counter];
t->track_type= burn_track_get_mode(tracks[i]);
if(t->track_type == BURN_AUDIO)
t->sector_size= 2352;
else
t->sector_size= 2048;
sectors= burn_track_get_sectors(tracks[i]);
t->fixed_size= sectors * t->sector_size;
t->libburn_track= tracks[i];
t->libburn_track_is_own= 0;
skin->track_counter++;
}
ret= 1;
ex:
if(ret <= 0) {
for(i= 0; i < skin->track_counter; i++)
Cdrtrack_destroy(&(skin->tracklist[i]), 0);
skin->track_counter= 0;
}
return(ret);
}
/** Burn data via libburn according to the parameters set in skin. /** Burn data via libburn according to the parameters set in skin.
@return <=0 error, 1 success @return <=0 error, 1 success
*/ */
@ -6485,7 +6523,8 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
{ {
struct burn_disc *disc; struct burn_disc *disc;
struct burn_session *session; struct burn_session *session;
struct burn_write_opts *o; struct burn_write_opts *o = NULL;
struct burn_source *cuefile_fifo= NULL;
enum burn_disc_status s; enum burn_disc_status s;
enum burn_drive_status drive_status; enum burn_drive_status drive_status;
struct burn_progress p; struct burn_progress p;
@ -6499,6 +6538,8 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
char *source_path; char *source_path;
int source_fd, is_from_stdin; int source_fd, is_from_stdin;
int text_flag= 4; /* Check CRCs and silently repair CRCs if all are 0 */ int text_flag= 4; /* Check CRCs and silently repair CRCs if all are 0 */
unsigned char *text_packs= NULL;
int num_packs= 0;
#ifndef Cdrskin_no_cdrfifO #ifndef Cdrskin_no_cdrfifO
double put_counter, get_counter, empty_counter, full_counter; double put_counter, get_counter, empty_counter, full_counter;
@ -6532,12 +6573,51 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
if(ret==0) { if(ret==0) {
fprintf(stderr,"cdrskin: FATAL : Cannot add session to disc object.\n"); fprintf(stderr,"cdrskin: FATAL : Cannot add session to disc object.\n");
burn_failed:; burn_failed:;
if(cuefile_fifo != NULL)
burn_source_free(cuefile_fifo);
if(skin->verbosity>=Cdrskin_verbose_progresS) if(skin->verbosity>=Cdrskin_verbose_progresS)
printf("cdrskin: %s failed\n", doing); printf("cdrskin: %s failed\n", doing);
fprintf(stderr,"cdrskin: FATAL : %s failed.\n", doing); fprintf(stderr,"cdrskin: FATAL : %s failed.\n", doing);
return(0); return(0);
} }
skin->fixed_size= 0.0; skin->fixed_size= 0.0;
skin->has_open_ended_track= 0;
if(skin->cuefile[0]) {
if(skin->track_counter > 0) {
fprintf(stderr,
"cdrskin: SORRY : Option cuefile= cannot be combined with track sources\n");
goto burn_failed;
}
if(strcmp(skin->preskin->write_mode_name, "SAO") != 0 &&
strcmp(skin->preskin->write_mode_name, "DEFAULT") != 0) {
fprintf(stderr,
"cdrskin: SORRY : Option cuefile= works only with write mode SAO");
goto burn_failed;
}
strcpy(skin->preskin->write_mode_name, "SAO");
ret= burn_session_by_cue_file(session, skin->cuefile, skin->fifo_size,
&cuefile_fifo,
&text_packs, &num_packs, !skin->use_cdtext);
if(ret <= 0)
goto burn_failed;
if(num_packs > 0) {
if(skin->num_text_packs > 0) {
fprintf(stderr, "cdrskin: WARNING : Option textfile= overrides CDTEXTFILE from option cuesheet=\n");
if(text_packs != NULL)
free(text_packs);
} else {
skin->text_packs= text_packs;
skin->num_text_packs= num_packs;
}
}
ret= Cdrskin_cdrtracks_from_session(skin, session, 0);
if(ret <= 0)
goto burn_failed;
skin->cuefile_fifo= cuefile_fifo;
cuefile_fifo= NULL;
} else {
for(i=0;i<skin->track_counter;i++) { for(i=0;i<skin->track_counter;i++) {
hflag= (skin->verbosity>=Cdrskin_verbose_debuG); hflag= (skin->verbosity>=Cdrskin_verbose_debuG);
if(i==skin->track_counter-1) if(i==skin->track_counter-1)
@ -6562,15 +6642,18 @@ burn_failed:;
skin->has_open_ended_track= 1; skin->has_open_ended_track= 1;
non_audio= (skin->tracklist[i]->track_type != BURN_AUDIO); non_audio= (skin->tracklist[i]->track_type != BURN_AUDIO);
} }
}
if(skin->sheet_v07t_blocks > 0) { if(skin->sheet_v07t_blocks > 0) {
if(skin->num_text_packs > 0) { if(skin->num_text_packs > 0) {
fprintf(stderr, fprintf(stderr, "cdrskin: WARNING : Option textfile= or cuefile= overrides option input_sheet_v07t=\n");
"cdrskin: WARNING : Option textfile= overrides option input_sheet_v07t=\n");
} else if(non_audio) { } else if(non_audio) {
fprintf(stderr, "cdrskin: SORRY : Option input_sheet_v07t= works only if all tracks are -audio\n"); fprintf(stderr, "cdrskin: SORRY : Option input_sheet_v07t= works only if all tracks are -audio\n");
goto burn_failed; goto burn_failed;
} else { } else {
/* >>> if cuefile and session has block 0, then start at block 1 */;
for(i= 0; i < skin->sheet_v07t_blocks; i++) { for(i= 0; i < skin->sheet_v07t_blocks; i++) {
ret= Cdrskin_read_input_sheet_v07t(skin, skin->sheet_v07t_paths[i], i, ret= Cdrskin_read_input_sheet_v07t(skin, skin->sheet_v07t_paths[i], i,
session, 0); session, 0);
@ -6603,8 +6686,6 @@ burn_failed:;
} }
#endif /* Cdrskin_extra_leaN */ #endif /* Cdrskin_extra_leaN */
skin->fixed_size= 0.0;
skin->has_open_ended_track= 0;
for(i=0;i<skin->track_counter;i++) { for(i=0;i<skin->track_counter;i++) {
Cdrtrack_get_size(skin->tracklist[i],&size,&padding,&sector_size, Cdrtrack_get_size(skin->tracklist[i],&size,&padding,&sector_size,
&use_data_image_size,0); &use_data_image_size,0);
@ -6734,7 +6815,7 @@ burn_failed:;
Cdrskin_announce_tracks(skin,0); Cdrskin_announce_tracks(skin,0);
#endif #endif
if(skin->tell_media_space || skin->track_counter<=0) { if(skin->tell_media_space || skin->track_counter <= 0) {
/* write capacity estimation and return without actual burning */ /* write capacity estimation and return without actual burning */
free_space= burn_disc_available_space(drive,o); free_space= burn_disc_available_space(drive,o);
@ -6769,6 +6850,8 @@ burn_failed:;
Cdrskin_wait_before_action(skin,0); Cdrskin_wait_before_action(skin,0);
if(needs_early_fifo_fill==1) if(needs_early_fifo_fill==1)
ret= 1; ret= 1;
else if(skin->cuefile[0] != 0)
ret= 1;
else else
ret= Cdrskin_fill_fifo(skin,0); ret= Cdrskin_fill_fifo(skin,0);
if(ret<=0) { if(ret<=0) {
@ -6779,8 +6862,10 @@ fifo_filling_failed:;
#endif /* ! Cdrskin_extra_leaN */ #endif /* ! Cdrskin_extra_leaN */
if(skin->verbosity>=Cdrskin_verbose_progresS && nwa>=0) if(skin->verbosity>=Cdrskin_verbose_progresS && nwa>=0) {
printf("Starting new track at sector: %d\n",nwa); printf("Starting new track at sector: %d\n",nwa);
fflush(stdout);
}
skin->drive_is_busy= 1; skin->drive_is_busy= 1;
burn_disc_write(o, disc); burn_disc_write(o, disc);
if(skin->preskin->abort_handler==-1) if(skin->preskin->abort_handler==-1)
@ -6789,6 +6874,7 @@ fifo_filling_failed:;
last_time= start_time= Sfile_microtime(0); last_time= start_time= Sfile_microtime(0);
burn_write_opts_free(o); burn_write_opts_free(o);
o= NULL;
while (burn_drive_get_status(drive, NULL) == BURN_DRIVE_SPAWNING) { while (burn_drive_get_status(drive, NULL) == BURN_DRIVE_SPAWNING) {
@ -6999,6 +7085,10 @@ ex:;
ClN(printf("cdrskin_debug: do_eject= %d\n",skin->do_eject)); ClN(printf("cdrskin_debug: do_eject= %d\n",skin->do_eject));
for(i= 0;i<skin->track_counter;i++) for(i= 0;i<skin->track_counter;i++)
Cdrtrack_cleanup(skin->tracklist[i],0); Cdrtrack_cleanup(skin->tracklist[i],0);
if(o != NULL)
burn_write_opts_free(o);
if(cuefile_fifo != NULL)
burn_source_free(cuefile_fifo);
burn_session_free(session); burn_session_free(session);
burn_disc_free(disc); burn_disc_free(disc);
return(ret); return(ret);
@ -7177,7 +7267,7 @@ int Cdrskin_setup(struct CdrskiN *skin, int argc, char **argv, int flag)
static char ignored_partial_options[][41]= { static char ignored_partial_options[][41]= {
"timeout=", "debug=", "kdebug=", "kd=", "driver=", "ts=", "timeout=", "debug=", "kdebug=", "kd=", "driver=", "ts=",
"pregap=", "defpregap=", "mcn=", "isrc=", "index=", "pregap=", "defpregap=", "mcn=", "isrc=", "index=",
"pktsize=", "cuefile=", "pktsize=",
"" ""
}; };
static char ignored_full_options[][41]= { static char ignored_full_options[][41]= {
@ -7185,7 +7275,7 @@ int Cdrskin_setup(struct CdrskiN *skin, int argc, char **argv, int flag)
"-reset", "-abort", "-overburn", "-ignsize", "-useinfo", "-reset", "-abort", "-overburn", "-ignsize", "-useinfo",
"-fix", "-nofix", "-fix", "-nofix",
"-raw", "-raw96p", "-raw16", "-raw96r", "-raw", "-raw96p", "-raw16", "-raw96r",
"-clone", "-text", "-clone",
"-cdi", "-preemp", "-nopreemp", "-copy", "-nocopy", "-cdi", "-preemp", "-nopreemp", "-copy", "-nocopy",
"-scms", "-shorttrack", "-noshorttrack", "-packet", "-noclose", "-scms", "-shorttrack", "-noshorttrack", "-packet", "-noclose",
"" ""
@ -7697,6 +7787,21 @@ gracetime_equals:;
} else if(strcmp(argv[i],"-inq")==0) { } else if(strcmp(argv[i],"-inq")==0) {
skin->do_checkdrive= 2; skin->do_checkdrive= 2;
} else if(strncmp(argv[i],"-cuefile=", 9)==0) {
value_pt= argv[i] + 10;
goto set_cuefile;
} else if(strncmp(argv[i],"cuefile=", 8)==0) {
value_pt= argv[i] + 8;
set_cuefile:;
if(strlen(value_pt) >= sizeof(skin->cuefile)) {
fprintf(stderr,
"cdrskin: FATAL : cuefile=... too long. (max: %d, given: %d)\n",
(int) sizeof(skin->cuefile) - 1, (int) strlen(value_pt));
return(0);
}
strcpy(skin->cuefile, value_pt);
skin->do_burn= 1;
} else if(strcmp(argv[i],"-isosize")==0) { } else if(strcmp(argv[i],"-isosize")==0) {
skin->use_data_image_size= 1; skin->use_data_image_size= 1;
@ -7965,6 +8070,9 @@ set_stream_recording:;
skin->tell_media_space= 1; skin->tell_media_space= 1;
skin->preskin->demands_cdrskin_caps= 1; skin->preskin->demands_cdrskin_caps= 1;
} else if(strcmp(argv[i], "-text") == 0) {
skin->use_cdtext= 1;
} else if(strncmp(argv[i],"-textfile=", 10)==0) { } else if(strncmp(argv[i],"-textfile=", 10)==0) {
value_pt= argv[i] + 10; value_pt= argv[i] + 10;
goto set_textfile; goto set_textfile;

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2011.12.25.103852" #define Cdrskin_timestamP "2011.12.25.105032"