From b28165f10bcb4cdd2f5f27b23c9681ecba165694 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Mon, 16 Nov 2009 16:53:07 +0000 Subject: [PATCH] Configure options --enable-cdrskin-fifo-odirect, --enable-dvd-obs-64k --- Makefile.am | 4 +++- cdrskin/cdrfifo.c | 6 ++++-- cdrskin/cdrfifo.h | 2 +- cdrskin/cdrskin.1 | 9 +++++---- cdrskin/cdrskin.c | 39 +++++++++++++++++++++++++++---------- cdrskin/cdrskin_timestamp.h | 2 +- configure.ac | 38 ++++++++++++++++++++++++++++++------ libburn/write.c | 5 ++++- 8 files changed, 79 insertions(+), 26 deletions(-) diff --git a/Makefile.am b/Makefile.am index 48dd8c5..d76a538 100644 --- a/Makefile.am +++ b/Makefile.am @@ -12,6 +12,7 @@ lib_LTLIBRARIES = libburn/libburn.la # Build libraries libburn_libburn_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) +libburn_libburn_la_CFLAGS = $(LIBBURN_DVD_OBS_64K) libburn_libburn_la_LIBADD = $(LIBBURN_ARCH_LIBS) $(THREAD_LIBS) libburn_libburn_la_SOURCES = \ libburn/async.c \ @@ -112,7 +113,8 @@ test_structest_SOURCES = test/structest.c ## cdrskin construction site - ts A60816 - A91012 cdrskin_cdrskin_CPPFLAGS = -Ilibburn -cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_7_3 +cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_7_3 \ + $(CDRSKIN_O_DIRECT_DEF) $(CDRSKIN_DVD_OBS_64K) # cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS) # ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking diff --git a/cdrskin/cdrfifo.c b/cdrskin/cdrfifo.c index 6d912e2..bb87f8b 100644 --- a/cdrskin/cdrfifo.c +++ b/cdrskin/cdrfifo.c @@ -124,7 +124,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, @@ -180,6 +180,8 @@ int Cdrfifo_new(struct CdrfifO **ff, int source_fd, int dest_fd, o->chain_idx= 0; #ifdef Cdrskin_read_o_direcT + if(flag & 1) + fprintf(stderr,"cdrfifo: DEBUG : allocating fifo buffer via mmap()\n"); o->buffer= mmap(NULL, (size_t) buffer_size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, (off_t) 0); if(o->buffer == MAP_FAILED) @@ -188,7 +190,7 @@ int Cdrfifo_new(struct CdrfifO **ff, int source_fd, int dest_fd, o->buffer= TSOB_FELD(char,buffer_size); if(o->buffer==NULL) goto failed; -#endif /* Cdrskin_read_o_direcT */ +#endif /* ! Cdrskin_read_o_direcT */ return(1); failed:; 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 ff1ea56..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 "Nov 15, 2009" +.TH CDRSKIN 1 "Nov 16, 2009" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -902,9 +902,10 @@ overwriteable DVD-RW it is 32k. .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= . +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 diff --git a/cdrskin/cdrskin.c b/cdrskin/cdrskin.c index e1accad..c139058 100644 --- a/cdrskin/cdrskin.c +++ b/cdrskin/cdrskin.c @@ -1319,6 +1319,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 O_DIRECT (if enabled at compile time) @return <=0 error, 1 success */ int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag) @@ -1408,12 +1409,18 @@ int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag) return(-1); if(is_wav==-3) return(0); - if(is_wav==0) + if(is_wav==0) { #ifdef Cdrskin_read_o_direcT - *fd= open64(track->source_path, O_RDONLY | O_DIRECT); -#else - *fd= open(track->source_path, O_RDONLY); + if(flag & 4) { + *fd= open64(track->source_path, O_RDONLY | O_DIRECT); + if(flag & 1) + fprintf(stderr,"cdrskin: DEBUG : opened track inlet O_DIRECT\n"); + } else #endif + { + *fd= open(track->source_path, O_RDONLY); + } + } if(*fd==-1) { fprintf(stderr,"cdrskin: failed to open source address '%s'\n", track->source_path); @@ -1499,7 +1506,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) @@ -1516,7 +1524,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) @@ -1591,6 +1599,7 @@ 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; @@ -1606,7 +1615,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; } @@ -5995,8 +6004,10 @@ thank_you_for_patience:; 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%21.21s", elapsed_total_time, pending); @@ -6602,7 +6613,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; } @@ -6836,6 +6848,8 @@ 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); @@ -6972,9 +6986,14 @@ burn_failed:; 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); +#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); -#endif +#endif /* Cdrskin_libburn_has_fsync_obS */ if(skin->dummy_mode) { fprintf(stderr, diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index f94eafb..ee60d31 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2009.11.15.165016" +#define Cdrskin_timestamP "2009.11.16.165420" diff --git a/configure.ac b/configure.ac index d9c2631..aed9586 100644 --- a/configure.ac +++ b/configure.ac @@ -111,15 +111,15 @@ AC_SUBST(BURN_VERSION) dnl Libtool versioning LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION dnl -dnl ts A91012 +dnl ts A91116 dnl ### This is the release version libburn-0.7.2 = libburn.so.4.37.0 dnl This is the development version after above release version -dnl LT_CURRENT++, LT_AGE++ has not yet happened. -dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile. +dnl ### LT_CURRENT++, LT_AGE++ has not yet happened. +dnl LT_CURRENT++, LT_AGE++ has happened meanwhile. dnl -dnl SONAME = 41 - 37 = 4 . Linux library name = libburn.so.4.37.0 -LT_CURRENT=41 -LT_AGE=37 +dnl SONAME = 42 - 38 = 4 . Linux library name = libburn.so.4.38.0 +LT_CURRENT=42 +LT_AGE=38 LT_REVISION=0 LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE` @@ -198,6 +198,32 @@ else CFLAGS="$CFLAGS -DDEBUG" fi +# ts A91116 +AC_ARG_ENABLE(cdrskin-fifo-odirect, +[ --enable-cdrskin-fifo-odirect Enable use of O_DIRECT with cdrskin fifo inlet, default=no], + , enable_cdrskin_fifo_odirect=no) +if test x$enable_cdrskin_fifo_odirect = xyes; then + CDRSKIN_O_DIRECT_DEF="-DCdrskin_read_o_direcT" + echo "enabled use of O_DIRECT with cdrskin fifo inlet" +else + CDRSKIN_O_DIRECT_DEF= + echo "disabled use of O_DIRECT with cdrskin fifo inlet" +fi +AC_SUBST(CDRSKIN_O_DIRECT_DEF) + +# ts A91116 +AC_ARG_ENABLE(dvd-obs-64k, +[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no], + , enable_fifo_odirect=no) +if test x$enable_dvd_obs_64k = xyes; then + LIBBURN_DVD_OBS_64K="-DLibburn_dvd_obs_default_64K" + echo "enabled write size default 64 KB on DVD and BD" +else + LIBBURN_DVD_OBS_64K= + echo "disabled write size default 64 KB on DVD and BD" +fi +AC_SUBST(LIBBURN_DVD_OBS_64K) + dnl Determine target directory for libburn-*.pc dnl Important: Must be performed _after_ TARGET_SHIZZLE diff --git a/libburn/write.c b/libburn/write.c index 3d8d8f6..389f0c3 100644 --- a/libburn/write.c +++ b/libburn/write.c @@ -1914,6 +1914,9 @@ int burn_dvd_write_sync(struct burn_write_opts *o, o->obs_pad = 1; /* fill-up track's last 32k buffer */ } +#ifdef Libburn_dvd_obs_default_64K + o->obs = 64 * 1024; +#endif /* <<< test only : Does this increase effective speed with USB ? ts A90801 : 64kB: speed with 16x DVD-R is 12 rather than 8 @@ -1932,7 +1935,7 @@ int burn_dvd_write_sync(struct burn_write_opts *o, libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002, LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg, 0, 0); - o->obs = BUFFER_SIZE; + o->obs = 32 * 1024; /* This size is required to work */ } sprintf(msg, "dvd/bd Profile= %2.2Xh , obs= %d , obs_pad= %d",