diff --git a/Makefile.am b/Makefile.am index b978eb0..22b98d8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,6 +12,9 @@ lib_LTLIBRARIES = libburn/libburn.la # Build libraries libburn_libburn_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) +# This causes undesired .o names +# configure.ac appends -D options to variable CFLAG +### libburn_libburn_la_CFLAGS = $(LIBBURN_DVD_OBS_64K) libburn_libburn_la_LIBADD = $(LIBBURN_ARCH_LIBS) $(THREAD_LIBS) libburn_libburn_la_SOURCES = \ libburn/async.c \ @@ -25,6 +28,8 @@ libburn_libburn_la_SOURCES = \ libburn/debug.h \ libburn/drive.c \ libburn/drive.h \ + libburn/ecma130ab.c \ + libburn/ecma130ab.h \ libburn/error.h \ libburn/file.c \ libburn/file.h \ @@ -65,9 +70,6 @@ libburn_libburn_la_SOURCES = \ libburn/write.h \ version.h -## libburn/lec.c \ -## libburn/lec.h \ - ## libburn/sg-@ARCH@.c \ libinclude_HEADERS = \ @@ -108,9 +110,9 @@ test_structest_CPPFLAGS = -Ilibburn test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS) test_structest_SOURCES = test/structest.c -## cdrskin construction site - ts A60816 - A91012 +## cdrskin construction site - ts A60816 - A91206 cdrskin_cdrskin_CPPFLAGS = -Ilibburn -cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_7_2 +cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_7_4 # cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS) # ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking diff --git a/README b/README index 9c4e7b2..35ac5c3 100644 --- a/README +++ b/README @@ -11,7 +11,7 @@ Still containing parts of Libburn. By Derek Foreman and Ben Jansens Copyright (C) 2002-2006 Derek Foreman and Ben Jansens - http://files.libburnia-project.org/releases/libburn-0.7.2.pl00.tar.gz + http://files.libburnia-project.org/releases/libburn-0.7.4.pl00.tar.gz ------------------------------------------------------------------------------ @@ -19,10 +19,10 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens From tarball -Obtain libburn-0.7.2.pl00.tar.gz, take it to a directory of your choice and do: +Obtain libburn-0.7.4.pl00.tar.gz, take it to a directory of your choice and do: - tar xzf libburn-0.7.2.pl00.tar.gz - cd libburn-0.7.2 + tar xzf libburn-0.7.4.pl00.tar.gz + cd libburn-0.7.4 ./configure --prefix=/usr make @@ -57,6 +57,26 @@ Do in a directory of your choice: Warning: The trunk might contain experimental features which might not persist until next release. + + Special ./configure options + +In some situations Linux may deliver a better write performance to drives if +the track input is read with O_DIRECT (see man 2 open). The API call +burn_os_open_track_src() and the input readers of cdrskin and libburn fifo +can be told to use this peculiar read mode by: + --enable-track-src-odirect + +But often libburn call burn_write_opts_set_dvd_obs(opts, 64*1024) will yield +even better performance in such a situation. 64k can be made default at +configure time by: + --enable-dvd-obs-64k +This may be combined with above --enable-track-src-odirect . + +Make sure to re-compile all source files after running ./configure + make clean ; make + make install + + ------------------------------------------------------------------------------ An important part of the project, libisofs, is hosted in a bzr repository at @@ -137,7 +157,8 @@ The project components (list subject to growth, hopefully): Rock Ridge extensions. Manipulation is not only adding or overwriting of files but also deleting, renaming, attribute changing, incremental backups, activating boot images, and - extracting of files from ISO images to disk. + extracting of files from ISO images to disk. An own ISO 9660 + extension stores ACLs, xattr, and MD5 of file content. See xorriso/README for more. - "test" is a collection of application gestures and examples given by the @@ -443,6 +464,17 @@ Project history as far as known to me: It can retrieve media product info and can process track input which was prepared for CD-ROM XA Mode 2 Form 1. cdrskin now performs option -minfo. +- 28 Oct 2009 libisoburn-0.4.4 fixes a bug with cdrecord emulation and + introduces new information options about media type and ISO image id strings. + On Linux it helps with mounting two sessions of the same media + simultaneously. + +- 12 Nov 2009 libburn-0.7.2.pl01 works around problems with Pioneer DVR-216D. + DVD-R runs made the drive stuck. Ejecting the tray did not work properly. + +- 06 Dec 2009 libburn-0.7.4 works around problems with newer DVD burners, + provides throughput enhancements with hampered busses on Linux, and new + API calls to log SCSI commands and to control the libburn fifo. ------------------------------------------------------------------------------ diff --git a/cdrskin/README b/cdrskin/README index c43cf70..8af627d 100644 --- a/cdrskin/README +++ b/cdrskin/README @@ -4,7 +4,7 @@ cdrskin. By Thomas Schmitt Integrated sub project of libburnia-project.org but also published via: http://scdbackup.sourceforge.net/cdrskin_eng.html -http://scdbackup.sourceforge.net/cdrskin-0.7.2.pl00.tar.gz +http://scdbackup.sourceforge.net/cdrskin-0.7.4.pl00.tar.gz Copyright (C) 2006-2009 Thomas Schmitt, provided under GPL version 2. ------------------------------------------------------------------------------ @@ -24,10 +24,10 @@ By using this software you agree to the disclaimer at the end of this text Compilation, First Glimpse, Installation -Obtain cdrskin-0.7.2.pl00.tar.gz, take it to a directory of your choice and do: +Obtain cdrskin-0.7.4.pl00.tar.gz, take it to a directory of your choice and do: - tar xzf cdrskin-0.7.2.pl00.tar.gz - cd cdrskin-0.7.2 + tar xzf cdrskin-0.7.4.pl00.tar.gz + cd cdrskin-0.7.4 Within that directory execute: @@ -35,8 +35,7 @@ Within that directory execute: make This will already produce a cdrskin binary. But it will be necessary to -install libburn in order to use this binary. Installation of libburn is -beyond the scope of cdrskin. For this, see included libburn docs. +install libburn in order to use this binary. In order to surely get a standalone binary, execute @@ -73,7 +72,7 @@ It is not necessary for the standalone cdrskin binary to have libburn installed, since it incorporates the necessary libburn parts at compile time. It will not collide with an installed version of libburn either. But libpthread must be installed on the system and glibc has to match. (See -below for a way to create a statically linked binary.) +below for a way to create a totally static linked binary.) To install the man page, you may do: echo $MANPATH and choose one of the listed directories to copy the man-page under its ./man1 directory. Like: @@ -398,6 +397,21 @@ drive. See man page section FILES for a way to lift that ban. Special compilation variations +All following options of ./configure and cdrskin/compile_cdrskin.sh are +combinable. + +In some situations Linux may deliver a better write performance to drives if +the track input is read with O_DIRECT (see man 2 open). The API call +burn_os_open_track_src() and the input readers of cdrskin and libburn fifo +can be told to use this peculiar read mode by: + --enable-track-src-odirect + +But often cdrskin option dvd_obs=64k will yield even better performance in +such a situation. 64k can be made default at compile time by + cdrskin/compile_cdrskin.sh -dvd_obs_64k +It can also be enabled at configure time by + ./configure ... --enable-dvd-obs-64k ... + You may get a (super fat) statically linked binary by : cdrskin/compile_cdrskin.sh -static if your system supports static linking, at all. This will not help with kernels diff --git a/cdrskin/add_ts_changes_to_libburn_0_7_2 b/cdrskin/add_ts_changes_to_libburn_0_7_4 similarity index 99% rename from cdrskin/add_ts_changes_to_libburn_0_7_2 rename to cdrskin/add_ts_changes_to_libburn_0_7_4 index 9d22222..d78dbd5 100755 --- a/cdrskin/add_ts_changes_to_libburn_0_7_2 +++ b/cdrskin/add_ts_changes_to_libburn_0_7_4 @@ -38,7 +38,7 @@ original="./libburn_svn_release.tgz" # My changes are in $changes , mainly in $changes/cdrskin changes="./libburn-release" -skin_release="0.7.2" +skin_release="0.7.4" patch_level=".pl00" skin_rev="$skin_release""$patch_level" diff --git a/cdrskin/add_ts_changes_to_libburn_0_7_3 b/cdrskin/add_ts_changes_to_libburn_0_7_5 similarity index 99% rename from cdrskin/add_ts_changes_to_libburn_0_7_3 rename to cdrskin/add_ts_changes_to_libburn_0_7_5 index a2c69d3..8401602 100755 --- a/cdrskin/add_ts_changes_to_libburn_0_7_3 +++ b/cdrskin/add_ts_changes_to_libburn_0_7_5 @@ -38,7 +38,7 @@ original="./libburn_svn.tgz" # My changes are in $changes , mainly in $changes/cdrskin changes="./libburn-develop" -skin_release="0.7.3" +skin_release="0.7.5" patch_level="" skin_rev="$skin_release""$patch_level" diff --git a/cdrskin/cdrfifo.c b/cdrskin/cdrfifo.c index e61c533..4121d2a 100644 --- a/cdrskin/cdrfifo.c +++ b/cdrskin/cdrfifo.c @@ -25,6 +25,11 @@ #include #include +#ifndef Cdrfifo_standalonE +/* <<< until release of 0.7.4 : for Libburn_has_open_trac_srC */ +#include "../libburn/libburn.h" +#endif + #include "cdrfifo.h" @@ -120,7 +125,7 @@ struct CdrfifO { struct burn_source object. @param chunk_size Size of buffer block for a single transaction (0=default) @param buffer_size Size of fifo buffer - @param flag Unused yet + @param flag bit0= Debugging verbosity @return 1 on success, <=0 on failure */ int Cdrfifo_new(struct CdrfifO **ff, int source_fd, int dest_fd, @@ -174,7 +179,13 @@ int Cdrfifo_new(struct CdrfifO **ff, int source_fd, int dest_fd, o->follow_up_fd_idx= -1; o->next= o->prev= NULL; o->chain_idx= 0; + +#ifdef Libburn_has_open_trac_srC + o->buffer= burn_os_alloc_buffer((size_t) buffer_size, 0); +#else o->buffer= TSOB_FELD(char,buffer_size); +#endif /* ! Libburn_has_open_trac_srC */ + if(o->buffer==NULL) goto failed; return(1); @@ -226,8 +237,14 @@ int Cdrfifo_destroy(struct CdrfifO **ff, int flag) if(o->iso_fs_descr!=NULL) free((char *) o->iso_fs_descr); + if(o->buffer!=NULL) +#ifdef Libburn_has_open_trac_srC + burn_os_free_buffer(o->buffer, o->buffer_size, 0); +#else free((char *) o->buffer); +#endif /* Libburn_has_open_trac_srC */ + free((char *) o); (*ff)= NULL; return(1); @@ -616,7 +633,7 @@ return: <0 = error , 0 = idle , 1 = did some work */ { double buffer_space; - int can_read,can_write,ret,did_work= 0,idx,sod,eop_is_near,eop_idx; + int can_read,can_write= 0,ret,did_work= 0,idx,sod,eop_is_near,eop_idx; buffer_space= Cdrfifo_tell_buffer_space(o,0); if(o->dest_fd>=0) if(FD_ISSET((o->dest_fd),wts)) { @@ -659,6 +676,46 @@ return: <0 = error , 0 = idle , 1 = did some work after_write:; if(o->source_fd>=0) if(FD_ISSET((o->source_fd),rds)) { can_read= o->buffer_size - o->write_idx; + +#ifdef Libburn_has_open_trac_srC + + /* ts A91115 + This chunksize must be aligned to filesystem blocksize. + */ +#define Cdrfifo_o_direct_chunK 32768 + + if(o->write_idx < o->read_idx && o->write_idx + can_read > o->read_idx) + can_read= o->read_idx - o->write_idx; + if(o->fd_in_limit>=0.0) + if(can_read > o->fd_in_limit - o->fd_in_counter) + can_read= o->fd_in_limit - o->fd_in_counter; + /* Make sure to read with properly aligned size */ + if(can_read > Cdrfifo_o_direct_chunK) + can_read= Cdrfifo_o_direct_chunK; + else if(can_read < Cdrfifo_o_direct_chunK) + can_read= -1; + ret= 0; + if(can_read>0) + ret= read(o->source_fd,o->buffer+o->write_idx,can_read); + if(can_read < 0) { + /* waiting for a full Cdrfifo_o_direct_chunK to fit */ + if(can_write <= 0 && o->dest_fd >= 0) { + fd_set rds,wts,exs; + struct timeval wt; + + FD_ZERO(&rds); + FD_ZERO(&wts); + FD_ZERO(&exs); + FD_SET((o->dest_fd),&wts); + wt.tv_sec= 0; + wt.tv_usec= 10000; + select(o->dest_fd + 1,&rds, &wts, &exs, &wt); + + } + } else + +#else /* Libburn_has_open_trac_srC */ + if(can_read>o->chunk_size) can_read= o->chunk_size; if(o->write_idxread_idx && o->write_idx+can_read > o->read_idx) @@ -669,6 +726,9 @@ after_write:; ret= 0; if(can_read>0) ret= read(o->source_fd,o->buffer+o->write_idx,can_read); + +#endif /* ! Libburn_has_open_trac_srC */ + if(ret==-1) { /* >>> handle input error */; diff --git a/cdrskin/cdrfifo.h b/cdrskin/cdrfifo.h index 1237d20..94a291a 100644 --- a/cdrskin/cdrfifo.h +++ b/cdrskin/cdrfifo.h @@ -33,7 +33,7 @@ struct CdrfifO; struct burn_source object. @param chunk_size Size of buffer block for a single transaction (0=default) @param buffer_size Size of fifo buffer - @param flag unused yet + @param flag bit0= Debugging verbosity @return 1 on success, <=0 on failure */ int Cdrfifo_new(struct CdrfifO **ff, int source_fd, int dest_fd, diff --git a/cdrskin/cdrskin.1 b/cdrskin/cdrskin.1 index e819043..1e9752b 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 16, 2009" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -796,6 +796,11 @@ Level 2 additionally reports about option settings derived from arguments or startup files. Level 3 is for debugging and useful mainly in conjunction with somebody who had a look into the program sourcecode. .TP +.BI \-V +Enable logging of SCSI commands to stderr. This allows expert examination +of the interaction between libburn and the drive. The commands are specified +in SCSI-3 standards SPC, SBC, MMC. +.TP .BI \-waiti Wait until input data is available at stdin or EOF occurs at stdin. Only then begin to access any drives. @@ -894,6 +899,14 @@ 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. Tracks get padded up to the next multiple of this write +size. A number of 64 KB may improve throughput with bus systems which +show latency problems. The default depends on media type, option +stream_recording=, and on compile time options. +.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 @@ -1008,6 +1021,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 @@ -1194,17 +1223,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 6efd9d0..cf1e907 100644 --- a/cdrskin/cdrskin.c +++ b/cdrskin/cdrskin.c @@ -88,7 +88,7 @@ or /** The official program version */ #ifndef Cdrskin_prog_versioN -#define Cdrskin_prog_versioN "0.7.2" +#define Cdrskin_prog_versioN "0.7.4" #endif /** The official libburn interface revision to use. @@ -101,7 +101,7 @@ or #define Cdrskin_libburn_minoR 7 #endif #ifndef Cdrskin_libburn_micrO -#define Cdrskin_libburn_micrO 2 +#define Cdrskin_libburn_micrO 4 #endif @@ -135,42 +135,43 @@ or #endif /* Cdrskin_libburn_cvs_A60220_tS */ -#ifdef Cdrskin_libburn_0_7_2 -#define Cdrskin_libburn_versioN "0.7.2" +#ifdef Cdrskin_libburn_0_7_4 +#define Cdrskin_libburn_versioN "0.7.4" #define Cdrskin_libburn_from_pykix_svN 1 -#endif /* Cdrskin_libburn_0_7_2 */ +#endif /* Cdrskin_libburn_0_7_4 */ -#ifdef Cdrskin_libburn_0_7_3 -#define Cdrskin_libburn_versioN "0.7.3" +#ifdef Cdrskin_libburn_0_7_5 +#define Cdrskin_libburn_versioN "0.7.5" #define Cdrskin_libburn_from_pykix_svN 1 /* Place novelty switch macros here. Move them down to Cdrskin_libburn_from_pykix_svN on version leap */ -#endif /* Cdrskin_libburn_0_7_3 */ + +#endif /* Cdrskin_libburn_0_7_5 */ #ifndef Cdrskin_libburn_versioN -#define Cdrskin_libburn_0_7_2 -#define Cdrskin_libburn_versioN "0.7.2" +#define Cdrskin_libburn_0_7_4 +#define Cdrskin_libburn_versioN "0.7.4" #define Cdrskin_libburn_from_pykix_svN 1 #endif -#ifdef Cdrskin_libburn_0_7_2 +#ifdef Cdrskin_libburn_0_7_4 #undef Cdrskin_libburn_majoR #undef Cdrskin_libburn_minoR #undef Cdrskin_libburn_micrO #define Cdrskin_libburn_majoR 0 #define Cdrskin_libburn_minoR 7 -#define Cdrskin_libburn_micrO 2 +#define Cdrskin_libburn_micrO 4 #endif -#ifdef Cdrskin_libburn_0_7_3 +#ifdef Cdrskin_libburn_0_7_5 #undef Cdrskin_libburn_majoR #undef Cdrskin_libburn_minoR #undef Cdrskin_libburn_micrO #define Cdrskin_libburn_majoR 0 #define Cdrskin_libburn_minoR 7 -#define Cdrskin_libburn_micrO 3 +#define Cdrskin_libburn_micrO 5 #endif @@ -322,10 +323,15 @@ or /** A macro which is able to eat up a function call like printf() */ #ifdef Cdrskin_extra_leaN #define ClN(x) +#define Cdrskin_no_cdrfifO 1 #else #define ClN(x) x +#ifdef Cdrskin_use_libburn_fifO +/* + # define Cdrskin_no_cdrfifO 1 +*/ +#endif #endif - /** Verbosity level for pacifying progress messages */ #define Cdrskin_verbose_progresS 1 @@ -865,12 +871,12 @@ backward:; /* --------------------------------------------------------------------- */ -#ifndef Cdrskin_extra_leaN +#ifndef Cdrskin_no_cdrfifO /* Program is to be linked with cdrfifo.c */ #include "cdrfifo.h" -#else /* ! Cdrskin_extra_leaN */ +#else /* ! Cdrskin_no_cdrfifO */ /* Dummy */ @@ -878,7 +884,7 @@ struct CdrfifO { int dummy; }; -#endif /* Cdrskin_extra_leaN */ +#endif /* Cdrskin_no_cdrfifO */ /* --------------------------------------------------------------------- */ @@ -941,6 +947,10 @@ struct CdrtracK { struct burn_track *libburn_track; +#ifdef Cdrskin_use_libburn_fifO + struct burn_source *libburn_fifo; +#endif /* Cdrskin_use_libburn_fifO */ + }; int Cdrtrack_destroy(struct CdrtracK **o, int flag); @@ -998,6 +1008,9 @@ int Cdrtrack_new(struct CdrtracK **track, struct CdrskiN *boss, o->ff_fifo= NULL; o->ff_idx= -1; o->libburn_track= NULL; +#ifdef Cdrskin_use_libburn_fifO + o->libburn_fifo= NULL; +#endif /* Cdrskin_use_libburn_fifO */ ret= Cdrskin_get_source(boss,o->source_path,&(o->fixed_size), &(o->tao_to_sao_tsize),&(o->use_data_image_size), @@ -1034,7 +1047,7 @@ int Cdrtrack_destroy(struct CdrtracK **o, int flag) if(track==NULL) return(0); -#ifndef Cdrskin_extra_leaN +#ifndef Cdrskin_no_cdrfifO Cdrfifo_destroy(&(track->fifo),0); #endif @@ -1120,6 +1133,61 @@ int Cdrtrack_get_source_path(struct CdrtracK *track, } +#ifdef Cdrskin_use_libburn_fifO + +int Cdrtrack_get_libburn_fifo(struct CdrtracK *track, + struct burn_source **fifo, int flag) +{ + *fifo= track->libburn_fifo; + return(1); +} + + +int Cdrtrack_report_fifo(struct CdrtracK *track, int flag) +{ + int size, free_bytes, ret; + int total_min_fill, interval_min_fill, put_counter, get_counter; + int empty_counter, full_counter; + double fifo_percent; + char *status_text; + + if(track->libburn_fifo == NULL) + return(0); + + /* Check for open input or leftover bytes in liburn fifo */ + ret = burn_fifo_inquire_status(track->libburn_fifo, &size, &free_bytes, + &status_text); + if(ret >= 0 && size - free_bytes > 1) { + /* not clear why free_bytes is reduced by 1 */ + fprintf(stderr, + "cdrskin: FATAL : Fifo still contains data after burning has ended.\n"); + fprintf(stderr, + "cdrskin: FATAL : %d bytes left.\n", size - free_bytes - 1); + fprintf(stderr, + "cdrskin: FATAL : This indicates an overflow of the last track.\n"); + fprintf(stderr, + "cdrskin: NOTE : The media might appear ok but is probably truncated.\n"); + return(-1); + } + + burn_fifo_get_statistics(track->libburn_fifo, &total_min_fill, + &interval_min_fill, &put_counter, &get_counter, + &empty_counter, &full_counter); + fifo_percent= 100.0*((double) total_min_fill)/(double) size; + if(fifo_percent==0 && total_min_fill>0) + fifo_percent= 1; + fflush(stdout); + fprintf(stderr,"Cdrskin: fifo had %d puts and %d gets.\n", + put_counter,get_counter); + fprintf(stderr, + "Cdrskin: fifo was %d times empty and %d times full, min fill was %.f%%.\n", + empty_counter, full_counter, fifo_percent); + return(1); +} + +#endif /* Cdrskin_use_libburn_fifO */ + + int Cdrtrack_get_fifo(struct CdrtracK *track, struct CdrfifO **fifo, int flag) { *fifo= track->fifo; @@ -1234,7 +1302,7 @@ int Cdrtrack_activate_image_size(struct CdrtracK *track, double *size_used, } track->extracting_container= 1; -#ifndef Cdrskin_extra_leaN +#ifndef Cdrskin_no_cdrfifO if(track->ff_fifo!=NULL) Cdrfifo_set_fd_in_limit(track->ff_fifo,track->fixed_size,track->ff_idx,0); #endif @@ -1298,6 +1366,7 @@ int Cdrtrack_seek_isosize(struct CdrtracK *track, int fd, int flag) bit0=debugging verbosity bit1=open as source for direct write: no audio extract, no minimum track size + bit2=permission to use burn_os_open_track_src() (evtl O_DIRECT) @return <=0 error, 1 success */ int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag) @@ -1387,8 +1456,15 @@ int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag) return(-1); if(is_wav==-3) return(0); - if(is_wav==0) - *fd= open(track->source_path,O_RDONLY); + if(is_wav==0) { + if(track->track_type != BURN_MODE1 || + (track->cdxa_conversion & 0x7fffffff)) + flag&= ~4; /* Better avoid O_DIRECT with odd sectors */ + if(flag & 4) + *fd= burn_os_open_track_src(track->source_path, O_RDONLY, 0); + else + *fd= open(track->source_path, O_RDONLY); + } if(*fd==-1) { fprintf(stderr,"cdrskin: failed to open source address '%s'\n", track->source_path); @@ -1452,7 +1528,7 @@ int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag) } -#ifndef Cdrskin_extra_leaN +#ifndef Cdrskin_no_cdrfifO /** Install a fifo object between data source and libburn. Its parameters are known to track. @@ -1474,7 +1550,8 @@ int Cdrtrack_attach_fifo(struct CdrtracK *track, int *outlet_fd, *outlet_fd= -1; if(track->fifo_size<=0) return(2); - ret= Cdrtrack_open_source_path(track,&source_fd,flag&1); + ret= Cdrtrack_open_source_path(track,&source_fd, + (flag&1) | (4 * (track->fifo_size >= 256 * 1024))); if(ret<=0) return(ret); if(pipe(pipe_fds)==-1) @@ -1491,7 +1568,7 @@ int Cdrtrack_attach_fifo(struct CdrtracK *track, int *outlet_fd, /* >>> ??? obtain track sector size and use instead of 2048 ? */ - ret= Cdrfifo_new(&ff,source_fd,pipe_fds[1],2048,track->fifo_size,0); + ret= Cdrfifo_new(&ff,source_fd,pipe_fds[1],2048,track->fifo_size, flag & 1); if(ret<=0) return(ret); if(previous_fifo!=NULL) @@ -1514,18 +1591,100 @@ int Cdrtrack_attach_fifo(struct CdrtracK *track, int *outlet_fd, return(1); } +#endif /* ! Cdrskin_no_cdrfifO */ -/** Read data into the fifo until either it is full or the data source is - exhausted. + +#ifndef Cdrskin_extra_leaN + +#ifdef Cdrskin_use_libburn_fifO + +/** Read data into the eventual libburn fifo until either fifo_start_at bytes + are read (-1 = no limit), it is full or or the data source is exhausted. @return <=0 error, 1 success */ +int Cdrtrack_fill_libburn_fifo(struct CdrtracK *track, int fifo_start_at, + int flag) +{ + int ret, bs= 32 * 1024; + int buffer_size, buffer_free; + double data_image_size; + char buf[64 * 1024], *buffer_text; + + if(fifo_start_at == 0) + return(2); + if(track->libburn_fifo == NULL) + return(2); + + if(fifo_start_at>0 && fifo_start_atfifo_size) + printf( + "cdrskin: NOTE : Input buffer will be initially filled up to %d bytes\n", + fifo_start_at); + printf("Waiting for reader process to fill input buffer ... "); + fflush(stdout); + ret= burn_fifo_fill(track->libburn_fifo, fifo_start_at, + (fifo_start_at == -1)); + if(ret < 0) + return(0); + +/** Ticket 55: check fifos for input, throw error on 0-bytes from stdin + @return <=0 abort run, 1 go on with burning +*/ + ret= burn_fifo_inquire_status(track->libburn_fifo, &buffer_size, + &buffer_free, &buffer_text); + if(track->is_from_stdin) { + if(ret<0 || buffer_size <= buffer_free) { + fprintf(stderr,"\ncdrskin: FATAL : (First track) fifo did not read a single byte from stdin\n"); + return(0); + } + } + + /* Try to obtain ISO 9660 Volume Descriptors and size from fifo. + Not an error if there is no ISO 9660. */ + if(track->iso_fs_descr != NULL) + free(track->iso_fs_descr); + track->iso_fs_descr = NULL; + if(buffer_size - buffer_free >= 64 * 1024) { + ret= burn_fifo_peek_data(track->libburn_fifo, buf, 64 * 1024, 0); + if(ret == 1) { + track->iso_fs_descr = calloc(1, bs); + if(track->iso_fs_descr == NULL) + return(-1); + memcpy(track->iso_fs_descr, buf + bs, bs); + ret= Scan_for_iso_size((unsigned char *) buf + bs, &data_image_size, 0); + if(ret > 0) + track->data_image_size= data_image_size; + } + } + return(1); +} + +#endif /* Cdrskin_use_libburn_fifO */ + + +#ifdef Cdrskin_no_cdrfifO + +int Cdrtrack_fill_fifo(struct CdrtracK *track, int fifo_start_at, int flag) +{ + return(Cdrtrack_fill_libburn_fifo(track, fifo_start_at, 0)); +} + +#else /* Cdrskin_no_cdrfifO */ + int Cdrtrack_fill_fifo(struct CdrtracK *track, int fifo_start_at, int flag) { int ret,buffer_fill,buffer_space; double data_image_size; - if(track->fifo==NULL || fifo_start_at==0) + if(fifo_start_at==0) return(2); + if(track->fifo==NULL) { +#ifdef Cdrskin_use_libburn_fifO + ret= Cdrtrack_fill_libburn_fifo(track, fifo_start_at, 0); + return(ret); +#else + return(2); +#endif + } if(fifo_start_at>0 && fifo_start_atfifo_size) printf( "cdrskin: NOTE : Input buffer will be initially filled up to %d bytes\n", @@ -1555,6 +1714,7 @@ int Cdrtrack_fill_fifo(struct CdrtracK *track, int fifo_start_at, int flag) return(1); } +#endif /* ! Cdrskin_no_cdrfifO */ #endif /* ! Cdrskin_extra_leaN */ @@ -1566,10 +1726,11 @@ int Cdrtrack_add_to_session(struct CdrtracK *track, int trackno, /* bit0= debugging verbosity bit1= apply padding hack (<<< should be unused for now) + bit2= permission to use O_DIRECT (if enabled at compile time) */ { struct burn_track *tr; - struct burn_source *src= NULL; + struct burn_source *src= NULL, *fd_src= NULL; double padding,lib_padding; int ret,sector_pad_up; double fixed_size; @@ -1581,7 +1742,7 @@ int Cdrtrack_add_to_session(struct CdrtracK *track, int trackno, /* Note: track->track_type may get set in here */ if(track->source_fd==-1) { - ret= Cdrtrack_open_source_path(track,&source_fd,(flag&1)); + ret= Cdrtrack_open_source_path(track, &source_fd, flag & (4 | 1)); if(ret<=0) goto ex; } @@ -1626,6 +1787,41 @@ int Cdrtrack_add_to_session(struct CdrtracK *track, int trackno, } src= burn_fd_source_new(track->source_fd,-1,(off_t) fixed_size); +#ifdef Cdrskin_use_libburn_fifO + + if(src != NULL && track->fifo == NULL) { + int fifo_enabled, fifo_size, fifo_start_at, chunksize, chunks; + int Cdrskin_get_fifo_par(struct CdrskiN *skin, int *fifo_enabled, + int *fifo_size, int *fifo_start_at, int flag); + + Cdrskin_get_fifo_par(track->boss, &fifo_enabled, &fifo_size, &fifo_start_at, + 0); + fd_src= src; + + if(track->track_type == BURN_AUDIO) + chunksize= 2352; + else if (track->cdxa_conversion == 1) + chunksize= 2056; + else + chunksize= 2048; + chunks= fifo_size / chunksize; + if(chunks > 1 && fifo_enabled) { + src= burn_fifo_source_new(fd_src, chunksize, chunks, + (chunksize * chunks >= 128 * 1024)); + if((flag & 1) || src == NULL) + fprintf(stderr, "cdrskin_DEBUG: %s libburn fifo of %d bytes\n", + src != NULL ? "installed" : "failed to install", + chunksize * chunks); + track->libburn_fifo= src; + if(src == NULL) { + src= fd_src; + fd_src= NULL; + } + } + } + +#endif /* Cdrskin_use_libburn_fifO */ + if(src==NULL) { fprintf(stderr, "cdrskin: FATAL : Could not create libburn data source object\n"); @@ -1638,6 +1834,8 @@ int Cdrtrack_add_to_session(struct CdrtracK *track, int trackno, burn_session_add_track(session,tr,BURN_POS_END); ret= 1; ex: + if(fd_src!=NULL) + burn_source_free(fd_src); if(src!=NULL) burn_source_free(src); return(ret); @@ -1688,7 +1886,7 @@ int Cdrtrack_get_sectors(struct CdrtracK *track, int flag) } -#ifndef Cdrskin_extra_leaN +#ifndef Cdrskin_no_cdrfifO /** Try to read bytes from the track's fifo outlet and eventually discard them. Not to be called unless the track is completely written. @@ -1709,7 +1907,7 @@ int Cdrtrack_has_input_left(struct CdrtracK *track, int flag) return(0); } -#endif /* ! Cdrskin_extra_leaN */ +#endif /* ! Cdrskin_no_cdrfifO */ /* --------------------------------------------------------------------- */ @@ -2136,6 +2334,8 @@ int Cdrpreskin_fallback(struct CdrpreskiN *preskin, int argc, char **argv, int i, wp= 1; char *ept, *upt; + if(preskin->fallback_program[0] == 0) + return(1); if(getuid()!=geteuid() && !preskin->allow_setuid) { fprintf(stderr, "cdrskin: SORRY : uid and euid differ. Will not start external fallback program.\n"); @@ -2672,6 +2872,9 @@ set_dev:; printf( " --drive_scsi_exclusive try to exclusively reserve device files\n"); printf(" /dev/srN, /dev/scdM, /dev/stK of drive.\n"); + printf(" dvd_obs=\"default\"|number\n"); + printf( + " set number of bytes per DVD/BD write: 32k or 64k\n"); #ifdef Cdrskin_burn_drive_eject_brokeN printf( " eject_device= set the device address for command eject\n"); @@ -2722,6 +2925,11 @@ set_dev:; printf( " byte addresses below that number.\n"); #endif + 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"); #ifdef Cdrskin_allow_libburn_taO printf( @@ -2787,7 +2995,9 @@ see_cdrskin_eng_html:; "\tdev=target\tpseudo-SCSI target to use as CD-Recorder\n"); fprintf(stderr, "\tgracetime=#\tset the grace time before starting to write to #.\n"); - fprintf(stderr,"\t-v\t\tincrement verbose level by one\n"); + fprintf(stderr,"\t-v\t\tincrement general verbose level by one\n"); + fprintf(stderr, + "\t-V\t\tincrement SCSI command transport verbose level by one\n"); fprintf(stderr, "\tdriveropts=opt\topt= one of {burnfree,noburnfree,help}\n"); fprintf(stderr, @@ -2914,12 +3124,16 @@ see_cdrskin_eng_html:; } else if(strcmp(argv[i],"-tao")==0) { strcpy(o->write_mode_name,"TAO"); + } else if(strcmp(argv[i],"-V")==0 || strcmp(argv[i],"-Verbose")==0) { + burn_set_scsi_logging(2 | 4); /* log SCSI to stderr */ + } else if(strcmp(argv[i],"-v")==0 || strcmp(argv[i],"-verbose")==0) { (o->verbosity)++; ClN(printf("cdrskin: verbosity level : %d\n",o->verbosity)); set_severities:; if(o->verbosity>=Cdrskin_verbose_debuG) Cdrpreskin_set_severities(o,"NEVER","DEBUG",0); + } else if(strcmp(argv[i],"-vv")==0 || strcmp(argv[i],"-vvv")==0 || strcmp(argv[i],"-vvvv")==0) { (o->verbosity)+= strlen(argv[i])-1; @@ -3101,19 +3315,10 @@ ex:; /** List of furter wishes towards libburn: - - write mode which does not demand a track size in advance - - obtain minimum drive speed (for cdrskin -atip) - - obtain MMC profile of inserted media (for cdrskin -v -atip) - - a possibility to implement cdrskin -multi - a possibilty to implement cdrskin -reset */ -/** <<< Hopefully obsolete: - Limit to prevent int rollovers within libburn as long as not everything is - changed to 64 bit off_t : 2 GB minus 800 MB for eventual computations. -#define Cdrskin_tracksize_maX 1308622848 -*/ #define Cdrskin_tracksize_maX 1024.0*1024.0*1024.0*1024.0 @@ -3162,6 +3367,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; @@ -3380,6 +3587,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; @@ -3554,6 +3763,8 @@ int Cdrskin_get_fifo_par(struct CdrskiN *skin, int *fifo_enabled, } +#ifndef Cdrskin_no_cdrfifO + /** Create and install fifo objects between track data sources and libburn. The sources and parameters are known to skin. @return <=0 error, 1 success @@ -3563,6 +3774,20 @@ int Cdrskin_attach_fifo(struct CdrskiN *skin, int flag) struct CdrfifO *ff= NULL; int ret,i,hflag; +#ifdef Cdrskin_use_libburn_fifO + + int profile_number; + char profile_name[80]; + + /* Refuse here and thus use libburn fifo only with single track, non-CD */ + ret= burn_disc_get_profile(skin->drives[skin->driveno].drive, + &profile_number, profile_name); + if(profile_number != 0x09 && profile_number != 0x0a && + skin->track_counter == 1) + return(1); + +#endif /* Cdrskin_use_libburn_fifO */ + skin->fifo= NULL; for(i=0;itrack_counter;i++) { hflag= (skin->verbosity>=Cdrskin_verbose_debuG); @@ -3594,6 +3819,8 @@ int Cdrskin_attach_fifo(struct CdrskiN *skin, int flag) return(1); } +#endif /* ! Cdrskin_no_cdrfifO */ + /** Read data into the track fifos until either #1 is full or its data source is exhausted. @@ -3936,7 +4163,7 @@ int Cdrskin_abort_handler(struct CdrskiN *skin, int signum, int flag) if(skin->preskin->abort_handler==3) fprintf(stderr,"cdrskin: ABORT : Trying to ignore any further signals\n"); -#ifndef Cdrskin_extra_leaN +#ifndef Cdrskin_no_cdrfifO if(skin->fifo!=NULL) Cdrfifo_close_all(skin->fifo,0); #endif @@ -5831,16 +6058,28 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin, bit0= growisofs style */ { - double bytes_to_write,written_bytes= 0.0,written_total_bytes= 0.0,buffer_size; + double bytes_to_write= 0.0; + double written_bytes= 0.0,written_total_bytes= 0.0; double fixed_size,padding,sector_size,speed_factor; double measured_total_speed,measured_speed; double elapsed_time,elapsed_total_time,current_time; double estim_time,estim_minutes,estim_seconds,percent; - int ret,fifo_percent,fill,space,advance_interval=0,new_mb,old_mb,time_to_tell; - int fs,bs,old_track_idx,buffer_fill,formatting= 0,use_data_image_size; - char fifo_text[80],mb_text[40]; + int ret,fifo_percent,fill,advance_interval=0,new_mb,old_mb,time_to_tell; + int old_track_idx,buffer_fill,formatting= 0,use_data_image_size; + char fifo_text[80],mb_text[40], pending[40]; char *debug_mark= ""; /* use this to prepend a marker text for experiments */ +#ifndef Cdrskin_no_cdrfifO + double buffer_size; + int fs, bs, space; +#endif + +#ifdef Cdrskin_use_libburn_fifO + struct burn_source *current_fifo= NULL; + int size, free_space; + char *status_text= ""; +#endif /* Cdrskin_use_libburn_fifO */ + /* for debugging */ static double last_fifo_in= 0.0,last_fifo_out= 0.0,curr_fifo_in,curr_fifo_out; @@ -5944,9 +6183,14 @@ thank_you_for_patience:; if(skin->verbosity>=Cdrskin_verbose_progresS) { if(skin->is_writing) fprintf(stderr,"\n"); + pending[0]= 0; +/* + if(bytes_to_write > 0 && skin->verbosity >= Cdrskin_verbose_debuG) + sprintf(pending, " pnd %.f", bytes_to_write - written_total_bytes); +*/ fprintf(stderr, - "\rcdrskin: thank you for being patient for %.f seconds ", - elapsed_total_time); + "\rcdrskin: thank you for being patient for %.f seconds%21.21s", + elapsed_total_time, pending); } advance_interval= 1; } @@ -6011,6 +6255,37 @@ thank_you_for_patience:; fifo_text[0]= 0; curr_fifo_in= last_fifo_in; curr_fifo_out= last_fifo_out; + +#ifdef Cdrskin_use_libburn_fifO + + /* Inquire fifo fill and format fifo pacifier text */ + if(skin->fifo == NULL && skin->supposed_track_idx >= 0 && + skin->supposed_track_idx < skin->track_counter && + skin->fifo_size > 0) { + Cdrtrack_get_libburn_fifo(skin->tracklist[skin->supposed_track_idx], + ¤t_fifo, 0); + if(current_fifo != NULL) { + 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); + } else + strcpy(fifo_text, "(fifo 100%) "); + } else if(skin->fifo_size > 0) { + strcpy(fifo_text, "(fifo 100%) "); + } + } + +#endif /* Cdrskin_use_libburn_fifO */ + +#ifndef Cdrskin_no_cdrfifO + if(skin->fifo!=NULL) { ret= Cdrfifo_get_buffer_state(skin->fifo,&fill,&space,0); buffer_size= fill+space; @@ -6039,6 +6314,9 @@ thank_you_for_patience:; } } } + +#endif /* ! Cdrskin_no_cdrfifO */ + if(skin->supposed_track_idx >= 0 && skin->supposed_track_idx < skin->track_counter) { /* fixed_size,padding are fetched above via Cdrtrack_get_size() */; @@ -6549,7 +6827,8 @@ int Cdrskin_direct_write(struct CdrskiN *skin, int flag) &source_path,&source_fd,&is_from_stdin,0); if(source_fd==-1) { ret= Cdrtrack_open_source_path(skin->tracklist[0],&source_fd, - 2|(skin->verbosity>=Cdrskin_verbose_debuG)); + 2 | (skin->verbosity >= Cdrskin_verbose_debuG) | + (4 * (skin->fifo_size >= 256 * 1024))); if(ret<=0) goto ex; } @@ -6716,15 +6995,19 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag) struct burn_progress p; struct burn_drive *drive; int ret,loop_counter= 0,max_track= -1,i,hflag,nwa,num, wrote_well= 2; - int fifo_disabled= 0,fifo_percent,total_min_fill,min_buffer_fill= 101; + int fifo_disabled= 0, min_buffer_fill= 101; int use_data_image_size, needs_early_fifo_fill= 0,iso_size= -1; - double put_counter,get_counter,empty_counter,full_counter; double start_time,last_time; double total_count= 0.0,last_count= 0.0,size,padding,sector_size= 2048.0; char *doing; char *source_path; int source_fd, is_from_stdin; +#ifndef Cdrskin_no_cdrfifO + double put_counter, get_counter, empty_counter, full_counter; + int total_min_fill, fifo_percent; +#endif + if(skin->tell_media_space) doing= "estimating"; else @@ -6783,6 +7066,11 @@ burn_failed:; hflag= (skin->verbosity>=Cdrskin_verbose_debuG); if(i==skin->track_counter-1) Cdrtrack_ensure_padding(skin->tracklist[i],hflag&1); + +/* if(skin->fifo_size >= 256 * 1024) */ + + hflag|= 4; + ret= Cdrtrack_add_to_session(skin->tracklist[i],i,session,hflag); if(ret<=0) { fprintf(stderr,"cdrskin: FATAL : Cannot add track %d to session.\n",i+1); @@ -6918,6 +7206,13 @@ burn_failed:; #ifdef Cdrskin_libburn_has_stream_recordinG burn_write_opts_set_stream_recording(o, skin->stream_recording_is_set); #endif +#ifdef Cdrskin_dvd_obs_default_64K + if(skin->dvd_obs == 0) + burn_write_opts_set_dvd_obs(o, 64 * 1024); + else +#endif + burn_write_opts_set_dvd_obs(o, skin->dvd_obs); + burn_write_opts_set_stdio_fsync(o, skin->stdio_sync); if(skin->dummy_mode) { fprintf(stderr, @@ -7041,6 +7336,14 @@ fifo_filling_failed:; if(skin->fifo==NULL || fifo_disabled) { usleep(20000); } else { + +#ifdef Cdrskin_no_cdrfifO + + /* Should never happen as skin->fifo should be NULL */ + usleep(20000); + +#else /* Cdrskin_no_cdrfifO */ + ret= Cdrfifo_try_to_work(skin->fifo,20000,NULL,NULL,0); if(ret<0) { int abh; @@ -7066,7 +7369,11 @@ fifo_filling_failed:; fprintf(stderr,"\ncdrskin_debug: fifo ended work with ret=%d\n",ret); fifo_disabled= 1; } + +#endif /* ! Cdrskin_no_cdrfifO */ + } + #else /* ! Cdrskin_extra_leaN */ usleep(20000); #endif /* Cdrskin_extra_leaN */ @@ -7106,6 +7413,19 @@ fifo_filling_failed:; #ifndef Cdrskin_extra_leaN +#ifdef Cdrskin_use_libburn_fifO + + if(skin->fifo == NULL && skin->verbosity>=Cdrskin_verbose_progresS) { + /* >>> this should rather be done for each track + (for now this libburn_fifo should only be used with single track) + */ + Cdrtrack_report_fifo(skin->tracklist[skin->track_counter - 1], 0); + } + +#endif /* Cdrskin_use_libburn_fifO */ + +#ifndef Cdrskin_no_cdrfifO + if(skin->fifo!=NULL && skin->fifo_size>0 && wrote_well) { int dummy,final_fill; Cdrfifo_get_buffer_state(skin->fifo,&final_fill,&dummy,0); @@ -7153,6 +7473,11 @@ fifo_full_at_end:; "Cdrskin: fifo was %.f times empty and %.f times full, min fill was %d%%.\n", empty_counter,full_counter,fifo_percent); } + } + +#endif /* ! Cdrskin_no_cdrfifO */ + + if(skin->verbosity>=Cdrskin_verbose_progresS) { drive_status= burn_drive_get_status(drive, &p); #ifdef Cdrskin_libburn_has_buffer_min_filL @@ -7450,7 +7775,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", + "-d", "-silent", "-s", "-setdropts", "-prcap", "-reset", "-abort", "-overburn", "-ignsize", "-useinfo", "-fix", "-nofix", "-raw", "-raw96p", "-raw16", "-raw96r", @@ -7792,6 +8117,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) @@ -8182,6 +8523,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; @@ -8261,6 +8622,8 @@ track_too_large:; if(skin->smallest_tsize<0 || skin->smallest_tsize>skin->fixed_size) skin->smallest_tsize= skin->fixed_size; + } else if(strcmp(argv[i],"-V")==0 || strcmp(argv[i],"-Verbose")==0) { + /* is handled in Cdrpreskin_setup() */; } else if(strcmp(argv[i],"-v")==0 || strcmp(argv[i],"-verbose")==0) { /* is handled in Cdrpreskin_setup() */; } else if(strcmp(argv[i],"-vv")==0 || strcmp(argv[i],"-vvv")==0 || @@ -8451,13 +8814,13 @@ ignore_unknown:; if(skin->track_counter>0) { skin->do_burn= 1; -#ifndef Cdrskin_extra_leaN +#ifndef Cdrskin_no_cdrfifO if(!skin->do_direct_write) { ret= Cdrskin_attach_fifo(skin,0); if(ret<=0) return(ret); } -#endif /* ! Cdrskin_extra_leaN */ +#endif /* ! Cdrskin_no_cdrfifO */ } return(1); diff --git a/cdrskin/cdrskin_eng.html b/cdrskin/cdrskin_eng.html index 0054848..12d95fa 100644 --- a/cdrskin/cdrskin_eng.html +++ b/cdrskin/cdrskin_eng.html @@ -61,7 +61,7 @@ via SCSI, PATA (aka IDE, ATA), USB, or SATA. GPL software included:
-
libburn-0.7.2
+
libburn-0.7.4
(founded by Derek Foreman and Ben Jansens, developed and maintained since August 2006 by Thomas Schmitt from team of libburnia-project.org) @@ -193,8 +193,8 @@ Standalone ISO 9660 multi-session CD/DVD/BD tool

