From 7973546a4ca91e4a50317fb0c62ea7dc9a81a423 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Fri, 11 Sep 2009 12:08:59 +0000 Subject: [PATCH] Interpreting options -mode2, -xa, -xa1, -xa2 but producing CD-ROM Mode 1 tracks --- cdrskin/cdrskin.1 | 16 +++++++-- cdrskin/cdrskin.c | 68 ++++++++++++++++++++++++++++++++----- cdrskin/cdrskin_timestamp.h | 2 +- 3 files changed, 75 insertions(+), 11 deletions(-) diff --git a/cdrskin/cdrskin.1 b/cdrskin/cdrskin.1 index 45e972d..e819043 100644 --- a/cdrskin/cdrskin.1 +++ b/cdrskin/cdrskin.1 @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH CDRSKIN 1 "Sep 09, 2009" +.TH CDRSKIN 1 "Sep 10, 2009" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -497,7 +497,15 @@ or DVD-R[W] in Disc-at-once mode. .TP .BI \-data Subsequent tracks are data tracks. This option is default and only needed -to mark the end of the range of an eventual option -audio. +to mark the end of the range of an eventual option -audio or -xa1. +.br +Options -mode2, -xa, and -xa2 get mapped to -data, not using the desired CD +sector formats and thus not taking advantage of eventual higher payload. +.BI \-xa1 +Subsequent tracks are data tracks with input suitable for CD-ROM XA mode 2 +form 1. This differs from -data input by 8 additional header bytes per block. +cdrskin will not write CD-ROM XA but rather strip the header bytes and write as +-data tracks. .TP .BI dev= target Set the address of the drive to use. Valid are at least the @@ -1196,6 +1204,10 @@ if write errors occur. It might as well be disliked or ignored by the drive. .br If a number is given, then error management stays enabled for all byte addresses below that number. Any number below 16s is the same as "off". +.TP +.BI --xa1-ignore +Silently interpret option -xa1 as -data. This may be necessary if a frontent +does not prepare -xa1 block headers but insists in using option -xa1. .SH EXAMPLES .SS .B Get an overview of drives and their addresses: diff --git a/cdrskin/cdrskin.c b/cdrskin/cdrskin.c index 4e37412..bdc29b2 100644 --- a/cdrskin/cdrskin.c +++ b/cdrskin/cdrskin.c @@ -148,7 +148,7 @@ or Move them down to Cdrskin_libburn_from_pykix_svN on version leap */ #define Cdrskin_libburn_has_product_iD 1 - +#define Cdrskin_libburn_has_cdxa_conV 1 #endif /* Cdrskin_libburn_0_7_1 */ @@ -910,6 +910,9 @@ struct CdrtracK { double sector_size; int track_type_by_default; int swap_audio_bytes; + int cdxa_conversion; /* bit0-30: for burn_track_set_cdxa_conv() + bit31 : ignore bits 0 to 30 + */ /** Eventually detected data image size */ double data_image_size; @@ -963,7 +966,7 @@ int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss, int *use_data_image_size, double *padding, int *set_by_padsize, int *track_type, int *track_type_by_default, - int *swap_audio_bytes, int flag); + int *swap_audio_bytes, int *cdxa_conversion, int flag); int Cdrskin_get_fifo_par(struct CdrskiN *skin, int *fifo_enabled, int *fifo_size, int *fifo_start_at, int flag); @@ -985,6 +988,7 @@ int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss, o->sector_size= 2048.0; o->track_type_by_default= 1; o->swap_audio_bytes= 0; + o->cdxa_conversion= 0; o->data_image_size= -1.0; o->iso_fs_descr= NULL; o->use_data_image_size= 0; @@ -1001,7 +1005,7 @@ int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss, &(o->tao_to_sao_tsize),&(o->use_data_image_size), &(o->padding),&(o->set_by_padsize),&(skin_track_type), &(o->track_type_by_default),&(o->swap_audio_bytes), - 0); + &(o->cdxa_conversion), 0); if(ret<=0) goto failed; strcpy(o->original_source_path,o->source_path); @@ -1611,6 +1615,11 @@ int Cdrtrack_add_to_session(struct CdrtracK *track, int trackno, burn_track_set_default_size(tr, (off_t) track->tao_to_sao_tsize); burn_track_set_byte_swap(tr, (track->track_type==BURN_AUDIO && track->swap_audio_bytes)); +#ifdef Cdrskin_libburn_has_cdxa_conV + if(!(track->cdxa_conversion & (1 << 31))) + burn_track_set_cdxa_conv(tr, track->cdxa_conversion & 0x7fffffff); +#endif + fixed_size= track->fixed_size; if((flag&2) && track->padding>0) { if(flag&1) @@ -2739,6 +2748,8 @@ set_dev:; printf( " write_start_address= write to given byte address (DVD+RW)\n"); + printf( + " --xa1-ignore with -xa1 do not strip 8 byte headers\n"); printf( "Preconfigured arguments are read from the following startup files\n"); printf( @@ -2838,6 +2849,8 @@ see_cdrskin_eng_html:; fprintf(stderr,"\t-audio\t\tSubsequent tracks are CD-DA audio tracks\n"); fprintf(stderr, "\t-data\t\tSubsequent tracks are CD-ROM data mode 1 (default)\n"); + fprintf(stderr, + "\t-xa1\t\tSubsequent tracks are CD-ROM XA mode 2 form 1 - 2056 bytes\n"); fprintf(stderr, "\t-isosize\tUse iso9660 file system size for next data track\n"); fprintf(stderr,"\t-pad\t\tpadsize=30k\n"); @@ -2950,6 +2963,10 @@ set_severities:; } else if(strcmp(argv[i],"-waiti")==0) { o->do_waiti= 1; + } else if(strcmp(argv[i],"-xamix")==0) { + fprintf(stderr, + "cdrskin: FATAL : Option -xamix not implemented and data not yet convertible to other modes.\n"); + return(0); } } @@ -3228,6 +3245,9 @@ struct CdrskiN { enum burn_write_types write_type; int block_type; int multi; + int cdxa_conversion; /* bit0-30: for burn_track_set_cdxa_conv() + bit31 : ignore bits 0 to 30 + */ int modesty_on_drive; int min_buffer_percent; int max_buffer_percent; @@ -3509,7 +3529,7 @@ int Cdrskin_get_source(struct CdrskiN *skin, char *source_path, int *use_data_image_size, double *padding, int *set_by_padsize, int *track_type, int *track_type_by_default, - int *swap_audio_bytes, int flag) + int *swap_audio_bytes, int *cdxa_conversion, int flag) { strcpy(source_path,skin->source_path); *fixed_size= skin->fixed_size; @@ -3520,6 +3540,7 @@ int Cdrskin_get_source(struct CdrskiN *skin, char *source_path, *track_type= skin->track_type; *track_type_by_default= skin->track_type_by_default; *swap_audio_bytes= skin->swap_audio_bytes; + *cdxa_conversion= skin->cdxa_conversion; return(1); } @@ -5397,6 +5418,14 @@ int Cdrskin_warn_of_mini_tsize(struct CdrskiN *skin, int flag) enum burn_disc_status s; struct burn_drive *drive; +#ifdef Cdrskin_libburn_has_get_drive_rolE + int ret; + + ret= burn_drive_get_drive_role(skin->drives[skin->driveno].drive); + if(ret != 1) + return(1); +#endif /* Cdrskin_libburn_has_get_drive_rolE */ + #ifdef Cdrskin_libburn_has_get_spacE if(skin->multi || skin->has_open_ended_track || skin->smallest_tsize<0) return(1); @@ -7412,7 +7441,7 @@ int Cdrskin_setup(struct CdrskiN *skin, int argc, char **argv, int flag) "-reset", "-abort", "-overburn", "-ignsize", "-useinfo", "-fix", "-nofix", "-raw", "-raw96p", "-raw16", "-raw96r", - "-clone", "-text", "-mode2", "-xa", "-xa1", "-xa2", "-xamix", + "-clone", "-text", "-cdi", "-preemp", "-nopreemp", "-copy", "-nocopy", "-scms", "-shorttrack", "-noshorttrack", "-packet", "-noclose", "" @@ -7651,9 +7680,9 @@ unsupported_blank_option:; skin->do_checkdrive= 1; } else if(strcmp(argv[i],"-data")==0) { - - /* >>> !!! All Subsequent Tracks Option */ - +option_data:; + /* All Subsequent Tracks Option */ + skin->cdxa_conversion= (skin->cdxa_conversion & ~0x7fffffff) | 0; skin->track_type= BURN_MODE1; skin->track_type_by_default= 0; @@ -7958,6 +7987,11 @@ minbuf_equals:; strcmp(argv[i],"-media-info") == 0) { skin->do_atip= 4; + } else if(strcmp(argv[i], "-mode2") == 0) { + fprintf(stderr, + "cdrskin: NOTE : defaulting option -mode2 to option -data\n"); + goto option_data; + } else if(strncmp(argv[i],"modesty_on_drive=",17)==0) { #ifdef Cdrskin_libburn_has_set_waitinG value_pt= argv[i]+17; @@ -8233,6 +8267,24 @@ track_too_large:; skin->write_start_address)); skin->preskin->demands_cdrskin_caps= 1; + } else if(strcmp(argv[i], "-xa") == 0) { + fprintf(stderr,"cdrskin: NOTE : defaulting option -xa to option -data\n"); + goto option_data; + + } else if(strcmp(argv[i], "-xa1") == 0) { + /* All Subsequent Tracks Option */ + skin->cdxa_conversion= (skin->cdxa_conversion & ~0x7fffffff) | 1; + skin->track_type= BURN_MODE1; + skin->track_type_by_default= 0; + + } else if(strcmp(argv[i], "-xa2") == 0) { + fprintf(stderr, + "cdrskin: NOTE : defaulting option -xa2 to option -data\n"); + goto option_data; + + } else if(strcmp(argv[i], "--xa1-ignore") == 0) { + skin->cdxa_conversion|= (1 << 31); + } else if( i==argc-1 || (skin->single_track==0 && strchr(argv[i],'=')==NULL && !(argv[i][0]=='-' && argv[i][1]!=0) ) || diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 4024be6..dfa62d4 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2009.09.11.112528" +#define Cdrskin_timestamP "2009.09.11.120959"