New options cdtext_to_textfile= and cdtext_to_v07t=

This commit is contained in:
Thomas Schmitt 2013-05-19 15:49:05 +00:00
parent ca3f994dcb
commit a252038113
3 changed files with 165 additions and 33 deletions

View File

@ -994,6 +994,23 @@ the default.
This setting applies only to CD SAO writing. It overrides the track number
settings caused by options cuefile= or input_sheet_v07t=.
.TP
.BI cdtext_to_textfile= path
Extract the CD-TEXT packs from the lead-in of an audio CD and write them to
the file with the given path. If CD-TEXT can be retrieved, then this file
will be suitable for option textfile=.
.br
Not all drives can read CD-TEXT and not all audio CDs bear CD-TEXT.
.TP
.BI cdtext_to_v07t= path
Extract the CD-TEXT packs from the lead-in of an audio CD and write them
as human readable Sony Input Sheet Version 0.7T to the file with the
given path. If CD-TEXT can be retrieved, then this file
will be suitable for option input_sheet_v07t=.
.br
If the given path is "-", then the result is printed to standard output.
.br
Not all drives can read CD-TEXT and not all audio CDs bear CD-TEXT.
.TP
.BI \--demand_a_drive
Exit with a nonzero value if no drive can be found during a bus scan.
.TP

View File