Download as source code (see README):
-
cdrskin-0.7.2.pl00.tar.gz -(780 KB). +
cdrskin-0.7.4.pl00.tar.gz +(810 KB).
The cdrskin tarballs are source code identical with libburn releases @@ -245,18 +245,22 @@ cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz, (310 KB), -static compiled,

Enhancements towards previous stable version cdrskin-0.7.0.pl00:

    -
  • Better interpretation of options -mode2, -xa, -xa1, -xa2
  • -
  • New option --xa1-ignore
  • -
  • New -atip report lines "Product Id:" and "Producer:"
  • -
  • Emulation of some -minfo output
  • +
  • Implemented option -V for logging of SCSI commands
  • +
  • New options dvd_obs= and stdio_fsync=
  • +
  • New ./configure options --enable-track-src-odirect, --enable-dvd-obs-64k +
  • +
  • New compile_cdrskin.sh option -dvd_obs_64k
-Bug fixes towards cdrskin-0.7.0.pl00: +Bug fixes towards cdrskin-0.7.2.pl00:
    -
  • CD TAO sessions with multiple tracks did not work in -dummy mode
  • +
  • Workaround for Pioneer DVR-216D which got stuck on DVD-R burns.
  • +
  • Workaround for Pioneer DVR-216D which did not always eject the tray.
  • +
  • DVD DAO track size was rounded up much too generously
  • +
  • SIGSEGV from NULL pointer with media product id inquiry on LG GH22LS30
  • @@ -266,8 +270,8 @@ Bug fixes towards cdrskin-0.7.0.pl00:

    -

    Development snapshot, version 0.7.3 :

    -
    Enhancements towards current stable version 0.7.2.pl00: +

    Development snapshot, version 0.7.5 :

    +
    Enhancements towards current stable version 0.7.4.pl00:
    • none yet