From d7c34f05e49631aa09b6e2d9ed3f833950ee0b26 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Mon, 6 Nov 2006 11:42:21 +0000 Subject: [PATCH] New API burn_write_opts_set_multi(). (But libburn cannot burn next session yet) --- cdrskin/cdrskin.c | 29 +++++++++++++++++++++++++---- cdrskin/cdrskin_timestamp.h | 2 +- libburn/libburn.h | 9 +++++++++ libburn/options.c | 9 +++++++++ libburn/spc.c | 5 ++++- 5 files changed, 48 insertions(+), 6 deletions(-) diff --git a/cdrskin/cdrskin.c b/cdrskin/cdrskin.c index bb52a4f..6c691c5 100644 --- a/cdrskin/cdrskin.c +++ b/cdrskin/cdrskin.c @@ -194,6 +194,7 @@ or /* put macros under test caveat here */ #define Cdrskin_allow_libburn_taO 1 +#define Cdrskin_libburn_has_multI 1 #endif @@ -2275,6 +2276,7 @@ struct CdrskiN { /** The write mode (like SAO or RAW96/R). See libburn. */ enum burn_write_types write_type; int block_type; + int multi; int do_eject; char eject_device[Cdrskin_strleN]; @@ -2388,6 +2390,7 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag) strcpy(o->write_mode_name,"SAO"); o->write_type= BURN_WRITE_SAO; o->block_type= BURN_BLOCK_SAO; + o->multi= 0; o->burnfree= 0; o->do_eject= 0; o->eject_device[0]= 0; @@ -3327,7 +3330,11 @@ int Cdrskin_checkdrive(struct CdrskiN *skin, int flag) printf("Identifikation : '%s'\n",drive_info->product); printf("Revision : '%s'\n",drive_info->revision); printf("Driver flags : %s\n","BURNFREE"); +#ifdef Cdrskin_allow_libburn_taO + printf("Supported modes: %s\n","TAO SAO RAW/R96R"); +#else printf("Supported modes: %s\n","SAO RAW/R96R"); +#endif ret= 1; ex:; return(ret); @@ -4093,6 +4100,13 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag) o= burn_write_opts_new(drive); burn_write_opts_set_perform_opc(o, 0); +#ifdef Cdrskin_libburn_has_multI + if(skin->multi) + fprintf(stderr, + "cdrskin: NOTE : Option -multi set. Media will be appendable.\n"); + burn_write_opts_set_multi(o,skin->multi); +#endif + burn_write_opts_set_write_type(o,skin->write_type,skin->block_type); if(skin->dummy_mode) { fprintf(stderr, @@ -4399,7 +4413,7 @@ int Cdrskin_setup(struct CdrskiN *skin, int argc, char **argv, int flag) static char ignored_full_options[][41]= { "-d", "-Verbose", "-V", "-silent", "-s", "-setdropts", "-prcap", "-inq", "-reset", "-abort", "-overburn", "-ignsize", "-useinfo", "-format", "-load", - "-lock", "-msinfo", "-multi", "-fix", "-nofix", "-waiti", + "-lock", "-msinfo", "-fix", "-nofix", "-waiti", "-immed", "-force", "-raw", "-raw96p", "-raw16", "-clone", "-text", "-mode2", "-xa", "-xa1", "-xa2", "-xamix", "-cdi", "-isosize", "-preemp", "-nopreemp", "-copy", "-nocopy", @@ -4707,6 +4721,13 @@ gracetime_equals:; } else if(strcmp(argv[i],"--ignore_signals")==0) { /* is handled in Cdrpreskin_setup() */; + } else if(strcmp(argv[i],"-multi")==0) { +#ifdef Cdrskin_libburn_has_multI + skin->multi= 1; +#else + fprintf(stderr,"cdrskin: SORRY : Option -multi is not available yet.\n"); +#endif + } else if(strcmp(argv[i],"--no_abort_handler")==0) { /* is handled in Cdrpreskin_setup() */; @@ -4716,9 +4737,6 @@ gracetime_equals:; } else if(strcmp(argv[i],"--no_convert_fs_adr")==0) { /* is handled in Cdrpreskin_setup() */; - } else if(strcmp(argv[i],"--old_pseudo_scsi_adr")==0) { - /* is handled in Cdrpreskin_setup() */; - } else if(strcmp(argv[i],"--no_rc")==0) { /* is handled in Cdrpreskin_setup() */; @@ -4727,6 +4745,9 @@ gracetime_equals:; if(skin->verbosity>=Cdrskin_verbose_cmD) printf("cdrskin: padding : off\n"); + } else if(strcmp(argv[i],"--old_pseudo_scsi_adr")==0) { + /* is handled in Cdrpreskin_setup() */; + } else if(strcmp(argv[i],"-pad")==0) { skin->padding= 15*2048; skin->set_by_padsize= 0; diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index b4dd19b..3622c19 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2006.11.06.073810" +#define Cdrskin_timestamP "2006.11.06.114159" diff --git a/libburn/libburn.h b/libburn/libburn.h index e90dfd5..e882904 100644 --- a/libburn/libburn.h +++ b/libburn/libburn.h @@ -1004,6 +1004,15 @@ void burn_write_opts_set_has_mediacatalog(struct burn_write_opts *opts, int has_ void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts, unsigned char mediacatalog[13]); + +/* ts A61106 */ +/* Sets the multi flag which eventually marks the emerging session as not being + the last one and thus creating a BURN_DISC_APPENDABLE media. + @param multi 1=media will be appendable, 0=media will be closed (default) +*/ +void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi); + + /** Sets whether to read in raw mode or not @param opts The read opts to change @param raw_mode If non-zero, reading will be done in raw mode, so that everything in the data tracks on the diff --git a/libburn/options.c b/libburn/options.c index e7036f6..c4c01b3 100644 --- a/libburn/options.c +++ b/libburn/options.c @@ -152,6 +152,14 @@ void burn_write_opts_set_mediacatalog(struct burn_write_opts *opts, memcpy(opts->mediacatalog, &mediacatalog, 13); } +/* ts A61106 */ +void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi) +{ + opts->multi = !!multi; +} + + + void burn_read_opts_set_raw(struct burn_read_opts *opts, int raw) { opts->raw = raw; @@ -198,3 +206,4 @@ void burn_read_opts_set_hardware_error_retries(struct burn_read_opts *opts, { opts->hardware_error_retries = hardware_error_retries; } + diff --git a/libburn/spc.c b/libburn/spc.c index e5ccbc7..c45f530 100644 --- a/libburn/spc.c +++ b/libburn/spc.c @@ -319,7 +319,10 @@ void spc_select_write_params(struct burn_drive *d, c.page->data[10] = (bufe << 6) + (sim << 4) + o->write_type; - c.page->data[11] = (o->multi << 6) | o->control; + + /* ts A61106 : MMC-1 table 110 : multi==0 or multi==3 */ + c.page->data[11] = ((3 * !!o->multi) << 6) | o->control; + c.page->data[12] = spc_block_type(o->block_type); /* ts A61104 */