@ -2815,12 +2815,15 @@ set_dev:;
" --any_track allow source_addresses to match '^-.' or '='\n");
printf(
" assert_write_lba=<lba> abort if not next write address == lba\n");
fprintf(stderr,
printf(
" cd_start_tno=<number> set number of first track in CD SAO session\n");
fprintf(stderr,
printf(
" --cdtext_dummy show CD-TEXT pack array instead of writing CD\n");
fprintf(stderr,
" --cdtext_verbose show CD-TEXT pack array before writing CD\n");
printf(
" cdtext_to_textfile=<path> extract CD-TEXT from CD to disk file\n");
printf(
" cdtext_to_v07t=<path|\"-\"> report CD-TEXT from CD to file or stdout\n");
printf(" --cdtext_verbose show CD-TEXT pack array before writing CD\n");
printf(
" direct_write_amount=<size> write random access to media like DVD+RW\n");
printf(" --demand_a_drive exit !=0 on bus scans with empty result\n");
@ -3360,7 +3363,10 @@ struct CdrskiN {
int do_atip;
int do_list_speeds;
int do_list_formats;
int do_list_v07t;
int do_cdtext_to_textfile;
char cdtext_to_textfile_path[Cdrskin_strleN];
int do_cdtext_to_vt07;
char cdtext_to_vt07_path[Cdrskin_strleN];
#ifdef Libburn_develop_quality_scaN
int do_qcheck; /* 0= no , 1=nec_optiarc_rep_err_rate */
@ -3612,7 +3618,10 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
o->do_atip= 0;
o->do_list_speeds= 0;
o->do_list_formats= 0;
o->do_list_v07t= 0;
o->do_cdtext_to_textfile= 0;
o->cdtext_to_textfile_path[0]= 0;
o->do_cdtext_to_vt07= 0;
o->cdtext_to_vt07_path[0]= 0;
#ifdef Libburn_develop_quality_scaN
o->do_qcheck= 0;
@ -4903,21 +4912,23 @@ ex:;
}
/* @param flag bit4= no not overwrite existing target file
*/
int Cdrskin_store_text_packs(struct CdrskiN *skin, unsigned char *text_packs,
int num_packs, int flag)
int num_packs, char *path, int flag)
{
int data_length, ret;
struct stat stbuf;
FILE *fp;
unsigned char fake_head[4];
if(stat("cdtext.dat", &stbuf) != -1) {
fprintf(stderr, "cdrskin: SORRY : Will not overwrite file 'cdtext.dat'\n");
if(stat(path, &stbuf) != -1 && (flag & 16)) {
fprintf(stderr, "cdrskin: SORRY : Will not overwrite file '%s'\n", path);
return(0);
}
fp= fopen("cdtext.dat", "w");
fp= fopen(path, "w");
if(fp == NULL) {
fprintf(stderr, "cdrskin: SORRY : Cannot open file 'cdtext.dat' for storing extracted CD-TEXT\n");
fprintf(stderr, "cdrskin: SORRY : Cannot open file '%s' for storing extracted CD-TEXT\n", path);
fprintf(stderr, "cdrskin: %s (errno=%d)\n", strerror(errno), errno);
return(0);
}
@ -4929,7 +4940,7 @@ int Cdrskin_store_text_packs(struct CdrskiN *skin, unsigned char *text_packs,
if(ret != 1) {
write_failure:;
fprintf(stderr,
"cdrskin: SORRY : Cannot write all data to file 'cdtext.dat'\n");
"cdrskin: SORRY : Cannot write all data to file '%s'\n", path);
fprintf(stderr, "cdrskin: %s (errno=%d)\n", strerror(errno), errno);
fclose(fp);
return(0);
@ -4938,13 +4949,90 @@ write_failure:;
if(ret != 1)
goto write_failure;
fprintf(stderr,
"cdrskin: NOTE : Wrote header and %d CD-TEXT bytes to file 'cdtext.dat'\n",
data_length - 2);
"cdrskin: NOTE : Wrote header and %d CD-TEXT bytes to file '%s'\n",
data_length - 2, path);
fclose(fp);
return(1);
}
/* @param flag bit0-3= output format
1= Sony CD-TEXT Input Sheet Version 0.7T
15= Cdrskin_store_text_packs
bit4= do not overwrite existing the target file
*/
int Cdrskin_cdtext_to_file(struct CdrskiN *skin, char *path, int flag)
{
int ret, fmt, char_code= 0, to_write;
struct burn_drive *drive;
unsigned char *text_packs= NULL;
int num_packs= 0;
char *result= 0;
FILE *fp= NULL;
struct stat stbuf;
fmt= flag & 15;
drive= skin->drives[skin->driveno].drive;
ret= burn_disc_get_leadin_text(drive, &text_packs, &num_packs, 0);
if(ret <= 0 || num_packs <= 0) {
fprintf(stderr, "cdrskin: No CD-Text or CD-Text unaware drive.\n");
return(2);
}
if(fmt == 1) {
ret = burn_make_input_sheet_v07t(text_packs, num_packs, 0, 0, &result,
&char_code, 0);
if(ret <= 0)
goto ex;
to_write= ret;
if(stat(path, &stbuf) != -1 && (flag & 16)) {
fprintf(stderr, "cdrskin: SORRY : Will not overwrite file '%s'\n", path);
return(0);
}
if(strcmp(path, "-") == 0)
fp= stdout;
else
fp = fopen(path, "w");
if(fp == NULL) {
if(errno > 0)
fprintf(stderr, "cdrskin: %s (errno=%d)\n", strerror(errno), errno);
fprintf(stderr,
"cdrskin: SORRY : Cannot write CD-TEXT list to file '%s'\n",
path);
{ret= 0; goto ex;}
}
ret = fwrite(result, to_write, 1, fp);
if(ret != 1) {
if(errno > 0)
fprintf(stderr, "cdrskin: %s (errno=%d)\n", strerror(errno), errno);
fprintf(stderr,
"cdrskin: SORRY : Cannot write all CD-TEXT to file '%s'\n", path);
ret= 0;
}
if(ret <= 0)
goto ex;
} else if(fmt == 15) {
if(skin->verbosity >= Cdrskin_verbose_debuG)
Cdrskin_print_text_packs(skin, text_packs, num_packs, 0);
ret= Cdrskin_store_text_packs(skin, text_packs, num_packs, path, flag & 16);
free(text_packs);
if(ret <= 0)
goto ex;
printf("CD-Text len: %d\n", num_packs * 18 + 4);
} else {
fprintf(stderr, "cdrskin: FATAL : Program error : Unknow format %d with Cdrskin_cdtext_to_file.\n", fmt);
{ret= -1; goto ex;}
}
ret= 1;
ex:;
if(result != NULL)
free(result);
if(fp != NULL && fp != stdout)
fclose(fp);
return(1);
}
/** Perform -toc under control of Cdrskin_atip().
@param flag Bitfield for control purposes:
bit0= do not list sessions separately (do it cdrecord style)
@ -4963,8 +5051,6 @@ int Cdrskin_toc(struct CdrskiN *skin, int flag)
enum burn_disc_status s;
char profile_name[80];
int profile_number;
unsigned char *text_packs= NULL;
int num_packs= 0;
drive= skin->drives[skin->driveno].drive;
@ -5073,22 +5159,11 @@ int Cdrskin_toc(struct CdrskiN *skin, int flag)
}
if(skin->verbosity >= Cdrskin_verbose_cmD) {
ret= burn_disc_get_leadin_text(drive, &text_packs, &num_packs, 0);
if(ret > 0 && num_packs > 0) {
if(skin->verbosity >= Cdrskin_verbose_debuG)
Cdrskin_print_text_packs(skin, text_packs, num_packs, 0);
ret= Cdrskin_store_text_packs(skin, text_packs, num_packs, 0);
free(text_packs);
if(ret <= 0 && ret < final_ret)
final_ret= ret;
if(ret > 0)
printf("CD-Text len: %d\n", num_packs * 18 + 4);
} else {
fprintf(stderr, "cdrskin: No CD-Text or CD-Text unaware drive.\n");
}
ret= Cdrskin_cdtext_to_file(skin, "cdtext.dat", 15 | 16);
if(ret <= 0 && ret < final_ret)
final_ret= ret;
}
summary:
ret= burn_disc_get_profile(drive, &profile_number, profile_name);
if(ret <= 0)
@ -8000,10 +8075,10 @@ unsupported_blank_option:;
} else if(strcmp(argv[i],"--bragg_with_audio")==0) {
/* OBSOLETE 0.2.3 : was handled in Cdrpreskin_setup() */;
} else if(strncmp(argv[i], "-cd_start_tno", 14)==0) {
} else if(strncmp(argv[i], "-cd_start_tno=", 14) == 0) {
value_pt= argv[i] + 14;
goto set_cd_start_tno;
} else if(strncmp(argv[i], "cd_start_tno=", 13) ==0 ) {
} else if(strncmp(argv[i], "cd_start_tno=", 13) == 0) {
value_pt= argv[i] + 13;
set_cd_start_tno:;
cd_start_tno= -1;
@ -8018,6 +8093,36 @@ set_cd_start_tno:;
} else if(strcmp(argv[i],"--cdtext_dummy")==0) {
skin->cdtext_test= 2;
} else if(strncmp(argv[i], "-cdtext_to_textfile=", 20) == 0) {
value_pt= argv[i] + 20;
goto set_cdtext_to_textfile;
} else if(strncmp(argv[i], "cdtext_to_textfile=", 19) == 0) {
value_pt= argv[i] + 19;
set_cdtext_to_textfile:;
if(strlen(value_pt) >= sizeof(skin->cdtext_to_textfile_path)) {
fprintf(stderr,
"cdrskin: FATAL : cdtext_to_textfile=... too long. (max: %d, given: %d)\n",
(int) sizeof(skin->cdtext_to_textfile_path)-1,(int) strlen(value_pt));
return(0);
}
skin->do_cdtext_to_textfile= 1;
strcpy(skin->cdtext_to_textfile_path, value_pt);
} else if(strncmp(argv[i], "-cdtext_to_v07t=", 16) == 0) {
value_pt= argv[i] + 16;
goto set_cdtext_to_v07t;
} else if(strncmp(argv[i], "cdtext_to_v07t=", 15) == 0) {
value_pt= argv[i] + 15;
set_cdtext_to_v07t:;
if(strlen(value_pt) >= sizeof(skin->cdtext_to_vt07_path)) {
fprintf(stderr,
"cdrskin: FATAL : cdtext_to_vt07=... too long. (max: %d, given: %d)\n",
(int) sizeof(skin->cdtext_to_vt07_path)-1,(int) strlen(value_pt));
return(0);
}
skin->do_cdtext_to_vt07= 1;
strcpy(skin->cdtext_to_vt07_path, value_pt);
} else if(strcmp(argv[i],"--cdtext_verbose")==0) {
skin->cdtext_test= 1;
@ -9150,6 +9255,16 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
if(ret<=0)
{*exit_value= 7; goto ex;}
}
if(skin->do_cdtext_to_textfile) {
ret= Cdrskin_cdtext_to_file(skin, skin->cdtext_to_textfile_path, 15);
if(ret<=0)
{*exit_value= 18; goto ex;}
}
if(skin->do_cdtext_to_vt07) {
ret= Cdrskin_cdtext_to_file(skin, skin->cdtext_to_vt07_path, 1);
if(ret<=0)
{*exit_value= 19; goto ex;}
}
if(skin->do_list_speeds) {
if(skin->n_drives<=0)
{*exit_value= 17; goto no_drive;}

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2013.05.19.114643"
#define Cdrskin_timestamP "2013.05.19.154838"