From 25489521bb14fc8ff29ec60c9fadecaf1829225c Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sun, 15 Nov 2009 16:49:04 +0000 Subject: [PATCH] New options dvd_obs= and stdio_fsync= --- cdrskin/cdrskin.1 | 36 ++++++++++++++-------- cdrskin/cdrskin.c | 60 +++++++++++++++++++++++++++++++++++++ cdrskin/cdrskin_timestamp.h | 2 +- 3 files changed, 85 insertions(+), 13 deletions(-) diff --git a/cdrskin/cdrskin.1 b/cdrskin/cdrskin.1 index 9fcfbde..ff1ea56 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 10, 2009" +.TH CDRSKIN 1 "Nov 15, 2009" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -899,6 +899,13 @@ Both, write_start_address and direct_write_amount size must be aligned to a media dependend transaction size. With DVD-RAM, BD-RE, DVD+RW this is 2k, with overwriteable DVD-RW it is 32k. .TP +.BI dvd_obs= default|32k|64k +Linux specific: +Set the number of bytes to be transmitted with each write operation to DVD +or BD media. A number of 64 KB may improve throughput with bus systems which +show latency problems. The default depends on media type and option +stream_recording= . +.TP .BI fallback_program= command Set a command name to be executed if cdrskin encounters a known cdrecord option which it does not yet support. If a non-empty command is given with @@ -1013,6 +1020,22 @@ which can only do DAO but not Incremental Streaming. .BI \--single_track Accept only the last argument of the command line as track source address. .TP +.BI stdio_sync= on|off|number +Set the number of bytes after which to force output to drives with prefix +"stdio:". This forcing keeps the memory from being clogged with lots of +pending data for slow devices. Default "on" is the same as "16m". +Forced output can be disabled by "off". +.TP +.BI stream_recording= on|off|number +By setting "on" request that compliance to the desired speed setting is +preferred over management of write errors. With DVD-RAM and BD this can +bring effective write speed near to the nominal write speed of the media. +But it will also disable the automatic use of replacement blocks +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 tao_to_sao_tsize= size Set an exact fixed size for the next track to be in effect only if the track source cannot deliver a size prediction and no tsize= was specified and an @@ -1199,17 +1222,6 @@ Linux specific: Use and report literal Bus,Target,Lun addresses rather than real SCSI and pseudo ATA addresses. This method is outdated and was never compatible with original cdrecord. -.TP -.BI stream_recording="on"|"off"|number -By setting "on" request that compliance to the desired speed setting is -preferred over management of write errors. With DVD-RAM and BD this can -bring effective write speed near to the nominal write speed of the media. -But it will also disable the automatic use of replacement blocks -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. diff --git a/cdrskin/cdrskin.c b/cdrskin/cdrskin.c index 8f9a5a2..e1accad 100644 --- a/cdrskin/cdrskin.c +++ b/cdrskin/cdrskin.c @@ -148,6 +148,10 @@ or Move them down to Cdrskin_libburn_from_pykix_svN on version leap */ +/* burn_write_opts_set_dvd_obs() and burn_write_opts_set_stdio_fsync() +*/ +#define Cdrskin_libburn_has_fsync_obS 1 + #endif /* Cdrskin_libburn_0_7_3 */ #ifndef Cdrskin_libburn_versioN @@ -2695,6 +2699,11 @@ set_dev:; printf( " --drive_scsi_exclusive try to exclusively reserve device files\n"); printf(" /dev/srN, /dev/scdM, /dev/stK of drive.\n"); +#ifdef Cdrskin_libburn_has_fsync_obS + printf(" dvd_obs=\"default\"|number\n"); + printf( + " set number of bytes per DVD/BD write: 32k or 64k\n"); +#endif #ifdef Cdrskin_burn_drive_eject_brokeN printf( " eject_device= set the device address for command eject\n"); @@ -2745,6 +2754,13 @@ set_dev:; printf( " byte addresses below that number.\n"); #endif +#ifdef Cdrskin_libburn_has_fsync_obS + printf(" stdio_sync=\"default\"|\"off\"|number\n"); + printf( + " set number of bytes after which to force output\n"); + printf( + " to drives with prefix \"stdio:\".\n"); +#endif #ifdef Cdrskin_allow_libburn_taO printf( @@ -3191,6 +3207,8 @@ struct CdrskiN { int dummy_mode; int force_is_set; int stream_recording_is_set; /* see burn_write_opts_set_stream_recording() */ + int dvd_obs; /* DVD write chunk size: 0, 32k or 64k */ + int stdio_sync; /* stdio fsync interval: -1, 0, >=32 */ int single_track; int prodvd_cli_compatible; @@ -3409,6 +3427,8 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag) o->dummy_mode= 0; o->force_is_set= 0; o->stream_recording_is_set= 0; + o->dvd_obs= 0; + o->stdio_sync= 0; o->single_track= 0; o->prodvd_cli_compatible= 0; o->do_devices= 0; @@ -6951,6 +6971,10 @@ burn_failed:; #ifdef Cdrskin_libburn_has_stream_recordinG burn_write_opts_set_stream_recording(o, skin->stream_recording_is_set); #endif +#ifdef Cdrskin_libburn_has_fsync_obS + burn_write_opts_set_dvd_obs(o, skin->dvd_obs); + burn_write_opts_set_stdio_fsync(o, skin->stdio_sync); +#endif if(skin->dummy_mode) { fprintf(stderr, @@ -7825,6 +7849,22 @@ set_driveropts:; } else if(strcmp(argv[i],"-dummy")==0) { skin->dummy_mode= 1; + } else if(strncmp(argv[i], "-dvd_obs=", 9)==0) { + value_pt= argv[i] + 9; + goto dvd_obs; + } else if(strncmp(argv[i], "dvd_obs=", 8)==0) { + value_pt= argv[i] + 8; +dvd_obs:; + if(strcmp(value_pt, "default") == 0) + num= 0; + else + num = Scanf_io_size(value_pt,0); + if(num != 0 && num != 32768 && num != 65536) { + fprintf(stderr, + "cdrskin: SORRY : Option dvd_obs= accepts only sizes 0, 32k, 64k\n"); + } else + skin->dvd_obs= num; + } else if(strcmp(argv[i],"-eject")==0) { skin->do_eject= 1; if(skin->verbosity>=Cdrskin_verbose_cmD) @@ -8215,6 +8255,26 @@ set_speed:; if(skin->verbosity>=Cdrskin_verbose_cmD) ClN(printf("cdrskin: speed : %f\n",skin->x_speed)); + } else if(strncmp(argv[i], "-stdio_sync=", 12)==0) { + value_pt= argv[i] + 12; + goto stdio_sync; + } else if(strncmp(argv[i], "stdio_sync=", 11)==0) { + value_pt= argv[i] + 11; +stdio_sync:; + if(strcmp(value_pt, "default") == 0 || strcmp(value_pt, "on") == 0) + num= 0; + else if(strcmp(value_pt, "off") == 0) + num= -1; + else + num = Scanf_io_size(value_pt,0); + if(num > 0) + num/= 2048; + if(num != -1 && num != 0 && (num < 32 || num > 512 * 1024)) { + fprintf(stderr, + "cdrskin: SORRY : Option stdio_sync= accepts only sizes -1, 0, 32k ... 1g\n"); + } else + skin->stdio_sync= num; + } else if(strncmp(argv[i],"-stream_recording=",18)==0) { value_pt= argv[i]+18; goto set_stream_recording; diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index ab8d348..f94eafb 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2009.11.15.153140" +#define Cdrskin_timestamP "2009.11.15.165016"