Finally tagged it right
This commit is contained in:
parent
deaa707ab6
commit
a24588393a
@ -3,8 +3,5 @@
|
|||||||
aclocal
|
aclocal
|
||||||
libtoolize --copy --force
|
libtoolize --copy --force
|
||||||
autoconf
|
autoconf
|
||||||
|
autoheader
|
||||||
# ts A61101 : libburn is not prepared for config.h
|
|
||||||
# autoheader
|
|
||||||
|
|
||||||
automake --foreign --add-missing --copy --include-deps
|
automake --foreign --add-missing --copy --include-deps
|
||||||
|
@ -26,12 +26,12 @@ following possible.
|
|||||||
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
|
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
|
||||||
Integrated sub project of libburn.pykix.org but also published via:
|
Integrated sub project of libburn.pykix.org but also published via:
|
||||||
http://scdbackup.sourceforge.net/cdrskin_eng.html
|
http://scdbackup.sourceforge.net/cdrskin_eng.html
|
||||||
http://scdbackup.sourceforge.net/cdrskin-0.2.5.tar.gz
|
http://scdbackup.sourceforge.net/cdrskin-0.2.4.tar.gz
|
||||||
Copyright (C) 2006 Thomas Schmitt
|
Copyright (C) 2006 Thomas Schmitt
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
On top of libburn there is implemented cdrskin 0.2.5, a limited cdrecord
|
On top of libburn there is implemented cdrskin 0.2.4, a limited cdrecord
|
||||||
compatibility wrapper which allows to use some libburn features from
|
compatibility wrapper which allows to use some libburn features from
|
||||||
the command line.
|
the command line.
|
||||||
Interested users of cdrecord are invited to participate in the development
|
Interested users of cdrecord are invited to participate in the development
|
||||||
@ -59,16 +59,16 @@ systems, including 64 bit systems. (Further reports are welcome.)
|
|||||||
|
|
||||||
Compilation, First Glimpse, Installation
|
Compilation, First Glimpse, Installation
|
||||||
|
|
||||||
Obtain cdrskin-0.2.5.tar.gz , take it to a directory of your choice and do:
|
Obtain cdrskin-0.2.4.tar.gz , take it to a directory of your choice and do:
|
||||||
|
|
||||||
tar xzf cdrskin-0.2.5.tar.gz
|
tar xzf cdrskin-0.2.4.tar.gz
|
||||||
cd cdrskin-0.2.5
|
cd cdrskin-0.2.4
|
||||||
|
|
||||||
Or obtain a libburn.pykix.org SVN snapshot,
|
Or obtain a libburn.pykix.org SVN snapshot,
|
||||||
go into the toplevel directory of the snapshot (e.g. cd libburn_pykix ),
|
go into the toplevel directory of the snapshot (e.g. cd libburn_pykix ),
|
||||||
and execute the autotools script ./bootstrap . Use autools version >= 1.7 .
|
and execute the autotools script ./bootstrap . Use autools version >= 1.7 .
|
||||||
|
|
||||||
Within that toplevel directory of either cdrskin-0.2.5 or libburn then execute:
|
Within that toplevel directory of either cdrskin-0.2.4 or libburn then execute:
|
||||||
|
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
@ -86,7 +86,7 @@ In order to surely get a standalone binary, execute
|
|||||||
|
|
||||||
cdrskin/compile_cdrskin.sh
|
cdrskin/compile_cdrskin.sh
|
||||||
|
|
||||||
Version identification and help texts available afterwards:
|
Version identification an help texts available afterwards:
|
||||||
cdrskin/cdrskin -version
|
cdrskin/cdrskin -version
|
||||||
cdrskin/cdrskin --help
|
cdrskin/cdrskin --help
|
||||||
cdrskin/cdrskin -help
|
cdrskin/cdrskin -help
|
||||||
@ -181,7 +181,7 @@ See below "Audio CD" for specifications.
|
|||||||
madplay -o raw:track04.cd /path/to/track4.mp3
|
madplay -o raw:track04.cd /path/to/track4.mp3
|
||||||
mppdec --raw-le /path/to/track5.mpc track05.cd
|
mppdec --raw-le /path/to/track5.mpc track05.cd
|
||||||
|
|
||||||
cdrskin -v dev=0,1,0 blank=fast -eject speed=48 -sao \
|
cdrskin dev=0,1,0 blank=fast -eject speed=48 -sao \
|
||||||
-audio -swab track0[1-5].cd /path/to/track6.wav
|
-audio -swab track0[1-5].cd /path/to/track6.wav
|
||||||
|
|
||||||
|
|
||||||
@ -207,15 +207,10 @@ Run a backup :
|
|||||||
|
|
||||||
Restrictions
|
Restrictions
|
||||||
|
|
||||||
The convenient burn mode TAO is becoming available with libburn right now.
|
The convenient burn mode TAO is not available with libburn yet.
|
||||||
First experiments have shown good results with a single track. Nevertheless
|
Therefore it has to be defaulted to mode SAO which needs to know the track
|
||||||
the possible pitfalls still have to be explored.
|
|
||||||
Therefore TAO is still defaulted to mode SAO which needs to know the track
|
|
||||||
size in advance. non-cdrecord option tao_to_sao_tsize=650m causes each CD
|
size in advance. non-cdrecord option tao_to_sao_tsize=650m causes each CD
|
||||||
to get burned up to 650 MB regardless of the payload size.
|
to get burned up to 650 MB regardless of the payload size.
|
||||||
Compile with
|
|
||||||
cdrskin/compile_cdrskin.sh -experimental
|
|
||||||
to enable explicit option -tao. (Note that -sao for now is default even then.)
|
|
||||||
|
|
||||||
No multi session yet ... Please report your wishes.
|
No multi session yet ... Please report your wishes.
|
||||||
|
|
||||||
|
@ -1,203 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -x
|
|
||||||
|
|
||||||
# This script documents how this cdrskin version was derived from
|
|
||||||
# a vanilla libburn version. It is not intended nor needed for any
|
|
||||||
# use of cdrskin but included here only to show the technical
|
|
||||||
# relationship between both projects - which are close friends
|
|
||||||
# and issue roughly the same software.
|
|
||||||
#
|
|
||||||
# Package maintainers are advised to cover rather libburn than
|
|
||||||
# cdrskin unless they put only emphasis on the cdrecord emulation
|
|
||||||
# provided by cdrskin. libburn contains cdrskin - cdrskin is an
|
|
||||||
# oscillating, friendly and coordinated fork of libburn.
|
|
||||||
#
|
|
||||||
# Script results are a source tarball and two binaries
|
|
||||||
# one dynamic and one static in respect to system libs.
|
|
||||||
# Both binaries are static in respect to libburn.
|
|
||||||
#
|
|
||||||
# The script is to be run in the directory above the toplevel
|
|
||||||
# directory of libburn resp. cdrskin development.
|
|
||||||
#
|
|
||||||
# libburn version used: http://libburn.pykix.org
|
|
||||||
# Downloaded by:
|
|
||||||
# $ svn co http://libburn-svn.pykix.org/trunk libburn_pykix
|
|
||||||
# packed up in a tarball just to save it from inadverted changes by
|
|
||||||
# $ tar czf libburn_svn.tgz libburn_pykix
|
|
||||||
original="./libburn_svn.tgz"
|
|
||||||
# Historic moments:
|
|
||||||
# original="./libburn_svn_A60815.tgz"
|
|
||||||
# original="./libburn_cdrskin_A60819.tgz"
|
|
||||||
|
|
||||||
# The top level directory in that snapshot is named
|
|
||||||
intermediate="./libburn_pykix"
|
|
||||||
|
|
||||||
# My changes are in libburn-0.2.3.ts.develop , mainly in ./cdrskin
|
|
||||||
|
|
||||||
changes="./libburn-0.2.3.ts.develop"
|
|
||||||
skin_rev="0.2.5"
|
|
||||||
|
|
||||||
# The result directory and the name of the result tarballs
|
|
||||||
target="./cdrskin-${skin_rev}"
|
|
||||||
cdrskin_tarball="./cdrskin-${skin_rev}.tar.gz"
|
|
||||||
cdrskin_tarball_svn="./cdrskin-${skin_rev}.svn.tar.gz"
|
|
||||||
|
|
||||||
# (This once earned me an embarrassingly blooping source tarball)
|
|
||||||
# compile_dir="$changes"
|
|
||||||
|
|
||||||
compile_dir="$target"
|
|
||||||
compile_cmd="./cdrskin/compile_cdrskin.sh"
|
|
||||||
compile_static_opts="-static"
|
|
||||||
compile_result="cdrskin/cdrskin"
|
|
||||||
|
|
||||||
bintarget_dynamic="cdrskin_${skin_rev}-x86-suse9_0"
|
|
||||||
bintarget_static="$bintarget_dynamic"-static
|
|
||||||
|
|
||||||
if test -d "$changes"
|
|
||||||
then
|
|
||||||
dummy=dummy
|
|
||||||
else
|
|
||||||
echo "$0 : FATAL : no directory $changes" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
for i in "$target" "$intermediate"
|
|
||||||
do
|
|
||||||
if test -e "$i"
|
|
||||||
then
|
|
||||||
echo "$0 : FATAL : already existing $i" >&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -f "$original"
|
|
||||||
then
|
|
||||||
dummy=dummy
|
|
||||||
else
|
|
||||||
echo "$0 : FATAL : no file $original" >&2
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Unpack SVN snapshot.
|
|
||||||
tar xzf "$original"
|
|
||||||
|
|
||||||
|
|
||||||
# Rename the directory to the cdrskin name
|
|
||||||
mv "$intermediate" "$target"
|
|
||||||
|
|
||||||
|
|
||||||
# Copy the changes from the development tree
|
|
||||||
#
|
|
||||||
cdrskin_dir="$changes"/cdrskin
|
|
||||||
libburn_dir="$changes"/libburn
|
|
||||||
cdrskin_target="$target"/cdrskin
|
|
||||||
libburn_target="$target"/libburn
|
|
||||||
|
|
||||||
# Create version timestamp
|
|
||||||
timestamp="$(date -u '+%Y.%m.%d.%H%M%S')"
|
|
||||||
echo "$timestamp"
|
|
||||||
echo '#define Cdrskin_timestamP "'"$timestamp"'"' >"$cdrskin_dir"/cdrskin_timestamp.h
|
|
||||||
|
|
||||||
# Add the cdrskin files
|
|
||||||
if test -e "$cdrskin_target"
|
|
||||||
then
|
|
||||||
rm -rf "$cdrskin_target"
|
|
||||||
fi
|
|
||||||
cp -a "$cdrskin_dir" "$cdrskin_target"
|
|
||||||
|
|
||||||
# Remove copied binaries
|
|
||||||
rm "$cdrskin_target"/*.o
|
|
||||||
rm "$cdrskin_target"/cdrfifo
|
|
||||||
rm "$cdrskin_target"/cdrskin
|
|
||||||
rm "$cdrskin_target"/cleanup
|
|
||||||
for i in std new make old
|
|
||||||
do
|
|
||||||
if test -e "$cdrskin_target"/cdrskin_"$i"
|
|
||||||
then
|
|
||||||
rm "$cdrskin_target"/cdrskin_"$i"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
for i in .deps .dirstamp .libs
|
|
||||||
do
|
|
||||||
if test -e "$cdrskin_target"/"$i"
|
|
||||||
then
|
|
||||||
rm -rf "$cdrskin_target"/"$i"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Remove unwanted SVN stuff (TODO: avoid downloading it)
|
|
||||||
for i in "$target"/.svn "$target"/*/.svn
|
|
||||||
do
|
|
||||||
if test "$i" = "$target"'/*/.svn'
|
|
||||||
then
|
|
||||||
dummy=dummy
|
|
||||||
else
|
|
||||||
if test -e "$i"
|
|
||||||
then
|
|
||||||
rm -rf "$i"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
## No more : Add own libburn-README in toplevel
|
|
||||||
# cp -a "$changes"/README "$target"
|
|
||||||
|
|
||||||
## No more : Add modified Makefile.am
|
|
||||||
# cp -a "$changes"/Makefile.am "$target"
|
|
||||||
|
|
||||||
|
|
||||||
# Make SVN state tarball for the libburn team
|
|
||||||
tar czf "$cdrskin_tarball_svn" "$target"
|
|
||||||
|
|
||||||
|
|
||||||
# Get over dependecy on autotools. Rely only on cc, make et. al.
|
|
||||||
# This is not the same as "make dist" but i can do it without
|
|
||||||
# having to evaluate the quality of said "make dist"
|
|
||||||
#
|
|
||||||
( cd "$target" ; ./bootstrap )
|
|
||||||
|
|
||||||
# Remove unwanted stuff after bootstrap
|
|
||||||
for i in "$target"/autom4te.cache
|
|
||||||
do
|
|
||||||
if echo "$i" | grep '\*' >/dev/null
|
|
||||||
then
|
|
||||||
dummy=dummy
|
|
||||||
else
|
|
||||||
if test -e "$i"
|
|
||||||
then
|
|
||||||
rm -rf "$i"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
# Pack it up to the new libburn+cdrskin-tarball
|
|
||||||
tar czf "$cdrskin_tarball" "$target"
|
|
||||||
|
|
||||||
# Produce a static and a dynamic binary
|
|
||||||
(
|
|
||||||
cd "$compile_dir" || exit 1
|
|
||||||
./configure
|
|
||||||
make
|
|
||||||
$compile_cmd -do_strip
|
|
||||||
cp "$compile_result" "../$bintarget_dynamic"
|
|
||||||
if test -n "$compile_static_opts"
|
|
||||||
then
|
|
||||||
$compile_cmd $compile_static_opts -do_strip
|
|
||||||
cp "$compile_result" "../$bintarget_static"
|
|
||||||
fi
|
|
||||||
)
|
|
||||||
|
|
||||||
# Remove the build area
|
|
||||||
# Disable this for debugging the merge process
|
|
||||||
rm -rf "$target"
|
|
||||||
|
|
||||||
# Show the result
|
|
||||||
./"$bintarget_dynamic" -version
|
|
||||||
./"$bintarget_static" -version
|
|
||||||
ls -l "$cdrskin_tarball"
|
|
||||||
ls -l "$bintarget_dynamic"
|
|
||||||
ls -l "$bintarget_static"
|
|
||||||
|
|
@ -123,7 +123,7 @@ or
|
|||||||
|
|
||||||
/** The official program version */
|
/** The official program version */
|
||||||
#ifndef Cdrskin_prog_versioN
|
#ifndef Cdrskin_prog_versioN
|
||||||
#define Cdrskin_prog_versioN "0.2.5"
|
#define Cdrskin_prog_versioN "0.2.4"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** The source code release timestamp */
|
/** The source code release timestamp */
|
||||||
@ -169,7 +169,6 @@ or
|
|||||||
#define Cdrskin_libburn_has_convert_scsi_adR 1
|
#define Cdrskin_libburn_has_convert_scsi_adR 1
|
||||||
#define Cdrskin_libburn_has_burn_msgS 1
|
#define Cdrskin_libburn_has_burn_msgS 1
|
||||||
#define Cdrskin_libburn_has_burn_aborT 1
|
#define Cdrskin_libburn_has_burn_aborT 1
|
||||||
#define Cdrskin_libburn_has_cleanup_handleR 1
|
|
||||||
#define Cdrskin_libburn_has_audioxtR 1
|
#define Cdrskin_libburn_has_audioxtR 1
|
||||||
#define Cdrskin_libburn_has_get_start_end_lbA 1
|
#define Cdrskin_libburn_has_get_start_end_lbA 1
|
||||||
#define Cdrskin_libburn_has_burn_disc_unsuitablE 1
|
#define Cdrskin_libburn_has_burn_disc_unsuitablE 1
|
||||||
@ -193,7 +192,7 @@ or
|
|||||||
#ifdef Cdrskin_new_api_tesT
|
#ifdef Cdrskin_new_api_tesT
|
||||||
|
|
||||||
/* put macros under test caveat here */
|
/* put macros under test caveat here */
|
||||||
#define Cdrskin_allow_libburn_taO 1
|
#define Cdrskin_libburn_has_cleanup_handleR 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -206,6 +205,14 @@ or
|
|||||||
#endif /* Cdrskin_libburn_from_pykix_svN */
|
#endif /* Cdrskin_libburn_from_pykix_svN */
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _LARGEFILE_SOURCE
|
||||||
|
#define _LARGEFILE_SOURCE 1
|
||||||
|
#endif
|
||||||
|
#ifndef _FILE_OFFSET_BITS
|
||||||
|
#define _FILE_OFFSET_BITS 64
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* These macros activate cdrskin workarounds for deficiencies resp.
|
/* These macros activate cdrskin workarounds for deficiencies resp.
|
||||||
problematic features of libburn which hopefully will change in
|
problematic features of libburn which hopefully will change in
|
||||||
future. */
|
future. */
|
||||||
@ -271,6 +278,7 @@ or
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
/* #include <libburn/libburn.h> */
|
||||||
#include "../libburn/libburn.h"
|
#include "../libburn/libburn.h"
|
||||||
|
|
||||||
#ifdef Cdrskin_libburn_has_audioxtR
|
#ifdef Cdrskin_libburn_has_audioxtR
|
||||||
@ -890,33 +898,11 @@ int Cdrtrack_set_track_type(struct CdrtracK *o, int track_type, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
@param flag Bitfield for control purposes:
|
|
||||||
bit0= size returns number of actually processed source bytes
|
|
||||||
rather than the predicted fixed_size (if available).
|
|
||||||
padding returns the difference from number of written
|
|
||||||
bytes.
|
|
||||||
*/
|
|
||||||
int Cdrtrack_get_size(struct CdrtracK *track, double *size, double *padding,
|
int Cdrtrack_get_size(struct CdrtracK *track, double *size, double *padding,
|
||||||
double *sector_size, int flag)
|
double *sector_size, int flag)
|
||||||
{
|
{
|
||||||
|
|
||||||
*size= track->fixed_size;
|
*size= track->fixed_size;
|
||||||
*padding= track->padding;
|
*padding= track->padding;
|
||||||
#ifdef Cdrskin_allow_libburn_taO
|
|
||||||
if((flag&1) && track->libburn_track!=NULL) {
|
|
||||||
off_t readcounter= 0,writecounter= 0;
|
|
||||||
|
|
||||||
burn_track_get_counters(track->libburn_track,&readcounter,&writecounter);
|
|
||||||
*size= readcounter;
|
|
||||||
*padding= writecounter-readcounter;
|
|
||||||
/*
|
|
||||||
fprintf(stderr,"cdrskin_debug: sizeof(off_t)=%d\n",
|
|
||||||
sizeof(off_t));
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
*sector_size= track->sector_size;
|
*sector_size= track->sector_size;
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
@ -1008,7 +994,7 @@ ex:
|
|||||||
*/
|
*/
|
||||||
int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag)
|
int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag)
|
||||||
{
|
{
|
||||||
int is_wav= 0, size_from_file= 0;
|
int is_wav= 0;
|
||||||
off_t xtr_size= 0;
|
off_t xtr_size= 0;
|
||||||
|
|
||||||
if(track->source_path[0]=='-' && track->source_path[1]==0)
|
if(track->source_path[0]=='-' && track->source_path[1]==0)
|
||||||
@ -1040,21 +1026,10 @@ int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag)
|
|||||||
if(fstat(*fd,&stbuf)!=-1)
|
if(fstat(*fd,&stbuf)!=-1)
|
||||||
track->fixed_size= stbuf.st_size;
|
track->fixed_size= stbuf.st_size;
|
||||||
}
|
}
|
||||||
size_from_file= 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef Cdrskin_allow_libburn_taO
|
|
||||||
|
|
||||||
if(track->fixed_size < Cdrtrack_minimum_sizE * track->sector_size
|
|
||||||
&& (track->fixed_size>0 || size_from_file)) {
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
if(track->fixed_size < Cdrtrack_minimum_sizE * track->sector_size) {
|
if(track->fixed_size < Cdrtrack_minimum_sizE * track->sector_size) {
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(track->track_type == BURN_AUDIO) {
|
if(track->track_type == BURN_AUDIO) {
|
||||||
/* >>> cdrecord: We differ in automatic padding with audio:
|
/* >>> cdrecord: We differ in automatic padding with audio:
|
||||||
Audio tracks must be at least 705600 bytes and a multiple of 2352.
|
Audio tracks must be at least 705600 bytes and a multiple of 2352.
|
||||||
@ -1068,7 +1043,7 @@ int Cdrtrack_open_source_path(struct CdrtracK *track, int *fd, int flag)
|
|||||||
"cdrskin: NOTE : Enforcing minimum track size of %.f bytes\n",
|
"cdrskin: NOTE : Enforcing minimum track size of %.f bytes\n",
|
||||||
Cdrtrack_minimum_sizE*track->sector_size);
|
Cdrtrack_minimum_sizE*track->sector_size);
|
||||||
track->fixed_size= Cdrtrack_minimum_sizE*track->sector_size;
|
track->fixed_size= Cdrtrack_minimum_sizE*track->sector_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
track->source_fd= *fd;
|
track->source_fd= *fd;
|
||||||
return(*fd>=0);
|
return(*fd>=0);
|
||||||
@ -2315,8 +2290,7 @@ struct CdrskiN {
|
|||||||
|
|
||||||
/** Progress state info: wether libburn is actually processing payload data */
|
/** Progress state info: wether libburn is actually processing payload data */
|
||||||
int is_writing;
|
int is_writing;
|
||||||
/** Previously detected drive state */
|
|
||||||
enum burn_drive_status previous_drive_status;
|
|
||||||
|
|
||||||
/** abort parameters */
|
/** abort parameters */
|
||||||
int abort_max_wait;
|
int abort_max_wait;
|
||||||
@ -2399,7 +2373,6 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
|
|||||||
o->n_drives= 0;
|
o->n_drives= 0;
|
||||||
o->driveno= 0;
|
o->driveno= 0;
|
||||||
o->is_writing= 0;
|
o->is_writing= 0;
|
||||||
o->previous_drive_status = BURN_DRIVE_IDLE;
|
|
||||||
o->abort_max_wait= 74*60;
|
o->abort_max_wait= 74*60;
|
||||||
o->lib_is_initialized= (flag&1);
|
o->lib_is_initialized= (flag&1);
|
||||||
o->control_pid= getpid();
|
o->control_pid= getpid();
|
||||||
@ -2576,6 +2549,11 @@ int Cdrskin_reinit_lib_with_adr(struct CdrskiN *skin, int flag)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,
|
||||||
|
"cdrskin_debug: Restarting libburn. flag= %d driveno= %d grabbed= %d \n",
|
||||||
|
flag,skin->driveno,skin->drive_is_grabbed));
|
||||||
|
|
||||||
if(skin->drive_is_grabbed)
|
if(skin->drive_is_grabbed)
|
||||||
Cdrskin_release_drive(skin,0);
|
Cdrskin_release_drive(skin,0);
|
||||||
if(flag&1)
|
if(flag&1)
|
||||||
@ -2586,19 +2564,42 @@ int Cdrskin_reinit_lib_with_adr(struct CdrskiN *skin, int flag)
|
|||||||
"cdrskin: FATAL : unable to determine persistent drive address\n");
|
"cdrskin: FATAL : unable to determine persistent drive address\n");
|
||||||
ret= 0; goto ex;
|
ret= 0; goto ex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* >>> A60827: this causes a SIGSEGV when releasing the re-initialized drive
|
||||||
|
skin->drives[skin->driveno].drive after burn (then as
|
||||||
|
skin->grabbed_drive, but already being 0xb0 in Cdrskin_grab) )
|
||||||
|
|
||||||
|
*/
|
||||||
burn_drive_info_free(skin->drives);
|
burn_drive_info_free(skin->drives);
|
||||||
|
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,"cdrskin_debug: Finishing libburn.\n"));
|
||||||
|
|
||||||
burn_finish();
|
burn_finish();
|
||||||
|
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,"cdrskin_debug: Initializing libburn.\n"));
|
||||||
|
|
||||||
if(!burn_initialize()) {
|
if(!burn_initialize()) {
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
fprintf(stderr,"cdrskin : FATAL : Re-initialization of libburn failed\n");
|
fprintf(stderr,"cdrskin : FATAL : Re-initialization of libburn failed\n");
|
||||||
{ret= -1; goto ex;}
|
{ret= -1; goto ex;}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,"cdrskin_debug: Grabbing drive.\n"));
|
||||||
|
|
||||||
ret= Cdrskin_grab_drive(skin,1|(flag&2));/* uses burn_drive_scan_and_grab() */
|
ret= Cdrskin_grab_drive(skin,1|(flag&2));/* uses burn_drive_scan_and_grab() */
|
||||||
if(ret<=0)
|
if(ret<=0)
|
||||||
{ret=0; goto ex;}
|
{ret=0; goto ex;}
|
||||||
|
|
||||||
ret= 1;
|
ret= 1;
|
||||||
ex:
|
ex:
|
||||||
|
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,"cdrskin_debug: Restarting of libburn done. ret= %d\n",
|
||||||
|
ret));
|
||||||
|
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2651,15 +2652,28 @@ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag)
|
|||||||
restore_handler= 1;
|
restore_handler= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,
|
||||||
|
"cdrskin_debug: Trusting in abortability of grabbing process\n"));
|
||||||
|
|
||||||
#endif /* ! Cdrskin_grab_abort_brokeN */
|
#endif /* ! Cdrskin_grab_abort_brokeN */
|
||||||
|
|
||||||
#ifndef Cdrskin_oldfashioned_api_usE
|
#ifndef Cdrskin_oldfashioned_api_usE
|
||||||
|
|
||||||
|
|
||||||
if(flag&1) {
|
if(flag&1) {
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,
|
||||||
|
"cdrskin_debug: Cdrskin_grab_drive() from shutdown libburn\n"));
|
||||||
|
|
||||||
ret= burn_drive_scan_and_grab(&(skin->drives),skin->preskin->device_adr,
|
ret= burn_drive_scan_and_grab(&(skin->drives),skin->preskin->device_adr,
|
||||||
!(flag&2));
|
!(flag&2));
|
||||||
if(ret<=0) {
|
if(ret<=0) {
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,
|
||||||
|
"cdrskin_debug: burn_drive_scan_and_grab ret=%d\n",ret));
|
||||||
if(!(flag&4))
|
if(!(flag&4))
|
||||||
fprintf(stderr,"cdrskin: FATAL : unable to open drive '%s'\n",
|
fprintf(stderr,"cdrskin: FATAL : unable to open drive '%s'\n",
|
||||||
skin->preskin->device_adr);
|
skin->preskin->device_adr);
|
||||||
@ -2669,6 +2683,9 @@ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag)
|
|||||||
drive= skin->drives[skin->driveno].drive;
|
drive= skin->drives[skin->driveno].drive;
|
||||||
skin->grabbed_drive= drive;
|
skin->grabbed_drive= drive;
|
||||||
} else {
|
} else {
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,
|
||||||
|
"cdrskin_debug: Cdrskin_grab_drive() on active libburn\n"));
|
||||||
if(strlen(skin->preskin->device_adr)<=0) {
|
if(strlen(skin->preskin->device_adr)<=0) {
|
||||||
|
|
||||||
#define Cdrskin_drop_drives_by_forgeT 1
|
#define Cdrskin_drop_drives_by_forgeT 1
|
||||||
@ -2731,6 +2748,10 @@ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag)
|
|||||||
skin->driveno);
|
skin->driveno);
|
||||||
goto ex;
|
goto ex;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,
|
||||||
|
"cdrskin_debug: Trusting in burn_disc_erasable() after first grab\n"));
|
||||||
#endif /* ! Cdrskin_is_erasable_on_load_is_brokeN */
|
#endif /* ! Cdrskin_is_erasable_on_load_is_brokeN */
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -3544,9 +3565,8 @@ int Cdrskin_wait_before_action(struct CdrskiN *skin, int flag)
|
|||||||
else
|
else
|
||||||
sprintf(speed_text,"%.f",skin->x_speed);
|
sprintf(speed_text,"%.f",skin->x_speed);
|
||||||
printf(
|
printf(
|
||||||
"Starting to write CD/DVD at speed %s in %s %s mode for single session.\n",
|
"Starting to write CD/DVD at speed %s in real %s mode for single session.\n",
|
||||||
speed_text,(skin->dummy_mode?"dummy":"real"),
|
speed_text,(flag&1?"BLANK":skin->write_mode_name));
|
||||||
(flag&1?"BLANK":skin->write_mode_name));
|
|
||||||
printf("Last chance to quit, starting real write in %3d seconds.",
|
printf("Last chance to quit, starting real write in %3d seconds.",
|
||||||
skin->gracetime);
|
skin->gracetime);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
@ -3559,7 +3579,7 @@ int Cdrskin_wait_before_action(struct CdrskiN *skin, int flag)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
||||||
{printf(" Operation starts.\n");fflush(stdout);}
|
printf(" Operation starts.\n");
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3629,25 +3649,19 @@ int Cdrskin_blank(struct CdrskiN *skin, int flag)
|
|||||||
start_time= Sfile_microtime(0);
|
start_time= Sfile_microtime(0);
|
||||||
while(burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
|
while(burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
|
||||||
if(loop_counter>0)
|
if(loop_counter>0)
|
||||||
if(skin->verbosity>=Cdrskin_verbose_progresS) {
|
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
||||||
int percent= 50;
|
|
||||||
|
|
||||||
if(p.sectors>0) /* i want a display of 1 to 99 percent */
|
|
||||||
percent= 1.0+((double) p.sector+1.0)/((double) p.sectors)*98.0;
|
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\rcdrskin: blanking ( done %2d%% , %lu seconds elapsed ) ",
|
"\rcdrskin: blanking sector %d (%lu seconds elapsed) ",
|
||||||
percent,(unsigned long) (Sfile_microtime(0)-start_time));
|
p.sector,(unsigned long) (Sfile_microtime(0)-start_time));
|
||||||
}
|
sleep(2);
|
||||||
sleep(1);
|
|
||||||
loop_counter++;
|
loop_counter++;
|
||||||
}
|
}
|
||||||
blanking_done:;
|
blanking_done:;
|
||||||
skin->drive_is_busy= 0;
|
skin->drive_is_busy= 0;
|
||||||
if(skin->verbosity>=Cdrskin_verbose_progresS) {
|
if(skin->verbosity>=Cdrskin_verbose_progresS) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,"\n");
|
||||||
"\rcdrskin: blanking done \n");
|
|
||||||
printf("Blanking time: %.3fs\n",Sfile_microtime(0)-start_time);
|
printf("Blanking time: %.3fs\n",Sfile_microtime(0)-start_time);
|
||||||
fflush(stdout);
|
fprintf(stderr,"cdrskin: blanking done\n");
|
||||||
}
|
}
|
||||||
Cdrskin_release_drive(skin,0);
|
Cdrskin_release_drive(skin,0);
|
||||||
return(1);
|
return(1);
|
||||||
@ -3694,50 +3708,30 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin,
|
|||||||
current_time= Sfile_microtime(0);
|
current_time= Sfile_microtime(0);
|
||||||
elapsed_total_time= current_time-start_time;
|
elapsed_total_time= current_time-start_time;
|
||||||
elapsed_time= current_time-*last_time;
|
elapsed_time= current_time-*last_time;
|
||||||
time_to_tell= (elapsed_time>=1.0)&&(elapsed_total_time>=1.0);
|
time_to_tell= (elapsed_time>=1.0);
|
||||||
|
|
||||||
if(drive_status==BURN_DRIVE_WRITING) {
|
if(drive_status==BURN_DRIVE_WRITING) {
|
||||||
;
|
;
|
||||||
} else if(drive_status==BURN_DRIVE_WRITING_LEADIN
|
} else if(drive_status==BURN_DRIVE_WRITING_LEADIN) {
|
||||||
|
|
||||||
#ifdef Cdrskin_allow_libburn_taO
|
|
||||||
|| drive_status==BURN_DRIVE_WRITING_PREGAP
|
|
||||||
#endif
|
|
||||||
|
|
||||||
) {
|
|
||||||
if(time_to_tell || skin->is_writing) {
|
if(time_to_tell || skin->is_writing) {
|
||||||
if(skin->verbosity>=Cdrskin_verbose_progresS) {
|
if(skin->verbosity>=Cdrskin_verbose_progresS) {
|
||||||
if(skin->is_writing)
|
if(skin->is_writing)
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\rcdrskin: working pre-track (burning since %.f seconds) ",
|
"\rcdrskin: writing lead-in since %.f seconds ",
|
||||||
elapsed_total_time);
|
elapsed_total_time);
|
||||||
}
|
}
|
||||||
skin->is_writing= 0;
|
skin->is_writing= 0;
|
||||||
advance_interval= 1;
|
advance_interval= 1;
|
||||||
}
|
}
|
||||||
{ret= 2; goto ex;}
|
{ret= 2; goto ex;}
|
||||||
} else if(drive_status==BURN_DRIVE_WRITING_LEADOUT
|
} else if(drive_status==BURN_DRIVE_WRITING_LEADOUT) {
|
||||||
|
|
||||||
#ifdef Cdrskin_allow_libburn_taO
|
|
||||||
|| drive_status==BURN_DRIVE_CLOSING_TRACK
|
|
||||||
|| drive_status==BURN_DRIVE_CLOSING_SESSION
|
|
||||||
#endif
|
|
||||||
|
|
||||||
) {
|
|
||||||
|
|
||||||
#ifdef Cdrskin_allow_libburn_taO
|
|
||||||
if(drive_status==BURN_DRIVE_CLOSING_SESSION &&
|
|
||||||
skin->previous_drive_status!=drive_status)
|
|
||||||
{printf("\nFixating...\n"); fflush(stdout);}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(time_to_tell || skin->is_writing) {
|
if(time_to_tell || skin->is_writing) {
|
||||||
if(skin->verbosity>=Cdrskin_verbose_progresS) {
|
if(skin->verbosity>=Cdrskin_verbose_progresS) {
|
||||||
if(skin->is_writing)
|
if(skin->is_writing)
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\rcdrskin: working post-track (burning since %.f seconds) ",
|
"\rcdrskin: writing lead-out after %.f seconds ",
|
||||||
elapsed_total_time);
|
elapsed_total_time);
|
||||||
}
|
}
|
||||||
skin->is_writing= 0;
|
skin->is_writing= 0;
|
||||||
@ -3763,12 +3757,12 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin,
|
|||||||
|
|
||||||
if(old_track_idx>=0 && old_track_idx<skin->supposed_track_idx) {
|
if(old_track_idx>=0 && old_track_idx<skin->supposed_track_idx) {
|
||||||
Cdrtrack_get_size(skin->tracklist[old_track_idx],&fixed_size,&padding,
|
Cdrtrack_get_size(skin->tracklist[old_track_idx],&fixed_size,&padding,
|
||||||
§or_size,1);
|
§or_size,0);
|
||||||
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("%sTrack %-2.2d: Total bytes read/written: %.f/%.f (%.f sectors).\n",
|
printf("%sTrack %-2.2d: Total bytes read/written: %.f/%.f (%.f sectors).\n",
|
||||||
debug_mark,old_track_idx+1,fixed_size,fixed_size+padding,
|
debug_mark,old_track_idx+1,fixed_size,fixed_size,
|
||||||
(fixed_size+padding)/sector_size);
|
fixed_size/sector_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
sector_size= 2048.0;
|
sector_size= 2048.0;
|
||||||
@ -3783,7 +3777,7 @@ int Cdrskin_burn_pacifier(struct CdrskiN *skin,
|
|||||||
|
|
||||||
if(written_total_bytes<1024*1024) {
|
if(written_total_bytes<1024*1024) {
|
||||||
thank_you_for_patience:;
|
thank_you_for_patience:;
|
||||||
if(time_to_tell || (skin->is_writing && elapsed_total_time>=1.0)) {
|
if(time_to_tell || skin->is_writing) {
|
||||||
if(skin->verbosity>=Cdrskin_verbose_progresS) {
|
if(skin->verbosity>=Cdrskin_verbose_progresS) {
|
||||||
if(skin->is_writing)
|
if(skin->is_writing)
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
@ -3791,9 +3785,9 @@ thank_you_for_patience:;
|
|||||||
"\rcdrskin: thank you for being patient since %.f seconds ",
|
"\rcdrskin: thank you for being patient since %.f seconds ",
|
||||||
elapsed_total_time);
|
elapsed_total_time);
|
||||||
}
|
}
|
||||||
|
skin->is_writing= 0;
|
||||||
advance_interval= 1;
|
advance_interval= 1;
|
||||||
}
|
}
|
||||||
skin->is_writing= 0;
|
|
||||||
{ret= 2; goto ex;}
|
{ret= 2; goto ex;}
|
||||||
}
|
}
|
||||||
new_mb= written_total_bytes/(1024*1024);
|
new_mb= written_total_bytes/(1024*1024);
|
||||||
@ -3948,7 +3942,6 @@ ex:;
|
|||||||
*total_count= *last_count;
|
*total_count= *last_count;
|
||||||
*last_time= current_time;
|
*last_time= current_time;
|
||||||
}
|
}
|
||||||
skin->previous_drive_status= drive_status;
|
|
||||||
return(ret);
|
return(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3970,7 +3963,6 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
|
|||||||
double put_counter,get_counter,empty_counter,full_counter;
|
double put_counter,get_counter,empty_counter,full_counter;
|
||||||
double start_time,last_time;
|
double start_time,last_time;
|
||||||
double total_count= 0.0,last_count= 0.0,size,padding,sector_size= 2048.0;
|
double total_count= 0.0,last_count= 0.0,size,padding,sector_size= 2048.0;
|
||||||
double sectors;
|
|
||||||
|
|
||||||
printf("cdrskin: beginning to burn disk\n");
|
printf("cdrskin: beginning to burn disk\n");
|
||||||
|
|
||||||
@ -3993,8 +3985,7 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
Cdrtrack_get_size(skin->tracklist[i],&size,&padding,§or_size,0);
|
Cdrtrack_get_size(skin->tracklist[i],&size,&padding,§or_size,0);
|
||||||
if(size>0)
|
skin->fixed_size+= size+padding;
|
||||||
skin->fixed_size+= size+padding;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret= Cdrskin_grab_drive(skin,0);
|
ret= Cdrskin_grab_drive(skin,0);
|
||||||
@ -4050,11 +4041,8 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
|
|||||||
frac= (seconds-min*60-sec)*100;
|
frac= (seconds-min*60-sec)*100;
|
||||||
if(frac>99)
|
if(frac>99)
|
||||||
frac= 99;
|
frac= 99;
|
||||||
sectors= (int) (skin->fixed_size/sector_size);
|
|
||||||
if(sectors*sector_size != skin->fixed_size)
|
|
||||||
sectors++;
|
|
||||||
printf("Total size: %5d MB (%-2.2d:%-2.2d.%-2.2d) = %d sectors\n",
|
printf("Total size: %5d MB (%-2.2d:%-2.2d.%-2.2d) = %d sectors\n",
|
||||||
mb,min,sec,frac,(int) sectors);
|
mb,min,sec,frac,(int) (skin->fixed_size/sector_size));
|
||||||
seconds+= 2;
|
seconds+= 2;
|
||||||
min= seconds/60.0;
|
min= seconds/60.0;
|
||||||
sec= seconds-min*60;
|
sec= seconds-min*60;
|
||||||
@ -4062,7 +4050,7 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
|
|||||||
if(frac>99)
|
if(frac>99)
|
||||||
frac= 99;
|
frac= 99;
|
||||||
printf("Lout start: %5d MB (%-2.2d:%-2.2d/%-2.2d) = %d sectors\n",
|
printf("Lout start: %5d MB (%-2.2d:%-2.2d/%-2.2d) = %d sectors\n",
|
||||||
mb,min,sec,frac,(int) sectors);
|
mb,min,sec,frac,(int) (skin->fixed_size/sector_size));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4173,14 +4161,14 @@ int Cdrskin_burn(struct CdrskiN *skin, int flag)
|
|||||||
skin->drive_is_busy= 0;
|
skin->drive_is_busy= 0;
|
||||||
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
||||||
printf("\n");
|
printf("\n");
|
||||||
if(max_track<0) {
|
if(max_track<=0) {
|
||||||
printf("Track 01: Total bytes read/written: %.f/%.f (%.f sectors).\n",
|
printf("Track 01: Total bytes read/written: %.f/%.f (%.f sectors).\n",
|
||||||
total_count,total_count,total_count/sector_size);
|
total_count,total_count,total_count/sector_size);
|
||||||
} else {
|
} else {
|
||||||
Cdrtrack_get_size(skin->tracklist[max_track],&size,&padding,§or_size,1);
|
Cdrtrack_get_size(skin->tracklist[max_track],&size,&padding,§or_size,0);
|
||||||
printf(
|
printf(
|
||||||
"Track %-2.2d: Total bytes read/written: %.f/%.f (%.f sectors).\n",
|
"Track %-2.2d: Total bytes read/written: %.f/%.f (%.f sectors).\n",
|
||||||
max_track+1,size,size+padding,(size+padding)/sector_size);
|
max_track+1,size,size,size/sector_size);
|
||||||
}
|
}
|
||||||
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
if(skin->verbosity>=Cdrskin_verbose_progresS)
|
||||||
printf("Writing time: %.3fs\n",Sfile_microtime(0)-start_time);
|
printf("Writing time: %.3fs\n",Sfile_microtime(0)-start_time);
|
||||||
@ -4294,7 +4282,11 @@ int Cdrskin_eject(struct CdrskiN *skin, int flag)
|
|||||||
}
|
}
|
||||||
if(ret>0) {
|
if(ret>0) {
|
||||||
ret= Cdrskin_release_drive(skin,1);
|
ret= Cdrskin_release_drive(skin,1);
|
||||||
if(ret<=0)
|
if(ret>0) {
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,
|
||||||
|
"cdrskin_debug: supposing drive eject to have worked\n"));
|
||||||
|
} else
|
||||||
goto sorry_failed_to_eject;
|
goto sorry_failed_to_eject;
|
||||||
} else {
|
} else {
|
||||||
sorry_failed_to_eject:;
|
sorry_failed_to_eject:;
|
||||||
@ -4309,6 +4301,9 @@ sorry_failed_to_eject:;
|
|||||||
return(1);
|
return(1);
|
||||||
if(Cdrskin_grab_drive(skin,2)>0) {
|
if(Cdrskin_grab_drive(skin,2)>0) {
|
||||||
Cdrskin_release_drive(skin,1);
|
Cdrskin_release_drive(skin,1);
|
||||||
|
if(skin->verbosity>=Cdrskin_verbose_debuG)
|
||||||
|
ClN(fprintf(stderr,
|
||||||
|
"cdrskin_debug: supposing drive eject to have worked\n"));
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,"cdrskin: SORRY : Failed to finally eject tray.\n");
|
fprintf(stderr,"cdrskin: SORRY : Failed to finally eject tray.\n");
|
||||||
return(0);
|
return(0);
|
||||||
@ -4615,12 +4610,7 @@ set_driveropts:;
|
|||||||
}
|
}
|
||||||
strcpy(skin->eject_device,argv[i]+13);
|
strcpy(skin->eject_device,argv[i]+13);
|
||||||
if(skin->verbosity>=Cdrskin_verbose_cmD)
|
if(skin->verbosity>=Cdrskin_verbose_cmD)
|
||||||
#ifdef Cdrskin_burn_drive_eject_brokeN
|
|
||||||
printf("cdrskin: eject_device : %s\n",skin->eject_device);
|
printf("cdrskin: eject_device : %s\n",skin->eject_device);
|
||||||
#else
|
|
||||||
printf("cdrskin: ignoring obsolete eject_device=%s\n",
|
|
||||||
skin->eject_device);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef Cdrskin_extra_leaN
|
#ifndef Cdrskin_extra_leaN
|
||||||
@ -4738,11 +4728,7 @@ set_padsize:;
|
|||||||
printf("cdrskin: write type : RAW/RAW96R\n");
|
printf("cdrskin: write type : RAW/RAW96R\n");
|
||||||
|
|
||||||
} else if(strcmp(argv[i],"-sao")==0 || strcmp(argv[i],"-dao")==0) {
|
} else if(strcmp(argv[i],"-sao")==0 || strcmp(argv[i],"-dao")==0) {
|
||||||
|
|
||||||
#ifndef Cdrskin_allow_libburn_taO
|
|
||||||
set_sao:;
|
set_sao:;
|
||||||
#endif
|
|
||||||
|
|
||||||
strcpy(skin->write_mode_name,"SAO");
|
strcpy(skin->write_mode_name,"SAO");
|
||||||
skin->write_type= BURN_WRITE_SAO;
|
skin->write_type= BURN_WRITE_SAO;
|
||||||
skin->block_type= BURN_BLOCK_SAO;
|
skin->block_type= BURN_BLOCK_SAO;
|
||||||
@ -4779,17 +4765,6 @@ set_speed:;
|
|||||||
skin->swap_audio_bytes= 0;
|
skin->swap_audio_bytes= 0;
|
||||||
|
|
||||||
} else if(strcmp(argv[i],"-tao")==0) {
|
} else if(strcmp(argv[i],"-tao")==0) {
|
||||||
|
|
||||||
#ifdef Cdrskin_allow_libburn_taO
|
|
||||||
|
|
||||||
strcpy(skin->write_mode_name,"TAO");
|
|
||||||
skin->write_type= BURN_WRITE_TAO;
|
|
||||||
skin->block_type= BURN_BLOCK_MODE1;
|
|
||||||
if(skin->verbosity>=Cdrskin_verbose_cmD)
|
|
||||||
printf("cdrskin: write type : TAO\n");
|
|
||||||
|
|
||||||
#else /* Cdrskin_allow_libburn_taO */
|
|
||||||
|
|
||||||
if(skin->tao_to_sao_tsize<=0.0) {
|
if(skin->tao_to_sao_tsize<=0.0) {
|
||||||
fprintf(stderr,"cdrskin: FATAL : libburn does not support -tao yet.\n");
|
fprintf(stderr,"cdrskin: FATAL : libburn does not support -tao yet.\n");
|
||||||
fprintf(stderr,"cdrskin: HINT : Try option tao_to_sao_tsize=650m\n");
|
fprintf(stderr,"cdrskin: HINT : Try option tao_to_sao_tsize=650m\n");
|
||||||
@ -4798,18 +4773,12 @@ set_speed:;
|
|||||||
printf("cdrskin: NOTE : substituting mode -tao by mode -sao\n");
|
printf("cdrskin: NOTE : substituting mode -tao by mode -sao\n");
|
||||||
goto set_sao;
|
goto set_sao;
|
||||||
|
|
||||||
#endif /* ! Cdrskin_allow_libburn_taO */
|
|
||||||
|
|
||||||
} else if(strncmp(argv[i],"tao_to_sao_tsize=",17)==0) {
|
} else if(strncmp(argv[i],"tao_to_sao_tsize=",17)==0) {
|
||||||
skin->tao_to_sao_tsize= Scanf_io_size(argv[i]+17,0);
|
skin->tao_to_sao_tsize= Scanf_io_size(argv[i]+17,0);
|
||||||
if(skin->tao_to_sao_tsize>Cdrskin_tracksize_maX)
|
if(skin->tao_to_sao_tsize>Cdrskin_tracksize_maX)
|
||||||
goto track_too_large;
|
goto track_too_large;
|
||||||
if(skin->verbosity>=Cdrskin_verbose_cmD)
|
if(skin->verbosity>=Cdrskin_verbose_cmD)
|
||||||
#ifdef Cdrskin_allow_libburn_taO
|
|
||||||
printf("cdrskin: size default for non-tao write modes: %.f\n",
|
|
||||||
#else
|
|
||||||
printf("cdrskin: replace -tao by -sao with fixed size : %.f\n",
|
printf("cdrskin: replace -tao by -sao with fixed size : %.f\n",
|
||||||
#endif
|
|
||||||
skin->tao_to_sao_tsize);
|
skin->tao_to_sao_tsize);
|
||||||
|
|
||||||
} else if(strcmp(argv[i],"-toc")==0) {
|
} else if(strcmp(argv[i],"-toc")==0) {
|
||||||
@ -4853,19 +4822,16 @@ track_too_large:;
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
skin->stdin_source_used= 1;
|
skin->stdin_source_used= 1;
|
||||||
if(skin->fixed_size<=0.0) {
|
if(skin->write_type!=BURN_WRITE_TAO &&
|
||||||
if(skin->write_type==BURN_WRITE_TAO) {
|
skin->fixed_size<=0.0 && skin->tao_to_sao_tsize>0.0) {
|
||||||
/* with TAO it is ok to have an undefined track length */;
|
skin->fixed_size= skin->tao_to_sao_tsize;
|
||||||
} else if(skin->tao_to_sao_tsize>0.0) {
|
printf(
|
||||||
skin->fixed_size= skin->tao_to_sao_tsize;
|
|
||||||
printf(
|
|
||||||
"cdrskin: NOTE : augmenting non-tao write mode by tao_to_sao_tsize\n");
|
"cdrskin: NOTE : augmenting non-tao write mode by tao_to_sao_tsize\n");
|
||||||
printf("cdrskin: NOTE : fixed size : %.f\n",skin->fixed_size);
|
printf("cdrskin: NOTE : fixed size : %.f\n",skin->fixed_size);
|
||||||
} else {
|
} else if(skin->fixed_size<=0) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"cdrskin: FATAL : \"-\" (stdin) needs a fixed tsize= or tao_to_sao_tsize=\n");
|
"cdrskin: FATAL : \"-\" (stdin) needs a fixed tsize= or tao_to_sao_tsize=\n");
|
||||||
return(0);
|
return(0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if(skin->preskin->allow_fd_source==0 &&
|
} else if(skin->preskin->allow_fd_source==0 &&
|
||||||
argv[i][0]=='#' && (argv[i][1]>='0' && argv[i][1]<='9')) {
|
argv[i][0]=='#' && (argv[i][1]>='0' && argv[i][1]<='9')) {
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2006.11.04.092909"
|
#define Cdrskin_timestamP "2006.10.28.132532"
|
||||||
|
@ -1178,7 +1178,7 @@ Announced full -audio compatibility with cdrecord
|
|||||||
|
|
||||||
------------------------------------ cycled - cdrskin-0.2.3 - 2006.10.25.160540
|
------------------------------------ cycled - cdrskin-0.2.3 - 2006.10.25.160540
|
||||||
|
|
||||||
2006.10.27.114326 [319]
|
[]
|
||||||
- cdrskin/add_ts_changes_to_libburn_0_2_3
|
- cdrskin/add_ts_changes_to_libburn_0_2_3
|
||||||
+ cdrskin/add_ts_changes_to_libburn_0_2_4
|
+ cdrskin/add_ts_changes_to_libburn_0_2_4
|
||||||
cdrskin/README
|
cdrskin/README
|
||||||
@ -1186,17 +1186,11 @@ cdrskin/cdrskin.c
|
|||||||
cdrskin/cdrskin_eng.html
|
cdrskin/cdrskin_eng.html
|
||||||
cdrskin/changelog.txt
|
cdrskin/changelog.txt
|
||||||
README
|
README
|
||||||
Performed cdrskin version leap to cdrskin-0.2.4
|
Preparing cdrskin version leap to cdrskin-0.2.4
|
||||||
(To be committed to branch)
|
(To be committed to branch)
|
||||||
|
|
||||||
|
|
||||||
2006.10.28.093922 [320]
|
------------------------------------ cycle - cdrskin-0.2.5
|
||||||
cdrskin/cdrskin_timestamp.h
|
|
||||||
Set final timestamp 2006.10.28.093922
|
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ cycled - cdrskin-0.2.4 - 2006.10.28.093922
|
|
||||||
|
|
||||||
|
|
||||||
[]
|
[]
|
||||||
- cdrskin/add_ts_changes_to_libburn_0_2_3
|
- cdrskin/add_ts_changes_to_libburn_0_2_3
|
||||||
@ -1211,11 +1205,8 @@ Prepare cdrskin version leap to cdrskin-0.2.5
|
|||||||
(To be committed to trunk)
|
(To be committed to trunk)
|
||||||
|
|
||||||
|
|
||||||
------------------------------------ cycled - cdrskin-0.2.5
|
|
||||||
|
|
||||||
|
|
||||||
2006 []
|
|
||||||
(k3b_on_cdrskin.html)
|
|
||||||
|
|
||||||
2006 []
|
2006 []
|
||||||
-reset: ioctl(fd,CDROMRESET) ioctl(fd,SG_SCSI_RESET,SG_SCSI_RESET_DEVICE)
|
-reset: ioctl(fd,CDROMRESET) ioctl(fd,SG_SCSI_RESET,SG_SCSI_RESET_DEVICE)
|
||||||
|
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
debug_opts=
|
debug_opts=
|
||||||
def_opts=
|
def_opts=
|
||||||
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
|
|
||||||
libvers="-DCdrskin_libburn_0_2_3"
|
libvers="-DCdrskin_libburn_0_2_3"
|
||||||
cleanup_src_or_obj="libburn/cleanup.o"
|
cleanup_src_or_obj="libburn/cleanup.o"
|
||||||
libdax_msgs_o="libburn/libdax_msgs.o"
|
libdax_msgs_o="libburn/libdax_msgs.o"
|
||||||
@ -51,9 +50,6 @@ do
|
|||||||
elif test "$i" = "-oldfashioned"
|
elif test "$i" = "-oldfashioned"
|
||||||
then
|
then
|
||||||
def_opts="$def_opts -DCdrskin_oldfashioned_api_usE"
|
def_opts="$def_opts -DCdrskin_oldfashioned_api_usE"
|
||||||
elif test "$i" = "-no_largefile"
|
|
||||||
then
|
|
||||||
largefile_opts=
|
|
||||||
elif test "$i" = "-do_not_compile_cdrskin"
|
elif test "$i" = "-do_not_compile_cdrskin"
|
||||||
then
|
then
|
||||||
compile_cdrskin=0
|
compile_cdrskin=0
|
||||||
@ -80,7 +76,6 @@ do
|
|||||||
echo " -cvs_A60220 set macro to match libburn-CVS of 20 Feb 2006."
|
echo " -cvs_A60220 set macro to match libburn-CVS of 20 Feb 2006."
|
||||||
echo " -libburn_0_2_2 set macro to match libburn-0.2.2."
|
echo " -libburn_0_2_2 set macro to match libburn-0.2.2."
|
||||||
echo " -libburn_0_2_3 set macro to match current libburn-SVN."
|
echo " -libburn_0_2_3 set macro to match current libburn-SVN."
|
||||||
echo " -no_largefile do not use 64 bit off_t (must match libburn)."
|
|
||||||
echo " -do_not_compile_cdrskin omit compilation of cdrskin/cdrskin."
|
echo " -do_not_compile_cdrskin omit compilation of cdrskin/cdrskin."
|
||||||
echo " -experimental use newly introduced libburn features."
|
echo " -experimental use newly introduced libburn features."
|
||||||
echo " -oldfashioned use pre-0.2.2 libburn features only."
|
echo " -oldfashioned use pre-0.2.2 libburn features only."
|
||||||
@ -104,14 +99,7 @@ echo "Build timestamp : $timestamp"
|
|||||||
if test "$compile_cdrskin"
|
if test "$compile_cdrskin"
|
||||||
then
|
then
|
||||||
echo "compiling program cdrskin/cdrskin.c $static_opts $debug_opts $libvers $def_opts $cleanup_src_or_obj"
|
echo "compiling program cdrskin/cdrskin.c $static_opts $debug_opts $libvers $def_opts $cleanup_src_or_obj"
|
||||||
cc -I. \
|
cc $warn_opts -I. $static_opts $debug_opts $libvers $def_opts \
|
||||||
$warn_opts \
|
|
||||||
$static_opts \
|
|
||||||
$debug_opts \
|
|
||||||
$libvers \
|
|
||||||
$largefile_opts \
|
|
||||||
$def_opts \
|
|
||||||
\
|
|
||||||
-DCdrskin_build_timestamP='"'"$timestamp"'"' \
|
-DCdrskin_build_timestamP='"'"$timestamp"'"' \
|
||||||
\
|
\
|
||||||
-o cdrskin/cdrskin \
|
-o cdrskin/cdrskin \
|
||||||
|
@ -7,11 +7,7 @@ AC_CANONICAL_TARGET
|
|||||||
|
|
||||||
AM_INIT_AUTOMAKE([subdir-objects])
|
AM_INIT_AUTOMAKE([subdir-objects])
|
||||||
|
|
||||||
dnl A61101 This breaks Linux build (makes 32 bit off_t)
|
AM_CONFIG_HEADER(config.h)
|
||||||
dnl http://sourceware.org/autobook/autobook/autobook_96.html says
|
|
||||||
dnl one must include some config.h and this was a pitfall.
|
|
||||||
dnl So why dig the pit at all ?
|
|
||||||
dnl AM_CONFIG_HEADER(config.h)
|
|
||||||
|
|
||||||
dnl Making releases:
|
dnl Making releases:
|
||||||
dnl BURN_MICRO_VERSION += 1;
|
dnl BURN_MICRO_VERSION += 1;
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
expressing a file or stream size.
|
expressing a file or stream size.
|
||||||
|
|
||||||
XXX we should enforce 64-bitness for off_t
|
XXX we should enforce 64-bitness for off_t
|
||||||
ts A61101 : this is usually done by the build system (if it is not broken)
|
|
||||||
*/
|
*/
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
@ -217,16 +216,7 @@ enum burn_drive_status
|
|||||||
/** The drive is erasing a disc */
|
/** The drive is erasing a disc */
|
||||||
BURN_DRIVE_ERASING,
|
BURN_DRIVE_ERASING,
|
||||||
/** The drive is being grabbed */
|
/** The drive is being grabbed */
|
||||||
BURN_DRIVE_GRABBING,
|
BURN_DRIVE_GRABBING
|
||||||
|
|
||||||
/* ts A61102 */
|
|
||||||
/** The drive gets written zeroes before the track payload data */
|
|
||||||
BURN_DRIVE_WRITING_PREGAP,
|
|
||||||
/** The drive is told to close a track (TAO only) */
|
|
||||||
BURN_DRIVE_CLOSING_TRACK,
|
|
||||||
/** The drive is told to close a session (TAO only) */
|
|
||||||
BURN_DRIVE_CLOSING_SESSION
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Information about a track on a disc - this is from the q sub channel of the
|
/** Information about a track on a disc - this is from the q sub channel of the
|
||||||
@ -927,19 +917,10 @@ struct burn_source *burn_file_source_new(const char *path,
|
|||||||
*/
|
*/
|
||||||
struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size);
|
struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size);
|
||||||
|
|
||||||
/** Tells how long a track will be on disc
|
/** Tells how long a track will be on disc */
|
||||||
>>> NOTE: Not reliable with tracks of undefined length
|
|
||||||
*/
|
|
||||||
int burn_track_get_sectors(struct burn_track *);
|
int burn_track_get_sectors(struct burn_track *);
|
||||||
|
|
||||||
|
|
||||||
/* ts A61101 */
|
|
||||||
/** Tells how many source bytes have been read and how many data bytes have
|
|
||||||
been written by the track during burn */
|
|
||||||
int burn_track_get_counters(struct burn_track *t,
|
|
||||||
off_t *read_bytes, off_t *written_bytes);
|
|
||||||
|
|
||||||
|
|
||||||
/** Sets drive read and write speed
|
/** Sets drive read and write speed
|
||||||
@param d The drive to set speed for
|
@param d The drive to set speed for
|
||||||
@param read Read speed in k/s (0 is max)
|
@param read Read speed in k/s (0 is max)
|
||||||
|
@ -303,7 +303,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
|||||||
0x00020006 (FATAL,HIGH) = Too many scsi siblings
|
0x00020006 (FATAL,HIGH) = Too many scsi siblings
|
||||||
0x00020007 (NOTE,HIGH) = Closed O_EXCL scsi siblings
|
0x00020007 (NOTE,HIGH) = Closed O_EXCL scsi siblings
|
||||||
|
|
||||||
General library operations:
|
From the hunt on Assert:
|
||||||
|
|
||||||
0x00020101 (WARNING,HIGH) = Cannot find given worker item
|
0x00020101 (WARNING,HIGH) = Cannot find given worker item
|
||||||
0x00020102 (SORRY,HIGH) = A drive operation is still going on
|
0x00020102 (SORRY,HIGH) = A drive operation is still going on
|
||||||
@ -320,7 +320,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
|||||||
0x0002010c (FATAL,HIGH) = Failed to transfer command to drive
|
0x0002010c (FATAL,HIGH) = Failed to transfer command to drive
|
||||||
0x0002010d (DEBUG,HIGH) = Could not inquire TOC
|
0x0002010d (DEBUG,HIGH) = Could not inquire TOC
|
||||||
0x0002010e (FATAL,HIGH) = Attempt to read ATIP from ungrabbed drive
|
0x0002010e (FATAL,HIGH) = Attempt to read ATIP from ungrabbed drive
|
||||||
0x0002010f (DEBUG,HIGH) = SCSI error condition on command
|
0x0002010f
|
||||||
0x00020110 (FATAL,HIGH) = Persistent drive address too long
|
0x00020110 (FATAL,HIGH) = Persistent drive address too long
|
||||||
0x00020111 (FATAL,HIGH) = Could not allocate new auxiliary object
|
0x00020111 (FATAL,HIGH) = Could not allocate new auxiliary object
|
||||||
0x00020112 (SORRY,HIGH) = Bad combination of write_type and block_type
|
0x00020112 (SORRY,HIGH) = Bad combination of write_type and block_type
|
||||||
@ -329,9 +329,6 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
|||||||
0x00020115 (SORRY,HIGH) = Attempt to set track mode to unusable value
|
0x00020115 (SORRY,HIGH) = Attempt to set track mode to unusable value
|
||||||
0x00020116 (FATAL,HIGH) = Track mode has unusable value
|
0x00020116 (FATAL,HIGH) = Track mode has unusable value
|
||||||
0x00020117 (FATAL,HIGH) = toc_entry of drive is already in use
|
0x00020117 (FATAL,HIGH) = toc_entry of drive is already in use
|
||||||
0x00020118 (DEBUG,HIGH) = Closing track
|
|
||||||
0x00020119 (DEBUG,HIGH) = Closing session
|
|
||||||
0x0002011a (NOTE,HIGH) = Padding up track to minimum size
|
|
||||||
|
|
||||||
libdax_audioxtr:
|
libdax_audioxtr:
|
||||||
0x00020200 (SORRY,HIGH) = Cannot open audio source file
|
0x00020200 (SORRY,HIGH) = Cannot open audio source file
|
||||||
|
@ -20,15 +20,6 @@
|
|||||||
#include "structure.h"
|
#include "structure.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef Libburn_log_in_and_out_streaM
|
|
||||||
/* <<< ts A61031 */
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#endif /* Libburn_log_in_and_out_streaM */
|
|
||||||
|
|
||||||
|
|
||||||
/* ts A61005 */
|
/* ts A61005 */
|
||||||
#include "libdax_msgs.h"
|
#include "libdax_msgs.h"
|
||||||
extern struct libdax_msgs *libdax_messenger;
|
extern struct libdax_msgs *libdax_messenger;
|
||||||
@ -167,13 +158,14 @@ void mmc_close(struct burn_drive *d, int session, int track)
|
|||||||
|
|
||||||
mmc_function_spy("mmc_close");
|
mmc_function_spy("mmc_close");
|
||||||
|
|
||||||
|
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
|
||||||
|
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
||||||
|
"HOW THAT ? mmc_close() was called", 0, 0);
|
||||||
|
|
||||||
c.retry = 1;
|
c.retry = 1;
|
||||||
c.oplen = sizeof(MMC_CLOSE);
|
c.oplen = sizeof(MMC_CLOSE);
|
||||||
memcpy(c.opcode, MMC_CLOSE, sizeof(MMC_CLOSE));
|
memcpy(c.opcode, MMC_CLOSE, sizeof(MMC_CLOSE));
|
||||||
|
c.opcode[2] = session | !!track;
|
||||||
/* ts A61030 : shifted !!session rather than or-ing plain session */
|
|
||||||
c.opcode[2] = ((!!session)<<1) | !!track;
|
|
||||||
|
|
||||||
c.opcode[4] = track >> 8;
|
c.opcode[4] = track >> 8;
|
||||||
c.opcode[5] = track & 0xFF;
|
c.opcode[5] = track & 0xFF;
|
||||||
c.page = NULL;
|
c.page = NULL;
|
||||||
@ -238,14 +230,6 @@ int mmc_write(struct burn_drive *d, int start, struct buffer *buf)
|
|||||||
struct command c;
|
struct command c;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
#ifdef Libburn_log_in_and_out_streaM
|
|
||||||
/* <<< ts A61031 */
|
|
||||||
static int tee_fd= -1;
|
|
||||||
if(tee_fd==-1)
|
|
||||||
tee_fd= open("/tmp/libburn_sg_written",
|
|
||||||
O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR);
|
|
||||||
#endif /* Libburn_log_in_and_out_streaM */
|
|
||||||
|
|
||||||
mmc_function_spy("mmc_write");
|
mmc_function_spy("mmc_write");
|
||||||
pthread_mutex_lock(&d->access_lock);
|
pthread_mutex_lock(&d->access_lock);
|
||||||
cancelled = d->cancel;
|
cancelled = d->cancel;
|
||||||
@ -277,12 +261,7 @@ int mmc_write(struct burn_drive *d, int start, struct buffer *buf)
|
|||||||
burn_print(12, "%d, %d, %d, %d\n", c->opcode[6], c->opcode[7], c->opcode[8], c->opcode[9]);
|
burn_print(12, "%d, %d, %d, %d\n", c->opcode[6], c->opcode[7], c->opcode[8], c->opcode[9]);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef Libburn_log_in_and_out_streaM
|
/* write(fileno(stderr), c.page->data, c.page->bytes);*/
|
||||||
/* <<< ts A61031 */
|
|
||||||
if(tee_fd!=-1) {
|
|
||||||
write(tee_fd,c.page->data,len*2048);
|
|
||||||
}
|
|
||||||
#endif /* Libburn_log_in_and_out_streaM */
|
|
||||||
|
|
||||||
d->issue_command(d, &c);
|
d->issue_command(d, &c);
|
||||||
return 0;
|
return 0;
|
||||||
@ -845,7 +824,6 @@ int mmc_setup_drive(struct burn_drive *d)
|
|||||||
d->get_nwa = mmc_get_nwa;
|
d->get_nwa = mmc_get_nwa;
|
||||||
d->close_disc = mmc_close_disc;
|
d->close_disc = mmc_close_disc;
|
||||||
d->close_session = mmc_close_session;
|
d->close_session = mmc_close_session;
|
||||||
d->close_track_session = mmc_close;
|
|
||||||
d->read_buffer_capacity = mmc_read_buffer_capacity;
|
d->read_buffer_capacity = mmc_read_buffer_capacity;
|
||||||
|
|
||||||
/* ts A61020 */
|
/* ts A61020 */
|
||||||
|
@ -19,15 +19,6 @@
|
|||||||
#include "toc.h"
|
#include "toc.h"
|
||||||
#include "write.h"
|
#include "write.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef Libburn_log_in_and_out_streaM
|
|
||||||
/* <<< ts A61031 */
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#endif /* Libburn_log_in_and_out_streaM */
|
|
||||||
|
|
||||||
|
|
||||||
/*static unsigned char isrc[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";*/
|
/*static unsigned char isrc[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";*/
|
||||||
|
|
||||||
#define sector_common(X) d->alba++; d->rlba X;
|
#define sector_common(X) d->alba++; d->rlba X;
|
||||||
@ -53,8 +44,7 @@ static void uncook_subs(unsigned char *dest, unsigned char *source)
|
|||||||
int sector_get_outmode(enum burn_write_types write_type,
|
int sector_get_outmode(enum burn_write_types write_type,
|
||||||
enum burn_block_types block_type)
|
enum burn_block_types block_type)
|
||||||
{
|
{
|
||||||
/* ts A61103 : extended SAO condition to TAO */
|
if (write_type == BURN_WRITE_SAO)
|
||||||
if (write_type == BURN_WRITE_SAO || write_type == BURN_WRITE_TAO)
|
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
switch (block_type) {
|
switch (block_type) {
|
||||||
@ -91,15 +81,6 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
|
|||||||
{
|
{
|
||||||
int valid, shortage, curr, i, tr;
|
int valid, shortage, curr, i, tr;
|
||||||
|
|
||||||
#ifdef Libburn_log_in_and_out_streaM
|
|
||||||
/* <<< ts A61031 */
|
|
||||||
static int tee_fd= -1;
|
|
||||||
if(tee_fd==-1)
|
|
||||||
tee_fd= open("/tmp/libburn_sg_readin",
|
|
||||||
O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR);
|
|
||||||
#endif /* Libburn_log_in_and_out_streaM */
|
|
||||||
|
|
||||||
|
|
||||||
/* no track pointer means we're just generating 0s */
|
/* no track pointer means we're just generating 0s */
|
||||||
if (!track) {
|
if (!track) {
|
||||||
memset(data, 0, count);
|
memset(data, 0, count);
|
||||||
@ -126,18 +107,10 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
|
|||||||
valid = track->source->read(track->source, data + curr, count - curr);
|
valid = track->source->read(track->source, data + curr, count - curr);
|
||||||
} else valid = 0;
|
} else valid = 0;
|
||||||
|
|
||||||
if (valid <= 0) { /* ts A61031 : extended from (valid == -1) */
|
if (valid == -1) {
|
||||||
track->eos = 1;
|
track->eos = 1;
|
||||||
valid = 0;
|
valid = 0;
|
||||||
}
|
}
|
||||||
track->sourcecount += valid;
|
|
||||||
|
|
||||||
#ifdef Libburn_log_in_and_out_streaM
|
|
||||||
/* <<< ts A61031 */
|
|
||||||
if(tee_fd!=-1 && valid>0) {
|
|
||||||
write(tee_fd, data + curr, valid);
|
|
||||||
}
|
|
||||||
#endif /* Libburn_log_in_and_out_streaM */
|
|
||||||
|
|
||||||
curr += valid;
|
curr += valid;
|
||||||
shortage = count - curr;
|
shortage = count - curr;
|
||||||
@ -161,12 +134,6 @@ static void get_bytes(struct burn_track *track, int count, unsigned char *data)
|
|||||||
if (!shortage)
|
if (!shortage)
|
||||||
goto ex;
|
goto ex;
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
if (shortage >= count)
|
|
||||||
track->track_data_done = 1;
|
|
||||||
if (track->open_ended)
|
|
||||||
goto ex;
|
|
||||||
|
|
||||||
/* If we're still short, and there's a "next" pointer, we pull from that.
|
/* If we're still short, and there's a "next" pointer, we pull from that.
|
||||||
if that depletes, we'll just fill with 0s.
|
if that depletes, we'll just fill with 0s.
|
||||||
*/
|
*/
|
||||||
@ -185,6 +152,15 @@ ex:;
|
|||||||
if(shortage)
|
if(shortage)
|
||||||
memset(data + curr, 0, shortage); /* this is old icculus.org */
|
memset(data + curr, 0, shortage); /* this is old icculus.org */
|
||||||
if (track->swap_source_bytes == 1) {
|
if (track->swap_source_bytes == 1) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
{ static int swapping_count= 0;
|
||||||
|
fprintf(stderr,"\rlibburn_debug: swapping #%d \r",
|
||||||
|
swapping_count);
|
||||||
|
swapping_count++;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
for (i = 1; i < count; i += 2) {
|
for (i = 1; i < count; i += 2) {
|
||||||
tr = data[i];
|
tr = data[i];
|
||||||
data[i] = data[i-1];
|
data[i] = data[i-1];
|
||||||
@ -195,9 +171,7 @@ ex:;
|
|||||||
|
|
||||||
/* ts A61009 : seems to hand out sector start pointer in opts->drive->buffer
|
/* ts A61009 : seems to hand out sector start pointer in opts->drive->buffer
|
||||||
and to count hand outs as well as reserved bytes */
|
and to count hand outs as well as reserved bytes */
|
||||||
/* ts A61101 : added parameter track for counting written bytes */
|
static unsigned char *get_sector(struct burn_write_opts *opts, int inmode)
|
||||||
static unsigned char *get_sector(struct burn_write_opts *opts,
|
|
||||||
struct burn_track *track, int inmode)
|
|
||||||
{
|
{
|
||||||
struct burn_drive *d = opts->drive;
|
struct burn_drive *d = opts->drive;
|
||||||
struct buffer *out = d->buffer;
|
struct buffer *out = d->buffer;
|
||||||
@ -222,13 +196,6 @@ static unsigned char *get_sector(struct burn_write_opts *opts,
|
|||||||
err = d->write(d, d->nwa, out);
|
err = d->write(d, d->nwa, out);
|
||||||
if (err == BE_CANCELLED)
|
if (err == BE_CANCELLED)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* ts A61101 */
|
|
||||||
if(track != NULL) {
|
|
||||||
track->writecount += out->bytes;
|
|
||||||
track->written_sectors += out->sectors;
|
|
||||||
}
|
|
||||||
|
|
||||||
d->nwa += out->sectors;
|
d->nwa += out->sectors;
|
||||||
out->bytes = 0;
|
out->bytes = 0;
|
||||||
out->sectors = 0;
|
out->sectors = 0;
|
||||||
@ -241,32 +208,6 @@ static unsigned char *get_sector(struct burn_write_opts *opts,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
/* Revoke the counting of the most recent sector handed out by get_sector() */
|
|
||||||
static void unget_sector(struct burn_write_opts *opts, int inmode)
|
|
||||||
{
|
|
||||||
struct burn_drive *d = opts->drive;
|
|
||||||
struct buffer *out = d->buffer;
|
|
||||||
int outmode;
|
|
||||||
int seclen;
|
|
||||||
|
|
||||||
outmode = get_outmode(opts);
|
|
||||||
if (outmode == 0)
|
|
||||||
outmode = inmode;
|
|
||||||
|
|
||||||
/* ts A61009 : react on eventual failure of burn_sector_length()
|
|
||||||
(should not happen if API tested properly).
|
|
||||||
Ensures out->bytes >= out->sectors */
|
|
||||||
seclen = burn_sector_length(outmode);
|
|
||||||
if (seclen <= 0)
|
|
||||||
return;
|
|
||||||
seclen += burn_subcode_length(outmode);
|
|
||||||
|
|
||||||
out->bytes -= seclen;
|
|
||||||
out->sectors--;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* either inmode == outmode, or outmode == raw. anything else is bad news */
|
/* either inmode == outmode, or outmode == raw. anything else is bad news */
|
||||||
/* ts A61010 : changed type to int in order to propagate said bad news */
|
/* ts A61010 : changed type to int in order to propagate said bad news */
|
||||||
/** @return 1 is ok, <= 0 is failure */
|
/** @return 1 is ok, <= 0 is failure */
|
||||||
@ -394,7 +335,7 @@ int sector_toc(struct burn_write_opts *o, int mode)
|
|||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
unsigned char subs[96];
|
unsigned char subs[96];
|
||||||
|
|
||||||
data = get_sector(o, NULL, mode);
|
data = get_sector(o, mode);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
/* ts A61010 */
|
/* ts A61010 */
|
||||||
@ -414,7 +355,7 @@ int sector_pregap(struct burn_write_opts *o,
|
|||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
unsigned char subs[96];
|
unsigned char subs[96];
|
||||||
|
|
||||||
data = get_sector(o, NULL, mode);
|
data = get_sector(o, mode);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
/* ts A61010 */
|
/* ts A61010 */
|
||||||
@ -434,7 +375,7 @@ int sector_postgap(struct burn_write_opts *o,
|
|||||||
unsigned char subs[96];
|
unsigned char subs[96];
|
||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
|
|
||||||
data = get_sector(o, NULL, mode);
|
data = get_sector(o, mode);
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
/* ts A61010 */
|
/* ts A61010 */
|
||||||
@ -606,7 +547,7 @@ int sector_lout(struct burn_write_opts *o, unsigned char control, int mode)
|
|||||||
unsigned char subs[96];
|
unsigned char subs[96];
|
||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
|
|
||||||
data = get_sector(o, NULL, mode);
|
data = get_sector(o, mode);
|
||||||
if (!data)
|
if (!data)
|
||||||
return 0;
|
return 0;
|
||||||
/* ts A61010 */
|
/* ts A61010 */
|
||||||
@ -625,19 +566,13 @@ int sector_data(struct burn_write_opts *o, struct burn_track *t, int psub)
|
|||||||
unsigned char subs[96];
|
unsigned char subs[96];
|
||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
|
|
||||||
data = get_sector(o, t, t->mode);
|
data = get_sector(o, t->mode);
|
||||||
if (!data)
|
if (!data)
|
||||||
return 0;
|
return 0;
|
||||||
/* ts A61010 */
|
/* ts A61010 */
|
||||||
if (convert_data(o, t, t->mode, data) <= 0)
|
if (convert_data(o, t, t->mode, data) <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
if (t->open_ended && t->track_data_done) {
|
|
||||||
unget_sector(o, t->mode);
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!t->source->read_sub)
|
if (!t->source->read_sub)
|
||||||
subcode_user(o, subs, t->entry->point,
|
subcode_user(o, subs, t->entry->point,
|
||||||
t->entry->control, 1, &t->isrc, psub);
|
t->entry->control, 1, &t->isrc, psub);
|
||||||
@ -687,11 +622,6 @@ int sector_headers_is_ok(struct burn_write_opts *o, int mode)
|
|||||||
return 1;
|
return 1;
|
||||||
if (o->write_type == BURN_WRITE_SAO)
|
if (o->write_type == BURN_WRITE_SAO)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
if (o->write_type == BURN_WRITE_TAO)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
if (mode & BURN_MODE1)
|
if (mode & BURN_MODE1)
|
||||||
return 2;
|
return 2;
|
||||||
return 0;
|
return 0;
|
||||||
@ -720,11 +650,6 @@ void sector_headers(struct burn_write_opts *o, unsigned char *out,
|
|||||||
return;
|
return;
|
||||||
if (o->write_type == BURN_WRITE_SAO)
|
if (o->write_type == BURN_WRITE_SAO)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
if (o->write_type == BURN_WRITE_TAO)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (mode & BURN_MODE1)
|
if (mode & BURN_MODE1)
|
||||||
modebyte = 1;
|
modebyte = 1;
|
||||||
|
|
||||||
|
@ -481,7 +481,6 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
|
|||||||
out.get_nwa = mmc_get_nwa;
|
out.get_nwa = mmc_get_nwa;
|
||||||
out.close_disc = mmc_close_disc;
|
out.close_disc = mmc_close_disc;
|
||||||
out.close_session = mmc_close_session;
|
out.close_session = mmc_close_session;
|
||||||
out.close_track_session = mmc_close;
|
|
||||||
out.read_buffer_capacity = mmc_read_buffer_capacity;
|
out.read_buffer_capacity = mmc_read_buffer_capacity;
|
||||||
out.idata = malloc(sizeof(struct burn_scsi_inquiry_data));
|
out.idata = malloc(sizeof(struct burn_scsi_inquiry_data));
|
||||||
out.idata->valid = 0;
|
out.idata->valid = 0;
|
||||||
|
@ -585,40 +585,19 @@ int sg_release(struct burn_drive *d)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int sg_issue_command(struct burn_drive *d, struct command *c)
|
int sg_issue_command(struct burn_drive *d, struct command *c)
|
||||||
{
|
{
|
||||||
int done = 0, no_c_page = 0;
|
int done = 0, no_c_page = 0;
|
||||||
int err;
|
int err;
|
||||||
sg_io_hdr_t s;
|
sg_io_hdr_t s;
|
||||||
|
|
||||||
#ifdef Libburn_log_sg_commandS
|
/* ts A60821
|
||||||
/* <<< ts A61030 */
|
<<< debug: for tracing calls which might use open drive fds */
|
||||||
static FILE *fp= NULL;
|
|
||||||
static int fpcount= 0;
|
|
||||||
int i;
|
|
||||||
#endif /* Libburn_log_sg_commandS */
|
|
||||||
|
|
||||||
/* <<< ts A60821
|
|
||||||
debug: for tracing calls which might use open drive fds */
|
|
||||||
char buf[161];
|
char buf[161];
|
||||||
sprintf(buf,"sg_issue_command d->fd= %d d->released= %d\n",
|
sprintf(buf,"sg_issue_command d->fd= %d d->released= %d\n",
|
||||||
d->fd,d->released);
|
d->fd,d->released);
|
||||||
mmc_function_spy(buf);
|
mmc_function_spy(buf);
|
||||||
|
|
||||||
#ifdef Libburn_log_sg_commandS
|
|
||||||
/* <<< ts A61030 */
|
|
||||||
if(fp==NULL) {
|
|
||||||
fp= fopen("/tmp/libburn_sg_command_log","a");
|
|
||||||
fprintf(fp,"\n-----------------------------------------\n");
|
|
||||||
}
|
|
||||||
for(i=0;i<10;i++)
|
|
||||||
fprintf(fp,"%2.2x ", c->opcode[i]);
|
|
||||||
fprintf(fp,"\n");
|
|
||||||
fpcount++;
|
|
||||||
#endif /* Libburn_log_sg_commandS */
|
|
||||||
|
|
||||||
|
|
||||||
/* ts A61010 : with no fd there is no chance to send an ioctl */
|
/* ts A61010 : with no fd there is no chance to send an ioctl */
|
||||||
if (d->fd < 0) {
|
if (d->fd < 0) {
|
||||||
c->error = 1;
|
c->error = 1;
|
||||||
@ -691,11 +670,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||||||
if (s.sb_len_wr) {
|
if (s.sb_len_wr) {
|
||||||
if (!c->retry) {
|
if (!c->retry) {
|
||||||
c->error = 1;
|
c->error = 1;
|
||||||
|
|
||||||
/* ts A61030 */
|
|
||||||
/* >>> to become d->notify_error() */
|
|
||||||
scsi_notify_error(d, c, s.sbp, s.sb_len_wr, 0);
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
switch (scsi_error(d, s.sbp, s.sb_len_wr)) {
|
switch (scsi_error(d, s.sbp, s.sb_len_wr)) {
|
||||||
@ -714,31 +688,6 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ts A61030 */
|
|
||||||
/* @param flag bit0=do also report TEST UNIT READY failures */
|
|
||||||
int scsi_notify_error(struct burn_drive *d, struct command *c,
|
|
||||||
unsigned char *sense, int senselen, int flag)
|
|
||||||
{
|
|
||||||
int key, asc, ascq, ret;
|
|
||||||
char msg[160];
|
|
||||||
|
|
||||||
if (c->opcode[0] == 0) /* SPC : TEST UNIT READY command */
|
|
||||||
if(!(flag & 1))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
key = sense[2];
|
|
||||||
asc = sense[12];
|
|
||||||
ascq = sense[13];
|
|
||||||
|
|
||||||
sprintf(msg,"SCSI error condition on command %2.2Xh : ", c->opcode[0]);
|
|
||||||
sprintf(msg+strlen(msg), "key= %x asc= %x ascq= %x\n", key,asc,ascq);
|
|
||||||
ret = libdax_msgs_submit(libdax_messenger, d->global_index, 0x0002010f,
|
|
||||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg,0,0);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
enum response scsi_error(struct burn_drive *d, unsigned char *sense,
|
enum response scsi_error(struct burn_drive *d, unsigned char *sense,
|
||||||
int senselen)
|
int senselen)
|
||||||
{
|
{
|
||||||
|
@ -64,9 +64,5 @@ int sg_release(struct burn_drive *);
|
|||||||
int sg_issue_command(struct burn_drive *, struct command *);
|
int sg_issue_command(struct burn_drive *, struct command *);
|
||||||
enum response scsi_error(struct burn_drive *, unsigned char *, int);
|
enum response scsi_error(struct burn_drive *, unsigned char *, int);
|
||||||
|
|
||||||
/* ts A61030 */
|
|
||||||
/* @param flag bit0=do also report TEST UNIT READY failures */
|
|
||||||
int scsi_notify_error(struct burn_drive *, struct command *c,
|
|
||||||
unsigned char *sense, int senselen, int flag);
|
|
||||||
|
|
||||||
#endif /* __SG */
|
#endif /* __SG */
|
||||||
|
@ -22,10 +22,6 @@ enum burn_source_status burn_track_set_source(struct burn_track *t,
|
|||||||
return BURN_SOURCE_FAILED;
|
return BURN_SOURCE_FAILED;
|
||||||
s->refcount++;
|
s->refcount++;
|
||||||
t->source = s;
|
t->source = s;
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
t->open_ended = (s->get_size(s) <= 0);
|
|
||||||
|
|
||||||
return BURN_SOURCE_OK;
|
return BURN_SOURCE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,11 +274,6 @@ void spc_sense_write_params(struct burn_drive *d)
|
|||||||
mmc_read_disc_info(d);
|
mmc_read_disc_info(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* remark ts A61104 :
|
|
||||||
Although command MODE SELECT is SPC, the content of the
|
|
||||||
Write Parameters Mode Page (05h) is MMC (Table 108 in MMC-1).
|
|
||||||
Thus the filling of the mode page should be done by a mmc_ function.
|
|
||||||
*/
|
|
||||||
void spc_select_write_params(struct burn_drive *d,
|
void spc_select_write_params(struct burn_drive *d,
|
||||||
const struct burn_write_opts *o)
|
const struct burn_write_opts *o)
|
||||||
{
|
{
|
||||||
@ -289,13 +284,6 @@ void spc_select_write_params(struct burn_drive *d,
|
|||||||
/* ts A61007 : All current callers are safe. */
|
/* ts A61007 : All current callers are safe. */
|
||||||
/* a ssert(o->drive == d); */
|
/* a ssert(o->drive == d); */
|
||||||
|
|
||||||
/* <<< A61030
|
|
||||||
fprintf(stderr,"libburn_debug: write_type=%d multi=%d control=%d\n",
|
|
||||||
o->write_type,o->multi,o->control);
|
|
||||||
fprintf(stderr,"libburn_debug: block_type=%d spc_block_type=%d\n",
|
|
||||||
o->block_type,spc_block_type(o->block_type));
|
|
||||||
*/
|
|
||||||
|
|
||||||
memcpy(c.opcode, SPC_MODE_SELECT, sizeof(SPC_MODE_SELECT));
|
memcpy(c.opcode, SPC_MODE_SELECT, sizeof(SPC_MODE_SELECT));
|
||||||
c.retry = 1;
|
c.retry = 1;
|
||||||
c.oplen = sizeof(SPC_MODE_SELECT);
|
c.oplen = sizeof(SPC_MODE_SELECT);
|
||||||
@ -321,12 +309,6 @@ void spc_select_write_params(struct burn_drive *d,
|
|||||||
+ o->write_type;
|
+ o->write_type;
|
||||||
c.page->data[11] = (o->multi << 6) | o->control;
|
c.page->data[11] = (o->multi << 6) | o->control;
|
||||||
c.page->data[12] = spc_block_type(o->block_type);
|
c.page->data[12] = spc_block_type(o->block_type);
|
||||||
|
|
||||||
/* ts A61104 */
|
|
||||||
if(!(o->control&4)) /* audio (MMC-1 table 61) */
|
|
||||||
if(o->write_type == BURN_WRITE_TAO) /* ??? for others too ? */
|
|
||||||
c.page->data[12] = 0; /* Data Block Type: Raw Data */
|
|
||||||
|
|
||||||
c.page->data[22] = 0;
|
c.page->data[22] = 0;
|
||||||
c.page->data[23] = 150; /* audio pause length */
|
c.page->data[23] = 150; /* audio pause length */
|
||||||
/*XXX need session format! */
|
/*XXX need session format! */
|
||||||
|
@ -115,17 +115,6 @@ struct burn_track *burn_track_create(void)
|
|||||||
t->pad = 1;
|
t->pad = 1;
|
||||||
t->entry = NULL;
|
t->entry = NULL;
|
||||||
t->source = NULL;
|
t->source = NULL;
|
||||||
t->eos = 0;
|
|
||||||
|
|
||||||
/* ts A61101 */
|
|
||||||
t->sourcecount = 0;
|
|
||||||
t->writecount = 0;
|
|
||||||
t->written_sectors = 0;
|
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
t->open_ended = 0;
|
|
||||||
t->track_data_done = 0;
|
|
||||||
|
|
||||||
t->postgap = 0;
|
t->postgap = 0;
|
||||||
t->pregap1 = 0;
|
t->pregap1 = 0;
|
||||||
t->pregap2 = 0;
|
t->pregap2 = 0;
|
||||||
@ -329,31 +318,6 @@ int burn_track_get_sectors(struct burn_track *t)
|
|||||||
return sectors;
|
return sectors;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
int burn_track_is_open_ended(struct burn_track *t)
|
|
||||||
{
|
|
||||||
return !!t->open_ended;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ts A61101 : API function */
|
|
||||||
int burn_track_get_counters(struct burn_track *t,
|
|
||||||
off_t *read_bytes, off_t *written_bytes)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
fprintf(stderr, "libburn_experimental: sizeof(off_t)=%d\n",
|
|
||||||
sizeof(off_t));
|
|
||||||
*/
|
|
||||||
*read_bytes = t->sourcecount;
|
|
||||||
*written_bytes = t->writecount;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
int burn_track_is_data_done(struct burn_track *t)
|
|
||||||
{
|
|
||||||
return !!t->track_data_done;
|
|
||||||
}
|
|
||||||
|
|
||||||
int burn_track_get_shortage(struct burn_track *t)
|
int burn_track_get_shortage(struct burn_track *t)
|
||||||
{
|
{
|
||||||
int size;
|
int size;
|
||||||
|
@ -31,18 +31,6 @@ struct burn_track
|
|||||||
struct burn_source *source;
|
struct burn_source *source;
|
||||||
/** End of Source flag */
|
/** End of Source flag */
|
||||||
int eos;
|
int eos;
|
||||||
|
|
||||||
/* ts A61101 */
|
|
||||||
off_t sourcecount;
|
|
||||||
off_t writecount;
|
|
||||||
off_t written_sectors;
|
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
/** Source is of undefined length */
|
|
||||||
int open_ended;
|
|
||||||
/** End of open ended track flag : offset+payload+tail are delivered */
|
|
||||||
int track_data_done;
|
|
||||||
|
|
||||||
/** The audio/data mode for the entry. Derived from control and
|
/** The audio/data mode for the entry. Derived from control and
|
||||||
possibly from reading the track's first sector. */
|
possibly from reading the track's first sector. */
|
||||||
int mode;
|
int mode;
|
||||||
@ -83,10 +71,4 @@ struct burn_disc
|
|||||||
|
|
||||||
int burn_track_get_shortage(struct burn_track *t);
|
int burn_track_get_shortage(struct burn_track *t);
|
||||||
|
|
||||||
|
|
||||||
/* ts A61031 : might go to libburn.h */
|
|
||||||
int burn_track_is_open_ended(struct burn_track *t);
|
|
||||||
int burn_track_is_data_done(struct burn_track *t);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* BURN__STRUCTURE_H */
|
#endif /* BURN__STRUCTURE_H */
|
||||||
|
@ -189,10 +189,6 @@ struct burn_drive
|
|||||||
void (*close_disc) (struct burn_write_opts * o);
|
void (*close_disc) (struct burn_write_opts * o);
|
||||||
void (*close_session) ( struct burn_write_opts * o);
|
void (*close_session) ( struct burn_write_opts * o);
|
||||||
|
|
||||||
/* ts A61029 */
|
|
||||||
void (*close_track_session) ( struct burn_drive *d,
|
|
||||||
int session, int track);
|
|
||||||
|
|
||||||
int (*test_unit_ready) (struct burn_drive * d);
|
int (*test_unit_ready) (struct burn_drive * d);
|
||||||
void (*probe_write_modes) (struct burn_drive * d);
|
void (*probe_write_modes) (struct burn_drive * d);
|
||||||
struct params params;
|
struct params params;
|
||||||
|
@ -99,7 +99,7 @@ void type_to_form(int mode, unsigned char *ctladr, int *form)
|
|||||||
*form |= 0x40;
|
*form |= 0x40;
|
||||||
}
|
}
|
||||||
|
|
||||||
int burn_write_flush(struct burn_write_opts *o, struct burn_track *track)
|
int burn_write_flush(struct burn_write_opts *o)
|
||||||
{
|
{
|
||||||
struct burn_drive *d = o->drive;
|
struct burn_drive *d = o->drive;
|
||||||
|
|
||||||
@ -108,101 +108,13 @@ int burn_write_flush(struct burn_write_opts *o, struct burn_track *track)
|
|||||||
err = d->write(d, d->nwa, d->buffer);
|
err = d->write(d, d->nwa, d->buffer);
|
||||||
if (err == BE_CANCELLED)
|
if (err == BE_CANCELLED)
|
||||||
return 0;
|
return 0;
|
||||||
/* A61101 */
|
|
||||||
if(track != NULL) {
|
|
||||||
track->writecount += d->buffer->bytes;
|
|
||||||
track->written_sectors += d->buffer->sectors;
|
|
||||||
}
|
|
||||||
|
|
||||||
d->nwa += d->buffer->sectors;
|
d->nwa += d->buffer->sectors;
|
||||||
d->buffer->bytes = 0;
|
|
||||||
d->buffer->sectors = 0;
|
|
||||||
}
|
}
|
||||||
d->sync_cache(d);
|
d->sync_cache(d);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ts A61030 */
|
|
||||||
int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s,
|
|
||||||
int tnum)
|
|
||||||
{
|
|
||||||
char msg[81];
|
|
||||||
struct burn_drive *d;
|
|
||||||
struct burn_track *t;
|
|
||||||
int todo, step, cancelled, seclen;
|
|
||||||
|
|
||||||
d = o->drive;
|
|
||||||
t = s->track[tnum];
|
|
||||||
|
|
||||||
/* ts A61103 : pad up track to minimum size of 600 sectors */
|
|
||||||
if (t->written_sectors < 300) {
|
|
||||||
todo = 300 - t->written_sectors;
|
|
||||||
sprintf(msg,"Padding up track to minimum size (+ %d sectors)",
|
|
||||||
todo);
|
|
||||||
libdax_msgs_submit(libdax_messenger, o->drive->global_index,
|
|
||||||
0x0002011a,
|
|
||||||
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH, msg,0,0);
|
|
||||||
step = BUFFER_SIZE / 4096; /* shall fit any sector size */
|
|
||||||
if (step <= 0)
|
|
||||||
step = 1;
|
|
||||||
seclen = burn_sector_length(t->mode);
|
|
||||||
if (seclen <= 0)
|
|
||||||
seclen = 2048;
|
|
||||||
memset(d->buffer, 0, sizeof(struct buffer));
|
|
||||||
cancelled = d->cancel;
|
|
||||||
for (; todo > 0; todo -= step) {
|
|
||||||
if (step > todo)
|
|
||||||
step = todo;
|
|
||||||
d->buffer->bytes = step*seclen;
|
|
||||||
d->buffer->sectors = step;
|
|
||||||
d->cancel = 0;
|
|
||||||
d->write(d, d->nwa, d->buffer);
|
|
||||||
d->nwa += d->buffer->sectors;
|
|
||||||
t->writecount += d->buffer->bytes;
|
|
||||||
t->written_sectors += d->buffer->sectors;
|
|
||||||
}
|
|
||||||
d->cancel = cancelled;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ts A61102 */
|
|
||||||
d->busy = BURN_DRIVE_CLOSING_TRACK;
|
|
||||||
|
|
||||||
sprintf(msg, "Closing track %2.2d", tnum+1);
|
|
||||||
libdax_msgs_submit(libdax_messenger, o->drive->global_index,0x00020119,
|
|
||||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg,0,0);
|
|
||||||
|
|
||||||
/* MMC-1 mentions track number 0xFF for "the incomplete track",
|
|
||||||
MMC-3 does not. I tried both. 0xFF was in effect when other
|
|
||||||
bugs finally gave up and made way for readable tracks. */
|
|
||||||
d->close_track_session(o->drive, 0, 0xff); /* tnum+1); */
|
|
||||||
|
|
||||||
/* ts A61102 */
|
|
||||||
d->busy = BURN_DRIVE_WRITING;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ts A61030 */
|
|
||||||
int burn_write_close_session(struct burn_write_opts *o, struct burn_session *s)
|
|
||||||
{
|
|
||||||
libdax_msgs_submit(libdax_messenger, o->drive->global_index,0x00020119,
|
|
||||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
|
||||||
"Closing session", 0, 0);
|
|
||||||
|
|
||||||
/* ts A61102 */
|
|
||||||
o->drive->busy = BURN_DRIVE_CLOSING_SESSION;
|
|
||||||
|
|
||||||
o->drive->close_track_session(o->drive, 1, 0);
|
|
||||||
|
|
||||||
/* ts A61102 */
|
|
||||||
o->drive->busy = BURN_DRIVE_WRITING;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ts A60819:
|
/* ts A60819:
|
||||||
This is unused since about Feb 2006, icculus.org/burn CVS.
|
This is unused since about Feb 2006, icculus.org/burn CVS.
|
||||||
The compiler complains. We shall please our compiler.
|
The compiler complains. We shall please our compiler.
|
||||||
@ -390,17 +302,8 @@ XXX this is untested :)
|
|||||||
*/
|
*/
|
||||||
if (!tar[i]->pad) {
|
if (!tar[i]->pad) {
|
||||||
rem += burn_track_get_shortage(tar[i]);
|
rem += burn_track_get_shortage(tar[i]);
|
||||||
|
if (i +1 != ntr)
|
||||||
/* ts A61101 : I doubt that linking would yield a
|
tar[i]->source->next = tar[i+1]->source;
|
||||||
desireable effect. With TAO it is
|
|
||||||
counterproductive in any way.
|
|
||||||
*/
|
|
||||||
if (o->write_type == BURN_WRITE_TAO)
|
|
||||||
tar[i]->source->next = NULL;
|
|
||||||
else
|
|
||||||
|
|
||||||
if (i +1 != ntr)
|
|
||||||
tar[i]->source->next = tar[i+1]->source;
|
|
||||||
} else if (rem) {
|
} else if (rem) {
|
||||||
rem = 0;
|
rem = 0;
|
||||||
runtime++;
|
runtime++;
|
||||||
@ -514,7 +417,7 @@ int burn_write_session(struct burn_write_opts *o, struct burn_session *s)
|
|||||||
{
|
{
|
||||||
struct burn_drive *d = o->drive;
|
struct burn_drive *d = o->drive;
|
||||||
struct burn_track *prev = NULL, *next = NULL;
|
struct burn_track *prev = NULL, *next = NULL;
|
||||||
int i, ret;
|
int i;
|
||||||
|
|
||||||
d->rlba = 0;
|
d->rlba = 0;
|
||||||
burn_print(1, " writing a session\n");
|
burn_print(1, " writing a session\n");
|
||||||
@ -527,15 +430,9 @@ int burn_write_session(struct burn_write_opts *o, struct burn_session *s)
|
|||||||
next = NULL;
|
next = NULL;
|
||||||
|
|
||||||
if (!burn_write_track(o, s, i))
|
if (!burn_write_track(o, s, i))
|
||||||
{ ret = 0; goto ex; }
|
return 0;
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
/* ts A61103 */
|
|
||||||
ret = 1;
|
|
||||||
ex:;
|
|
||||||
if (o->write_type == BURN_WRITE_TAO)
|
|
||||||
burn_write_close_session(o, s);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
||||||
@ -543,18 +440,13 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
{
|
{
|
||||||
struct burn_track *t = s->track[tnum];
|
struct burn_track *t = s->track[tnum];
|
||||||
struct burn_drive *d = o->drive;
|
struct burn_drive *d = o->drive;
|
||||||
int i, tmp = 0, open_ended = 0, ret, nwa;
|
int i, tmp = 0;
|
||||||
int sectors;
|
int sectors;
|
||||||
char msg[80];
|
|
||||||
|
|
||||||
d->rlba = -150;
|
d->rlba = -150;
|
||||||
|
|
||||||
/* XXX for tao, we don't want the pregaps but still want post? */
|
/* XXX for tao, we don't want the pregaps but still want post? */
|
||||||
if (o->write_type != BURN_WRITE_TAO) {
|
if (o->write_type != BURN_WRITE_TAO) {
|
||||||
|
|
||||||
/* ts A61102 */
|
|
||||||
d->busy = BURN_DRIVE_WRITING_PREGAP;
|
|
||||||
|
|
||||||
if (t->pregap1)
|
if (t->pregap1)
|
||||||
d->rlba += 75;
|
d->rlba += 75;
|
||||||
if (t->pregap2)
|
if (t->pregap2)
|
||||||
@ -570,35 +462,20 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
for (i = 0; i < 75; i++)
|
for (i = 0; i < 75; i++)
|
||||||
if (!sector_pregap(o, t->entry->point,
|
if (!sector_pregap(o, t->entry->point,
|
||||||
pt->entry->control, pt->mode))
|
pt->entry->control, pt->mode))
|
||||||
{ ret = 0; goto ex; }
|
return 0;
|
||||||
}
|
}
|
||||||
if (t->pregap2)
|
if (t->pregap2)
|
||||||
for (i = 0; i < 150; i++)
|
for (i = 0; i < 150; i++)
|
||||||
if (!sector_pregap(o, t->entry->point,
|
if (!sector_pregap(o, t->entry->point,
|
||||||
t->entry->control, t->mode))
|
t->entry->control, t->mode))
|
||||||
{ ret = 0; goto ex; }
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
o->control = t->entry->control;
|
o->control = t->entry->control;
|
||||||
d->send_write_parameters(d, o);
|
d->send_write_parameters(d, o);
|
||||||
|
|
||||||
/* ts A61103 */
|
|
||||||
nwa = d->get_nwa(d);
|
|
||||||
sprintf(msg, "pre-track %2.2d : get_nwa()= %d , d->nwa= %d\n",
|
|
||||||
tnum+1, nwa, d->nwa);
|
|
||||||
libdax_msgs_submit(libdax_messenger, d->global_index, 0x000002,
|
|
||||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
|
||||||
msg,0,0);
|
|
||||||
if (nwa > d->nwa)
|
|
||||||
d->nwa = nwa;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* user data */
|
/* user data */
|
||||||
|
|
||||||
/* ts A61102 */
|
|
||||||
d->busy = BURN_DRIVE_WRITING;
|
|
||||||
|
|
||||||
sectors = burn_track_get_sectors(t);
|
sectors = burn_track_get_sectors(t);
|
||||||
open_ended = burn_track_is_open_ended(t);
|
|
||||||
|
|
||||||
/* Update progress */
|
/* Update progress */
|
||||||
d->progress.start_sector = d->nwa;
|
d->progress.start_sector = d->nwa;
|
||||||
@ -611,11 +488,10 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
|
|
||||||
burn_print(12, "track %d is %d sectors long\n", tnum, sectors);
|
burn_print(12, "track %d is %d sectors long\n", tnum, sectors);
|
||||||
|
|
||||||
/* ts A61030 : this cannot happen. tnum is alsways < s-tracks */
|
|
||||||
if (tnum == s->tracks)
|
if (tnum == s->tracks)
|
||||||
tmp = sectors > 150 ? 150 : sectors;
|
tmp = sectors > 150 ? 150 : sectors;
|
||||||
|
|
||||||
for (i = 0; open_ended || i < sectors - tmp; i++) {
|
for (i = 0; i < sectors - tmp; i++) {
|
||||||
|
|
||||||
/* ts A61023 : http://libburn.pykix.org/ticket/14
|
/* ts A61023 : http://libburn.pykix.org/ticket/14
|
||||||
From time to time inquire drive buffer */
|
From time to time inquire drive buffer */
|
||||||
@ -623,24 +499,12 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
d->read_buffer_capacity(d);
|
d->read_buffer_capacity(d);
|
||||||
|
|
||||||
if (!sector_data(o, t, 0))
|
if (!sector_data(o, t, 0))
|
||||||
{ ret = 0; goto ex; }
|
return 0;
|
||||||
|
|
||||||
/* ts A61031 */
|
|
||||||
if (open_ended) {
|
|
||||||
d->progress.sectors = sectors = i;
|
|
||||||
if (burn_track_is_data_done(t))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update current progress */
|
/* update current progress */
|
||||||
d->progress.sector++;
|
d->progress.sector++;
|
||||||
}
|
}
|
||||||
for (; i < sectors; i++) {
|
for (; i < sectors; i++) {
|
||||||
|
|
||||||
/* ts A61030: program execution never gets to this point */
|
|
||||||
fprintf(stderr,"LIBBURN_DEBUG: TNUM=%d TRACKS=%d TMP=%d\n",
|
|
||||||
tnum, s->tracks, tmp);
|
|
||||||
|
|
||||||
burn_print(1, "last track, leadout prep\n");
|
burn_print(1, "last track, leadout prep\n");
|
||||||
|
|
||||||
/* ts A61023 */
|
/* ts A61023 */
|
||||||
@ -648,7 +512,7 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
d->read_buffer_capacity(d);
|
d->read_buffer_capacity(d);
|
||||||
|
|
||||||
if (!sector_data(o, t, 1))
|
if (!sector_data(o, t, 1))
|
||||||
{ ret = 0; goto ex; }
|
return 0;
|
||||||
|
|
||||||
/* update progress */
|
/* update progress */
|
||||||
d->progress.sector++;
|
d->progress.sector++;
|
||||||
@ -658,40 +522,23 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
for (i = 0; i < 150; i++)
|
for (i = 0; i < 150; i++)
|
||||||
if (!sector_postgap(o, t->entry->point, t->entry->control,
|
if (!sector_postgap(o, t->entry->point, t->entry->control,
|
||||||
t->mode))
|
t->mode))
|
||||||
{ ret = 0; goto ex; }
|
return 0;
|
||||||
i = t->offset;
|
i = t->offset;
|
||||||
if (o->write_type == BURN_WRITE_SAO) {
|
if (o->write_type == BURN_WRITE_SAO) {
|
||||||
if (d->buffer->bytes) {
|
if (d->buffer->bytes) {
|
||||||
int err;
|
int err;
|
||||||
err = d->write(d, d->nwa, d->buffer);
|
err = d->write(d, d->nwa, d->buffer);
|
||||||
if (err == BE_CANCELLED)
|
if (err == BE_CANCELLED)
|
||||||
{ ret = 0; goto ex; }
|
return 0;
|
||||||
|
|
||||||
/* A61101 : probably this is not payload data */
|
|
||||||
/* t->writecount += d->buffer->bytes; */
|
|
||||||
|
|
||||||
d->nwa += d->buffer->sectors;
|
d->nwa += d->buffer->sectors;
|
||||||
d->buffer->bytes = 0;
|
d->buffer->bytes = 0;
|
||||||
d->buffer->sectors = 0;
|
d->buffer->sectors = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (o->write_type == BURN_WRITE_TAO)
|
||||||
/* ts A61103 */
|
if (!burn_write_flush(o))
|
||||||
ret = 1;
|
return 0;
|
||||||
ex:;
|
return 1;
|
||||||
if (o->write_type == BURN_WRITE_TAO) {
|
|
||||||
|
|
||||||
/* ts A61103 */
|
|
||||||
/* >>> if cancelled: ensure that at least 600 kB get written */
|
|
||||||
|
|
||||||
if (!burn_write_flush(o, t))
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
/* ts A61030 */
|
|
||||||
if (burn_write_close_track(o, s, tnum) <= 0)
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ts A61009 */
|
/* ts A61009 */
|
||||||
@ -722,8 +569,7 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
|
|||||||
struct buffer buf;
|
struct buffer buf;
|
||||||
struct burn_track *lt;
|
struct burn_track *lt;
|
||||||
int first = 1, i;
|
int first = 1, i;
|
||||||
int nwa;
|
int res;
|
||||||
char msg[80];
|
|
||||||
|
|
||||||
/* ts A60924 : libburn/message.c gets obsoleted
|
/* ts A60924 : libburn/message.c gets obsoleted
|
||||||
burn_message_clear_queue();
|
burn_message_clear_queue();
|
||||||
@ -740,14 +586,8 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
|
|||||||
/* Apparently some drives require this command to be sent, and a few drives
|
/* Apparently some drives require this command to be sent, and a few drives
|
||||||
return crap. so we send the command, then ignore the result.
|
return crap. so we send the command, then ignore the result.
|
||||||
*/
|
*/
|
||||||
nwa = d->get_nwa(d);
|
res = d->get_nwa(d);
|
||||||
/* >>> ts A61031 : one should not ignore the "crap" but find out
|
/* printf("ignored nwa: %d\n", res);*/
|
||||||
when and why it occurs. Multi-session will hardly
|
|
||||||
work on base of flat guessing.
|
|
||||||
*/
|
|
||||||
sprintf(msg, "Inquired nwa: %d", nwa);
|
|
||||||
libdax_msgs_submit(libdax_messenger, d->global_index, 0x00000002,
|
|
||||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO, msg,0,0);
|
|
||||||
|
|
||||||
d->alba = d->start_lba;
|
d->alba = d->start_lba;
|
||||||
d->nwa = d->alba;
|
d->nwa = d->alba;
|
||||||
@ -796,19 +636,8 @@ return crap. so we send the command, then ignore the result.
|
|||||||
goto fail;
|
goto fail;
|
||||||
} else {
|
} else {
|
||||||
if (first) {
|
if (first) {
|
||||||
|
d->nwa = -150;
|
||||||
/* ts A61030 : 0 made the burner take data. */
|
d->alba = -150;
|
||||||
/* ts A61103 : Meanwhile d->nwa is updated in
|
|
||||||
burn_write_track() */
|
|
||||||
if(o->write_type == BURN_WRITE_TAO) {
|
|
||||||
d->nwa= d->alba = 0;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
d->nwa = -150;
|
|
||||||
d->alba = -150;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
d->nwa += 4500;
|
d->nwa += 4500;
|
||||||
d->alba += 4500;
|
d->alba += 4500;
|
||||||
@ -823,13 +652,8 @@ return crap. so we send the command, then ignore the result.
|
|||||||
lt->mode))
|
lt->mode))
|
||||||
goto fail;
|
goto fail;
|
||||||
} else {
|
} else {
|
||||||
|
if (!burn_write_flush(o))
|
||||||
/* ts A61030 */
|
goto fail;
|
||||||
if (o->write_type != BURN_WRITE_TAO)
|
|
||||||
|
|
||||||
if (!burn_write_flush(o, NULL))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
d->nwa += first ? 6750 : 2250;
|
d->nwa += first ? 6750 : 2250;
|
||||||
d->alba += first ? 6750 : 2250;
|
d->alba += first ? 6750 : 2250;
|
||||||
}
|
}
|
||||||
@ -841,18 +665,15 @@ return crap. so we send the command, then ignore the result.
|
|||||||
d->progress.start_sector = 0;
|
d->progress.start_sector = 0;
|
||||||
d->progress.sectors = 0;
|
d->progress.sectors = 0;
|
||||||
}
|
}
|
||||||
|
if (o->write_type != BURN_WRITE_SAO)
|
||||||
/* ts A61030: extended skipping of flush to TAO: session is closed */
|
if (!burn_write_flush(o))
|
||||||
if (o->write_type != BURN_WRITE_SAO && o->write_type != BURN_WRITE_TAO)
|
|
||||||
if (!burn_write_flush(o, NULL))
|
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|
||||||
burn_print(1, "done\n");
|
burn_print(1, "done\n");
|
||||||
d->busy = BURN_DRIVE_IDLE;
|
d->busy = BURN_DRIVE_IDLE;
|
||||||
|
|
||||||
/* ts A61012 : This return was traditionally missing. I suspect this
|
/* ts A61012 : This return was traditionally missing, a suspect this
|
||||||
to have caused Cdrskin_eject() failures */
|
to have caused Cdrskin_eject() failures */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -24,11 +24,6 @@ int burn_write_leadout(struct burn_write_opts *o,
|
|||||||
int burn_write_session(struct burn_write_opts *o, struct burn_session *s);
|
int burn_write_session(struct burn_write_opts *o, struct burn_session *s);
|
||||||
int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
||||||
int tnum);
|
int tnum);
|
||||||
int burn_write_flush(struct burn_write_opts *o, struct burn_track *track);
|
int burn_write_flush(struct burn_write_opts *o);
|
||||||
|
|
||||||
/* ts A61030 : necessary for TAO */
|
|
||||||
int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s,
|
|
||||||
int tnum);
|
|
||||||
int burn_write_close_session(struct burn_write_opts *o,struct burn_session *s);
|
|
||||||
|
|
||||||
#endif /* BURN__WRITE_H */
|
#endif /* BURN__WRITE_H */
|
||||||
|
@ -35,10 +35,17 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* We shall prepare for times when more than 2 GB of data are to be handled.
|
||||||
|
This gives POSIX-ly 64 bit off_t */
|
||||||
|
#ifndef _LARGEFILE_SOURCE
|
||||||
|
#define _LARGEFILE_SOURCE 1
|
||||||
|
#endif
|
||||||
|
#ifndef _FILE_OFFSET_BITS
|
||||||
|
#define _FILE_OFFSET_BITS 64
|
||||||
|
#endif
|
||||||
|
|
||||||
/** See this for the decisive API specs . libburn.h is The Original */
|
/** See this for the decisive API specs . libburn.h is The Original */
|
||||||
/* For using the installed header file : #include <libburn/libburn.h> */
|
#include <libburn/libburn.h>
|
||||||
/* This program insists in the own headerfile. */
|
|
||||||
#include "../libburn/libburn.h"
|
|
||||||
|
|
||||||
/* libburn is intended for Linux systems with kernel 2.4 or 2.6 for now */
|
/* libburn is intended for Linux systems with kernel 2.4 or 2.6 for now */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -242,8 +249,7 @@ int libburner_aquire_by_driveno(int *driveno)
|
|||||||
int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
|
int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
|
||||||
{
|
{
|
||||||
enum burn_disc_status disc_state;
|
enum burn_disc_status disc_state;
|
||||||
struct burn_progress p;
|
struct burn_progress progress;
|
||||||
int percent = 1;
|
|
||||||
|
|
||||||
while (burn_drive_get_status(drive, NULL) != BURN_DRIVE_IDLE)
|
while (burn_drive_get_status(drive, NULL) != BURN_DRIVE_IDLE)
|
||||||
usleep(1001);
|
usleep(1001);
|
||||||
@ -275,13 +281,11 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
|
|||||||
}
|
}
|
||||||
printf(
|
printf(
|
||||||
"Beginning to %s-blank CD media.\n", (blank_fast?"fast":"full"));
|
"Beginning to %s-blank CD media.\n", (blank_fast?"fast":"full"));
|
||||||
|
printf(
|
||||||
|
"Expect some garbage sector numbers and some zeros at first.\n");
|
||||||
burn_disc_erase(drive, blank_fast);
|
burn_disc_erase(drive, blank_fast);
|
||||||
sleep(1);
|
while (burn_drive_get_status(drive, &progress) != BURN_DRIVE_IDLE) {
|
||||||
while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
|
printf("Blanking sector %d\n", progress.sector);
|
||||||
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
|
|
||||||
percent = 1.0 + ((double) p.sector+1.0)
|
|
||||||
/ ((double) p.sectors) * 98.0;
|
|
||||||
printf("Blanking ( %d%% done )\n", percent);
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
printf("Done\n");
|
printf("Done\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user