Compare commits
125 Commits
ZeroThreeZ
...
ZeroThreeF
Author | SHA1 | Date | |
---|---|---|---|
8e3af43409 | |||
aa94872110 | |||
424383170d | |||
bf1a2ad681 | |||
59111ba8c5 | |||
5b6aab575e | |||
bd529442ed | |||
33938c20eb | |||
71c490d0ae | |||
4458bb130a | |||
99172bdeb4 | |||
790c75be9c | |||
6a5e1b6bd5 | |||
49e0a6cb1a | |||
b6c7fd7478 | |||
e955d50198 | |||
794d1ee712 | |||
3b5c80e867 | |||
0c4cfdd359 | |||
f263443858 | |||
362a8faa61 | |||
2e361e50ed | |||
0ddeb01502 | |||
64ae333863 | |||
9f2c4b303d | |||
8182be7824 | |||
fa6849374a | |||
115f03cf63 | |||
b6475c3d84 | |||
afd54a1f87 | |||
4f3dd8614d | |||
7989d32834 | |||
0151358635 | |||
8c0e0a7a47 | |||
c570e4868d | |||
6ccd359c93 | |||
ca69e3f2ca | |||
d272450a70 | |||
a21c2a5138 | |||
73273b1643 | |||
4df7aa0f3b | |||
dbe2ee41ae | |||
72a2ef9f96 | |||
e639cd5bbb | |||
3ec93316e0 | |||
ff6a9fc92b | |||
636f5278ad | |||
e10bfe2d37 | |||
4da50dfad5 | |||
dc281902a5 | |||
4903bb9971 | |||
ba702bc9a8 | |||
c7804d390f | |||
9584adcc87 | |||
7154d8cb91 | |||
36b4f2ded5 | |||
1aed3f692c | |||
fdcb1a4014 | |||
384c47c710 | |||
e8d210e15f | |||
6df2745652 | |||
09b5bd2a1f | |||
67ce096aeb | |||
cad7531058 | |||
8dccb584b4 | |||
50eba7ee31 | |||
494693cc63 | |||
05623cffc4 | |||
fed2af8c69 | |||
78f1cf835d | |||
d2283a5b4e | |||
8dd8ee4b9c | |||
6dfbbdf57f | |||
d57166f64b | |||
2799fe1b44 | |||
330e0e2d5f | |||
135d9d5016 | |||
db9f4a1d04 | |||
6b8ab52854 | |||
4e93de2cd2 | |||
a769f8aa87 | |||
e0a38be97b | |||
100de7b160 | |||
9f7e5dd6dd | |||
a9ac7ae480 | |||
2e75680ed7 | |||
c02dbe4eca | |||
f3a08f6812 | |||
e876f90e6c | |||
dde52c1971 | |||
f194aa8d5d | |||
b18b889750 | |||
0aafc18ac7 | |||
fa792f6a67 | |||
53a1e99675 | |||
bda139f390 | |||
ff7028d1fc | |||
fa350edaae | |||
55e6c0ba82 | |||
f5a350f2cc | |||
c079e09860 | |||
99f8e0eec5 | |||
3aec7fdeda | |||
814d8cc83d | |||
bc694d7457 | |||
66d70075ec | |||
8f4dd8580c | |||
7dd845a83b | |||
7b024f4a72 | |||
f1215f3295 | |||
8e17806405 | |||
fb98c0390e | |||
f418c49e63 | |||
a34e872511 | |||
69a07aeec6 | |||
7addf0d5b5 | |||
a001f96b21 | |||
4a26017f2a | |||
0f48910aff | |||
c68efb346c | |||
36f287d569 | |||
4d7e28c09f | |||
c1342195f6 | |||
1fd003c1ec | |||
36d475eaf9 |
@ -101,9 +101,9 @@ test_structest_CPPFLAGS = -Ilibburn
|
|||||||
test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(THREAD_LIBS)
|
test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(THREAD_LIBS)
|
||||||
test_structest_SOURCES = test/structest.c
|
test_structest_SOURCES = test/structest.c
|
||||||
|
|
||||||
## cdrskin construction site - ts A60816
|
## cdrskin construction site - ts A60816 - A70312
|
||||||
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
|
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
|
||||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_3_0
|
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_0_3_4
|
||||||
cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(THREAD_LIBS)
|
cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(THREAD_LIBS)
|
||||||
cdrskin_cdrskin_SOURCES = cdrskin/cdrskin.c cdrskin/cdrfifo.c cdrskin/cdrfifo.h cdrskin/cdrskin_timestamp.h
|
cdrskin_cdrskin_SOURCES = cdrskin/cdrskin.c cdrskin/cdrfifo.c cdrskin/cdrfifo.h cdrskin/cdrskin_timestamp.h
|
||||||
##
|
##
|
||||||
|
26
README
26
README
@ -54,8 +54,8 @@ See README file there.
|
|||||||
Overview of libburnia.pykix.org
|
Overview of libburnia.pykix.org
|
||||||
|
|
||||||
libburnia.pykix.org is an open-source software project for reading, mastering
|
libburnia.pykix.org is an open-source software project for reading, mastering
|
||||||
and writing optical discs. For now this means only CD-R, CD-RW, DVD-RAM,
|
and writing optical discs.
|
||||||
DVD+RW, DVD-RW.
|
For now this means only CD media and all single layer DVD media except DVD+R.
|
||||||
|
|
||||||
The project comprises of several more or less interdependent parts which
|
The project comprises of several more or less interdependent parts which
|
||||||
together strive to be a usable foundation for application development.
|
together strive to be a usable foundation for application development.
|
||||||
@ -67,7 +67,7 @@ we would need : login on a development machine resp. a live OS on CD or DVD,
|
|||||||
advise from a system person about the equivalent of Linux sg or FreeBSD CAM,
|
advise from a system person about the equivalent of Linux sg or FreeBSD CAM,
|
||||||
volunteers for testing of realistic use cases.
|
volunteers for testing of realistic use cases.
|
||||||
|
|
||||||
We have a workable code base for burning CDs and overwriteable DVDs, though.
|
We have a workable code base for burning CD and most single layer DVD.
|
||||||
The burn API is quite comprehensively documented and can be used to build a
|
The burn API is quite comprehensively documented and can be used to build a
|
||||||
presentable application.
|
presentable application.
|
||||||
We have a functional binary which emulates parts of cdrecord in order to
|
We have a functional binary which emulates parts of cdrecord in order to
|
||||||
@ -79,20 +79,25 @@ The project components (list subject to growth, hopefully):
|
|||||||
- libburn is the library by which preformatted data get onto optical media.
|
- libburn is the library by which preformatted data get onto optical media.
|
||||||
It uses either /dev/sgN (e.g. on kernel 2.4 with ide-scsi) or
|
It uses either /dev/sgN (e.g. on kernel 2.4 with ide-scsi) or
|
||||||
/dev/hdX (e.g. on kernel 2.6).
|
/dev/hdX (e.g. on kernel 2.6).
|
||||||
libburn is the foundation of our cdrecord emulation.
|
libburn is the foundation of our cdrecord emulation. Its code is
|
||||||
|
independent of cdrecord. Its DVD capabilities are learned from
|
||||||
|
studying the code of dvd+rw-tools and MMC-5 specs. No code but only
|
||||||
|
the pure SCSI knowledge has been taken from dvd+rw-tools, though.
|
||||||
|
|
||||||
- libisofs is the library to pack up hard disk files and directories into a
|
- libisofs is the library to pack up hard disk files and directories into a
|
||||||
ISO 9660 disk image. This may then be brought to CD via libburn.
|
ISO 9660 disk image. This may then be brought to media via libburn.
|
||||||
libisofs is to be the foundation of our upcoming mkisofs emulation.
|
libisofs is to be the foundation of our upcoming mkisofs emulation.
|
||||||
|
|
||||||
- cdrskin is a limited cdrecord compatibility wrapper for libburn.
|
- cdrskin is a limited cdrecord compatibility wrapper for libburn.
|
||||||
Cdrecord is a powerful GPL'ed burn program included in Joerg
|
Cdrecord is a powerful GPL'ed burn program included in Joerg
|
||||||
Schilling's cdrtools. cdrskin strives to be a second source for
|
Schilling's cdrtools. cdrskin strives to be a second source for
|
||||||
the services traditionally provided by cdrecord.
|
the services traditionally provided by cdrecord. Additionally it
|
||||||
|
provides libburn's DVD capabilities, where only -sao is compatible
|
||||||
|
with cdrecord.
|
||||||
cdrskin does not contain any bytes copied from cdrecord's sources.
|
cdrskin does not contain any bytes copied from cdrecord's sources.
|
||||||
Many bytes have been copied from the message output of cdrecord
|
Many bytes have been copied from the message output of cdrecord
|
||||||
runs, though.
|
runs, though.
|
||||||
See cdrskin/README for more.
|
See cdrskin/README and man cdrskin/cdrskin.1 for more.
|
||||||
|
|
||||||
- test is a collection of application gestures and examples given by the
|
- test is a collection of application gestures and examples given by the
|
||||||
authors of the library features. The main API example for libburn
|
authors of the library features. The main API example for libburn
|
||||||
@ -185,6 +190,13 @@ Project history as far as known to me:
|
|||||||
by dvd+rw-tools' "poor man" writing facility for this class of media.
|
by dvd+rw-tools' "poor man" writing facility for this class of media.
|
||||||
Taking a bow towards Andy Polyakov.
|
Taking a bow towards Andy Polyakov.
|
||||||
|
|
||||||
|
- 11th February 2007 version 0.3.2 covers sequential DVD-RW and DVD-R with
|
||||||
|
multi-session and with DAO.
|
||||||
|
|
||||||
|
- 12th March 2007 version 0.3.4 supports DVD+R and thus covers all single layer
|
||||||
|
DVD media. Code for double layer DVD+/-R is implemented but awaits a tester
|
||||||
|
yet.
|
||||||
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
105
cdrskin/README
105
cdrskin/README
@ -26,12 +26,12 @@ following possible.
|
|||||||
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
|
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
|
||||||
Integrated sub project of libburnia.pykix.org but also published via:
|
Integrated sub project of libburnia.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.3.0.pl00.tar.gz
|
http://scdbackup.sourceforge.net/cdrskin-0.3.4.pl00.tar.gz
|
||||||
Copyright (C) 2006-2007 Thomas Schmitt
|
Copyright (C) 2006-2007 Thomas Schmitt
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
On top of libburn there is implemented cdrskin 0.3.0, a limited cdrecord
|
On top of libburn there is implemented cdrskin 0.3.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.3.0.pl00.tar.gz, take it to a directory of your choice and do:
|
Obtain cdrskin-0.3.4.pl00.tar.gz, take it to a directory of your choice and do:
|
||||||
|
|
||||||
tar xzf cdrskin-0.3.0.pl00.tar.gz
|
tar xzf cdrskin-0.3.4.pl00.tar.gz
|
||||||
cd cdrskin-0.3.0
|
cd cdrskin-0.3.4
|
||||||
|
|
||||||
Or obtain a libburnia.pykix.org SVN snapshot,
|
Or obtain a libburnia.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.3.0 or libburn then execute:
|
Within that toplevel directory of either cdrskin-0.3.4 or libburn then execute:
|
||||||
|
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
@ -143,6 +143,9 @@ It is not checked for the necessary degree of hacker safety.
|
|||||||
|
|
||||||
Usage examples
|
Usage examples
|
||||||
|
|
||||||
|
For options and recordable media classes see
|
||||||
|
man 1 cdrskin
|
||||||
|
|
||||||
Get an overview of cdrecord style addresses of available devices
|
Get an overview of cdrecord style addresses of available devices
|
||||||
cdrskin -scanbus
|
cdrskin -scanbus
|
||||||
cdrskin dev=ATA -scanbus
|
cdrskin dev=ATA -scanbus
|
||||||
@ -158,24 +161,34 @@ Obtain some info about the drive
|
|||||||
Obtain some info about the drive and the inserted media
|
Obtain some info about the drive and the inserted media
|
||||||
cdrskin dev=0,1,0 -atip -v
|
cdrskin dev=0,1,0 -atip -v
|
||||||
|
|
||||||
Thoroughly blank a CD-RW
|
Make used CD-RW or used unformatted DVD-RW writeable again
|
||||||
cdrskin -v dev=0,1,0 blank=all -eject
|
|
||||||
|
|
||||||
Format DVD-RW before first use with cdrskin
|
|
||||||
cdrskin -v dev=0,1,0 blank=format_overwrite
|
|
||||||
|
|
||||||
Blank CD-RW sufficiently for making it ready for overwrite
|
|
||||||
cdrskin -v dev=0,1,0 blank=fast -eject
|
cdrskin -v dev=0,1,0 blank=fast -eject
|
||||||
|
|
||||||
Burn image file my_image.iso to CD-R, CD-RW, DVD+RW, DVD-RAM, DVD-RW
|
Format DVD-RW to avoid need for blanking before re-use
|
||||||
|
cdrskin -v dev=0,1,0 blank=format_overwrite
|
||||||
|
|
||||||
|
De-format DVD-RW to make it capable of multi-session again
|
||||||
|
cdrskin -v dev=/dev/sr0 blank=deformat_sequential
|
||||||
|
|
||||||
|
Burn image file my_image.iso to media
|
||||||
cdrskin -v dev=0,1,0 speed=12 fs=8m driveropts=burnfree padsize=300k \
|
cdrskin -v dev=0,1,0 speed=12 fs=8m driveropts=burnfree padsize=300k \
|
||||||
-eject my_image.iso
|
-eject my_image.iso
|
||||||
|
|
||||||
Burn a compressed afio archive to any of the above media types on-the-fly
|
Write multi-session to the same CD , DVD-R[W] or DVD+R
|
||||||
|
cdrskin dev=/dev/hdc padsize=300k -multi 1.iso
|
||||||
|
cdrskin dev=/dev/hdc padsize=300k -multi -tao 2.iso
|
||||||
|
cdrskin dev=/dev/hdc padsize=300k -multi -tao 3.iso
|
||||||
|
cdrskin dev=/dev/hdc padsize=300k -tao 4.iso
|
||||||
|
|
||||||
|
Get multi-session info for option -C of program mkisofs:
|
||||||
|
c_values=$(cdrskin dev=/dev/hdc -msinfo 2>/dev/null)
|
||||||
|
mkisofs ... -C "$c_values" ...
|
||||||
|
|
||||||
|
Burn a compressed afio archive to media on-the-fly
|
||||||
find . | afio -oZ - | cdrskin -v dev=0,1,0 fs=32m speed=8 -tao \
|
find . | afio -oZ - | cdrskin -v dev=0,1,0 fs=32m speed=8 -tao \
|
||||||
driveropts=burnfree padsize=300k -
|
driveropts=burnfree padsize=300k -
|
||||||
|
|
||||||
Burn 6 audio tracks from files with different formats to CD.
|
Burn 6 audio tracks from files with different formats to CD (not to any DVD).
|
||||||
Anything except .wav or .au files has to be converted into raw format first.
|
Anything except .wav or .au files has to be converted into raw format first.
|
||||||
See below "Audio CD" for specifications.
|
See below "Audio CD" for specifications.
|
||||||
ogg123 -d raw -f track01.cd /path/to/track1.ogg
|
ogg123 -d raw -f track01.cd /path/to/track1.ogg
|
||||||
@ -210,13 +223,11 @@ Run a backup :
|
|||||||
|
|
||||||
Restrictions
|
Restrictions
|
||||||
|
|
||||||
The major restrictions are lifted now: audio, TAO, multi-session do work.
|
Many cdrecord options are still unsupported.
|
||||||
|
|
||||||
Many cdrecord options are still unsupported, though.
|
|
||||||
If you have use cases for them, please report your wishes and expectations.
|
If you have use cases for them, please report your wishes and expectations.
|
||||||
|
|
||||||
DVD support is restricted to single layer overwriteable DVD (-RAM, +RW, -RW)
|
DVD support is restricted to single layer DVD for now. Double layer media
|
||||||
for now.
|
are implemented but untested.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -231,9 +242,6 @@ Do not bother Joerg Schilling with any cdrskin problems.
|
|||||||
cdrskin does not contain any bytes copied from cdrecord's sources. Many bytes
|
cdrskin does not contain any bytes copied from cdrecord's sources. Many bytes
|
||||||
have been copied from the message output of cdrecord runs, though. I am
|
have been copied from the message output of cdrecord runs, though. I am
|
||||||
thankful to Joerg Schilling for every single one of them.
|
thankful to Joerg Schilling for every single one of them.
|
||||||
|
|
||||||
Actually i, Thomas Schmitt, am a devoted user of cdrecord via my project
|
|
||||||
scdbackup which still runs a bit better with cdrecord than with cdrskin. TAO.
|
|
||||||
I have the hope that Joerg feels more flattered than annoyed by cdrskin.
|
I have the hope that Joerg feels more flattered than annoyed by cdrskin.
|
||||||
|
|
||||||
Many thanks to Andy Polyakov for his dvd+rw-tools
|
Many thanks to Andy Polyakov for his dvd+rw-tools
|
||||||
@ -407,22 +415,36 @@ into the format of the burned data. Be advised to use growisofs for the
|
|||||||
task of maintaining extendable ISO-Filesystems on DVD+RW.
|
task of maintaining extendable ISO-Filesystems on DVD+RW.
|
||||||
|
|
||||||
|
|
||||||
DVD-RW
|
DVD-RW and DVD-R
|
||||||
|
|
||||||
|
DVD-RW are usable if formatted to state "Restricted Overwrite" or if in state
|
||||||
|
"Sequential Recording". DVD-R are always in sequential state.
|
||||||
|
|
||||||
DVD-RW are usable if formatted to state "Restricted Overwrite". They then
|
|
||||||
behave much like DVD+RW. See above.
|
|
||||||
DVD-RW in state "Sequential" have first to be formatted by
|
|
||||||
cdrskin dev=... -v blank=format_overwrite
|
|
||||||
"Sequential" is the state of unused media and of media previously blanked
|
"Sequential" is the state of unused media and of media previously blanked
|
||||||
or written by cdrecord. dvd+rw-format -blank can also achieve this state.
|
or written by cdrecord. dvd+rw-format -blank can also achieve this state.
|
||||||
(Command dvd+rw-format -force can achieve "Restricted Overwrite".)
|
The according cdrskin option is blank=deformat_sequential .
|
||||||
|
If "Incremental Streaming" is available, then sequential media are capable
|
||||||
|
of multi-session like CD-R[W]. (But not capable of -audio recording.)
|
||||||
|
This means they need option -multi to stay appendable, need to be blanked
|
||||||
|
to be writeable from start, return useable info with -toc and -msinfo,
|
||||||
|
eventually perform appending automatically.
|
||||||
|
Without "Incremental Streaming" offered by the drive, only write mode DAO is
|
||||||
|
available with sequential DVD-R[W]. It only works with blank media, allows only
|
||||||
|
one single track, no -multi, and demands a fixely predicted track size.
|
||||||
|
(growisofs uses it with DVD-R[W] if option -dvd-compat is given.)
|
||||||
|
|
||||||
|
Overwriteable DVD-RW behave much like DVD+RW. "Restricted" refers only to the
|
||||||
|
granularity of random access and block size which have always to be aligned to
|
||||||
|
full 32 kB. Sequential DVD-RW are converted into overwriteable DVD-RW by
|
||||||
|
cdrskin dev=... -v blank=format_overwrite
|
||||||
|
(Command dvd+rw-format -force can achieve "Restricted Overwrite", too.)
|
||||||
|
|
||||||
Formatting or first use of freshly formatted DVD-RW can produce unusual noises
|
Formatting or first use of freshly formatted DVD-RW can produce unusual noises
|
||||||
from the drive and last several minutes. Depending on mutual compatibility of
|
from the drive and last several minutes. Depending on mutual compatibility of
|
||||||
drive and media, formatting can yield unusable media. It seems that those die
|
drive and media, formatting can yield unusable media. It seems that those die
|
||||||
too on blanking by cdrecord or dvd+rw-format. Perils of DVD-RW, i fear.
|
too on blanking by cdrecord, dvd+rw-format or cdrskin. Perils of DVD-RW.
|
||||||
|
|
||||||
There are three formatting variants with cdrskin currently:
|
There are three DVD-RW formatting variants with cdrskin currently:
|
||||||
|
|
||||||
blank=format_overwrite uses "DVD-RW Quick" formatting (MMC-type 15h)
|
blank=format_overwrite uses "DVD-RW Quick" formatting (MMC-type 15h)
|
||||||
and writes a first session of 128 MB. This leads to media which are expandable
|
and writes a first session of 128 MB. This leads to media which are expandable
|
||||||
@ -431,12 +453,29 @@ and random addressable by cdrskin.
|
|||||||
blank=format_overwrite_quickest uses "DVD-RW Quick" formatting (type 15h) too,
|
blank=format_overwrite_quickest uses "DVD-RW Quick" formatting (type 15h) too,
|
||||||
but leaves the media in "intermediate" state. In the first session of writing
|
but leaves the media in "intermediate" state. In the first session of writing
|
||||||
one may only write sequentially to such a DVD. After that, it gets random
|
one may only write sequentially to such a DVD. After that, it gets random
|
||||||
addressable by cdrskin.
|
addressable by cdrskin. DVD-ROM drives might show ill behavior with them.
|
||||||
|
|
||||||
blank=format_overwrite_full uses preferrably "Full Format" (type 00h).
|
blank=format_overwrite_full uses preferrably "Full Format" (type 00h).
|
||||||
This formatting lasts as long as writing a full DVD. It includes writing of
|
This formatting lasts as long as writing a full DVD. It includes writing of
|
||||||
lead-out which is said to be good for DVD ROM compatibility.
|
lead-out which is said to be good for DVD ROM compatibility.
|
||||||
|
|
||||||
|
De-formatting options are available to make overwriteable DVD-RW sequential:
|
||||||
|
|
||||||
|
blank=deformat_sequential performs thorough blanking of all states of DVD-RW.
|
||||||
|
blank=all and blank=fast perform the same thorough blanking, but refuse to do
|
||||||
|
this with overwriteable DVD-RW, thus preserving their formatting. The specs
|
||||||
|
allow minimal blanking but the resulting media on my drives offer no
|
||||||
|
Incremental Streaming afterwards. So blank=fast will do full blanking.
|
||||||
|
|
||||||
|
blank=deformat_sequential_quickest is faster but might yield DAO-only media.
|
||||||
|
|
||||||
|
|
||||||
|
DVD+R
|
||||||
|
|
||||||
|
From the view of cdrskin they behave much like DVD-R. Each track gets wrapped
|
||||||
|
into an own session, though.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
Special compilation variations
|
Special compilation variations
|
||||||
|
|
||||||
|
226
cdrskin/add_ts_changes_to_libburn_0_3_4
Executable file
226
cdrskin/add_ts_changes_to_libburn_0_3_4
Executable file
@ -0,0 +1,226 @@
|
|||||||
|
#!/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.
|
||||||
|
#
|
||||||
|
|
||||||
|
# The top level directory in the SVN snapshot is named
|
||||||
|
intermediate="./libburn_pykix"
|
||||||
|
|
||||||
|
# libburn source used: http://libburnia.pykix.org
|
||||||
|
# Downloaded by:
|
||||||
|
# $ svn co http://libburnia-svn.pykix.org/libburn/tags/... $intermediate
|
||||||
|
# packed up in a tarball just to save it from inadverted changes by
|
||||||
|
# $ tar czf libburn_svn.tgz $intermediate
|
||||||
|
original="./libburn_svn_release.tgz"
|
||||||
|
# Historic moments:
|
||||||
|
# original="./libburn_svn_A60815.tgz"
|
||||||
|
# original="./libburn_cdrskin_A60819.tgz"
|
||||||
|
|
||||||
|
|
||||||
|
# My changes are in $changes , mainly in $changes/cdrskin
|
||||||
|
changes="./libburn-release"
|
||||||
|
|
||||||
|
skin_release="0.3.4"
|
||||||
|
patch_level=".pl00"
|
||||||
|
skin_rev="$skin_release""$patch_level"
|
||||||
|
|
||||||
|
# The result directory and the name of the result tarballs
|
||||||
|
target="./cdrskin-${skin_release}"
|
||||||
|
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"
|
||||||
|
|
||||||
|
man_to_html_cmd="./cdrskin/convert_man_to_html.sh"
|
||||||
|
man_page_html="cdrskin/man_1_cdrskin.html"
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
# Remove eventual SVN stuff from cdrskin directory
|
||||||
|
for i in .deps .dirstamp .libs
|
||||||
|
do
|
||||||
|
if test -e "$cdrskin_target"/"$i"
|
||||||
|
then
|
||||||
|
rm -rf "$cdrskin_target"/"$i"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Remove GIFs of cdrskin_eng.html
|
||||||
|
rm "$cdrskin_target"/doener_*.gif
|
||||||
|
|
||||||
|
# Remove automatically generated HTML man page
|
||||||
|
rm "$cdrskin_target"/man_1_cdrskin.html
|
||||||
|
|
||||||
|
# Remove all add_ts_changes_to_libburn besides this one
|
||||||
|
for i in "$cdrskin_target"/add_ts_changes_to_libburn*
|
||||||
|
do
|
||||||
|
if test $(basename "$0") = $(basename "$i")
|
||||||
|
then
|
||||||
|
dummy=dummy
|
||||||
|
else
|
||||||
|
rm $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
|
||||||
|
|
||||||
|
|
||||||
|
# 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, and a HTML man page
|
||||||
|
(
|
||||||
|
cd "$compile_dir" || exit 1
|
||||||
|
./configure
|
||||||
|
make
|
||||||
|
"$compile_cmd" -O2 -do_strip
|
||||||
|
cp "$compile_result" "../$bintarget_dynamic"
|
||||||
|
if test -n "$compile_static_opts"
|
||||||
|
then
|
||||||
|
"$compile_cmd" $compile_static_opts -O2 -do_strip
|
||||||
|
cp "$compile_result" "../$bintarget_static"
|
||||||
|
fi
|
||||||
|
"$man_to_html_cmd"
|
||||||
|
mv "$man_page_html" ..
|
||||||
|
)
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
ls -l $(basename "$man_page_html")
|
||||||
|
|
@ -20,26 +20,30 @@ set -x
|
|||||||
# The script is to be run in the directory above the toplevel
|
# The script is to be run in the directory above the toplevel
|
||||||
# directory of libburn resp. cdrskin development.
|
# directory of libburn resp. cdrskin development.
|
||||||
#
|
#
|
||||||
# libburn version used: http://libburn.pykix.org
|
|
||||||
|
# The top level directory in the SVN snapshot is named
|
||||||
|
intermediate="./libburn_pykix"
|
||||||
|
|
||||||
|
# libburn source used: http://libburnia.pykix.org
|
||||||
# Downloaded by:
|
# Downloaded by:
|
||||||
# $ svn co http://libburn-svn.pykix.org/libburn/trunk libburn_pykix
|
# $ svn co http://libburnia-svn.pykix.org/libburn/tags/... $intermediate
|
||||||
# packed up in a tarball just to save it from inadverted changes by
|
# packed up in a tarball just to save it from inadverted changes by
|
||||||
# $ tar czf libburn_svn.tgz libburn_pykix
|
# $ tar czf libburn_svn.tgz $intermediate
|
||||||
original="./libburn_svn.tgz"
|
original="./libburn_svn.tgz"
|
||||||
# Historic moments:
|
# Historic moments:
|
||||||
# original="./libburn_svn_A60815.tgz"
|
# original="./libburn_svn_A60815.tgz"
|
||||||
# original="./libburn_cdrskin_A60819.tgz"
|
# original="./libburn_cdrskin_A60819.tgz"
|
||||||
|
|
||||||
# The top level directory in that snapshot is named
|
|
||||||
intermediate="./libburn_pykix"
|
|
||||||
|
|
||||||
# My changes are in libburn-develop , mainly in ./cdrskin
|
|
||||||
|
|
||||||
|
# My changes are in $changes , mainly in $changes/cdrskin
|
||||||
changes="./libburn-develop"
|
changes="./libburn-develop"
|
||||||
skin_rev="0.3.0"
|
|
||||||
|
skin_release="0.3.5"
|
||||||
|
patch_level=""
|
||||||
|
skin_rev="$skin_release""$patch_level"
|
||||||
|
|
||||||
# The result directory and the name of the result tarballs
|
# The result directory and the name of the result tarballs
|
||||||
target="./cdrskin-${skin_rev}"
|
target="./cdrskin-${skin_release}"
|
||||||
cdrskin_tarball="./cdrskin-${skin_rev}.tar.gz"
|
cdrskin_tarball="./cdrskin-${skin_rev}.tar.gz"
|
||||||
cdrskin_tarball_svn="./cdrskin-${skin_rev}.svn.tar.gz"
|
cdrskin_tarball_svn="./cdrskin-${skin_rev}.svn.tar.gz"
|
||||||
|
|
||||||
@ -197,11 +201,11 @@ tar czf "$cdrskin_tarball" "$target"
|
|||||||
cd "$compile_dir" || exit 1
|
cd "$compile_dir" || exit 1
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
"$compile_cmd" -do_strip
|
"$compile_cmd" -O2 -do_strip
|
||||||
cp "$compile_result" "../$bintarget_dynamic"
|
cp "$compile_result" "../$bintarget_dynamic"
|
||||||
if test -n "$compile_static_opts"
|
if test -n "$compile_static_opts"
|
||||||
then
|
then
|
||||||
"$compile_cmd" $compile_static_opts -do_strip
|
"$compile_cmd" $compile_static_opts -O2 -do_strip
|
||||||
cp "$compile_result" "../$bintarget_static"
|
cp "$compile_result" "../$bintarget_static"
|
||||||
fi
|
fi
|
||||||
"$man_to_html_cmd"
|
"$man_to_html_cmd"
|
@ -38,7 +38,9 @@
|
|||||||
#define Cdrfifo_ffd_maX 100
|
#define Cdrfifo_ffd_maX 100
|
||||||
|
|
||||||
|
|
||||||
/* 1= enable , 0= disable status messages to stderr */
|
/* 1= enable , 0= disable status messages to stderr
|
||||||
|
2= report each
|
||||||
|
*/
|
||||||
static int Cdrfifo_debuG= 0;
|
static int Cdrfifo_debuG= 0;
|
||||||
|
|
||||||
|
|
||||||
@ -82,6 +84,8 @@ struct CdrfifO {
|
|||||||
|
|
||||||
/* index of first byte in buffer which does not belong to predecessor fd */
|
/* index of first byte in buffer which does not belong to predecessor fd */
|
||||||
int follow_up_eop[Cdrfifo_ffd_maX];
|
int follow_up_eop[Cdrfifo_ffd_maX];
|
||||||
|
/* if follow_up_eop[i]==buffer_size : read_idx was 0 when this was set */
|
||||||
|
int follow_up_was_full_buffer[Cdrfifo_ffd_maX];
|
||||||
|
|
||||||
/* index of first byte in buffer which belongs to [this] fd pair */
|
/* index of first byte in buffer which belongs to [this] fd pair */
|
||||||
int follow_up_sod[Cdrfifo_ffd_maX];
|
int follow_up_sod[Cdrfifo_ffd_maX];
|
||||||
@ -99,6 +103,9 @@ struct CdrfifO {
|
|||||||
/* (simultaneous) peer chaining */
|
/* (simultaneous) peer chaining */
|
||||||
struct CdrfifO *next;
|
struct CdrfifO *next;
|
||||||
struct CdrfifO *prev;
|
struct CdrfifO *prev;
|
||||||
|
|
||||||
|
/* rank in peer chain */
|
||||||
|
int chain_idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -155,11 +162,13 @@ int Cdrfifo_new(struct CdrfifO **ff, int source_fd, int dest_fd,
|
|||||||
for(i= 0; i<Cdrfifo_ffd_maX; i++) {
|
for(i= 0; i<Cdrfifo_ffd_maX; i++) {
|
||||||
o->follow_up_fds[i][0]= o->follow_up_fds[i][1]= -1;
|
o->follow_up_fds[i][0]= o->follow_up_fds[i][1]= -1;
|
||||||
o->follow_up_eop[i]= o->follow_up_sod[i]= -1;
|
o->follow_up_eop[i]= o->follow_up_sod[i]= -1;
|
||||||
|
o->follow_up_was_full_buffer[i]= 0;
|
||||||
o->follow_up_in_limits[i]= -1.0;
|
o->follow_up_in_limits[i]= -1.0;
|
||||||
}
|
}
|
||||||
o->follow_up_fd_counter= 0;
|
o->follow_up_fd_counter= 0;
|
||||||
o->follow_up_fd_idx= -1;
|
o->follow_up_fd_idx= -1;
|
||||||
o->next= o->prev= NULL;
|
o->next= o->prev= NULL;
|
||||||
|
o->chain_idx= 0;
|
||||||
o->buffer= TSOB_FELD(char,buffer_size);
|
o->buffer= TSOB_FELD(char,buffer_size);
|
||||||
if(o->buffer==NULL)
|
if(o->buffer==NULL)
|
||||||
goto failed;
|
goto failed;
|
||||||
@ -299,10 +308,16 @@ int Cdrfifo_attach_follow_up_fds(struct CdrfifO *o, int source_fd, int dest_fd,
|
|||||||
*/
|
*/
|
||||||
int Cdrfifo_attach_peer(struct CdrfifO *o, struct CdrfifO *next, int flag)
|
int Cdrfifo_attach_peer(struct CdrfifO *o, struct CdrfifO *next, int flag)
|
||||||
{
|
{
|
||||||
|
int idx;
|
||||||
|
struct CdrfifO *s;
|
||||||
|
|
||||||
|
for(s= o;s->prev!=NULL;s= s->prev); /* determine start of o-chain */
|
||||||
for(;o->next!=NULL;o= o->next); /* determine end of o-chain */
|
for(;o->next!=NULL;o= o->next); /* determine end of o-chain */
|
||||||
for(;next->prev!=NULL;next= next->prev); /* determine start of next-chain */
|
for(;next->prev!=NULL;next= next->prev); /* determine start of next-chain */
|
||||||
next->prev= o;
|
next->prev= o;
|
||||||
o->next= next;
|
o->next= next;
|
||||||
|
for(idx= 0;s!=NULL;s= s->next)
|
||||||
|
s->chain_idx= idx++;
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -408,10 +423,26 @@ int Cdrfifo_eop_adjust(struct CdrfifO *o,int *buffer_fill, int *eop_idx,
|
|||||||
for(i=0; i<=o->follow_up_fd_idx; i++) {
|
for(i=0; i<=o->follow_up_fd_idx; i++) {
|
||||||
if(o->follow_up_eop[i]>=0 && o->follow_up_eop[i]>=o->read_idx) {
|
if(o->follow_up_eop[i]>=0 && o->follow_up_eop[i]>=o->read_idx) {
|
||||||
eop_is_near= 1;
|
eop_is_near= 1;
|
||||||
|
if(o->follow_up_eop[i]<o->buffer_size || o->read_idx>0) {
|
||||||
valid_fill= o->follow_up_eop[i]-o->read_idx;
|
valid_fill= o->follow_up_eop[i]-o->read_idx;
|
||||||
|
o->follow_up_was_full_buffer[i]= 0;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
If an input fd change hit exactly the buffer end then follow_up_eop
|
||||||
|
points to buffer_size and not to 0. So it is time to switch output
|
||||||
|
pipes unless this is immediately after follow_up_eop was set and
|
||||||
|
read_idx was 0 (... if this is possible at all while write_idx is 0).
|
||||||
|
follow_up_was_full_buffer was set in this case and gets invalid as
|
||||||
|
soon as a non-0 read_idx is detected (see above).
|
||||||
|
*/
|
||||||
|
if(o->follow_up_was_full_buffer[i])
|
||||||
|
valid_fill= o->buffer_size;
|
||||||
|
else
|
||||||
|
valid_fill= 0; /* the current pipe is completely served */
|
||||||
|
}
|
||||||
if(valid_fill==0)
|
if(valid_fill==0)
|
||||||
*eop_idx= i;
|
*eop_idx= i;
|
||||||
else if(valid_fill<=o->chunk_size)
|
else if(valid_fill<o->chunk_size)
|
||||||
eop_is_near= 2; /* for debugging. to carry a break point */
|
eop_is_near= 2; /* for debugging. to carry a break point */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -436,7 +467,7 @@ static int Cdrfifo_setup_try(struct CdrfifO *o, struct timeval start_tv,
|
|||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
int buffer_space,buffer_fill,eop_reached= -1,eop_is_near= 0,was_closed;
|
int buffer_space,buffer_fill,eop_reached= -1,eop_is_near= 0,was_closed;
|
||||||
int fd_buffer_fill;
|
int fd_buffer_fill, eop_reached_counter= 0;
|
||||||
struct timeval current_tv;
|
struct timeval current_tv;
|
||||||
struct timezone tz;
|
struct timezone tz;
|
||||||
double diff_time,diff_counter,limit,min_wait_time;
|
double diff_time,diff_counter,limit,min_wait_time;
|
||||||
@ -465,21 +496,26 @@ setup_try:;
|
|||||||
|
|
||||||
if(eop_reached>=0) { /* switch to next output fd */
|
if(eop_reached>=0) { /* switch to next output fd */
|
||||||
o->dest_fd= o->follow_up_fds[eop_reached][1];
|
o->dest_fd= o->follow_up_fds[eop_reached][1];
|
||||||
|
if(Cdrfifo_debuG)
|
||||||
|
fprintf(stderr,"\ncdrfifo %d: new fifo destination fd : %d\n",
|
||||||
|
o->chain_idx,o->dest_fd);
|
||||||
o->read_idx= o->follow_up_sod[eop_reached];
|
o->read_idx= o->follow_up_sod[eop_reached];
|
||||||
o->follow_up_eop[eop_reached]= -1;
|
o->follow_up_eop[eop_reached]= -1;
|
||||||
eop_is_near= 0;
|
eop_is_near= 0;
|
||||||
eop_reached= -1;
|
eop_reached= -1;
|
||||||
|
eop_reached_counter= 0;
|
||||||
goto setup_try;
|
goto setup_try;
|
||||||
} else {
|
} else {
|
||||||
/* work is really done */
|
/* work is really done */
|
||||||
if((!was_closed) && ((flag&1)||Cdrfifo_debuG))
|
if((!was_closed) && ((flag&1)||Cdrfifo_debuG))
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"\ncdrfifo_debug: w=%d r=%d | b=%d s=%d | i=%.f o=%.f (done)\n",
|
"\ncdrfifo %d: w=%d r=%d | b=%d s=%d | i=%.f o=%.f (done)\n",
|
||||||
o->write_idx,o->read_idx,buffer_fill,buffer_space,
|
o->chain_idx,o->write_idx,o->read_idx,buffer_fill,buffer_space,
|
||||||
o->in_counter,o->out_counter);
|
o->in_counter,o->out_counter);
|
||||||
return(2);
|
return(2);
|
||||||
}
|
}
|
||||||
}
|
} else if(eop_reached>=0)
|
||||||
|
eop_reached_counter++;
|
||||||
if(o->interval_counter>0) {
|
if(o->interval_counter>0) {
|
||||||
if(o->total_min_fill>buffer_fill && o->source_fd>=0)
|
if(o->total_min_fill>buffer_fill && o->source_fd>=0)
|
||||||
o->total_min_fill= buffer_fill;
|
o->total_min_fill= buffer_fill;
|
||||||
@ -581,7 +617,8 @@ return: <0 = error , 0 = idle , 1 = did some work
|
|||||||
if(ret==-1) {
|
if(ret==-1) {
|
||||||
|
|
||||||
/* >>> handle broken pipe */;
|
/* >>> handle broken pipe */;
|
||||||
fprintf(stderr,"\ncdrfifo: on write: errno=%d , \"%s\"\n",errno,
|
fprintf(stderr,"\ncdrfifo %d: on write: errno=%d , \"%s\"\n",
|
||||||
|
o->chain_idx,errno,
|
||||||
errno==0?"-no error code available-":strerror(errno));
|
errno==0?"-no error code available-":strerror(errno));
|
||||||
|
|
||||||
if(!(flag&4))
|
if(!(flag&4))
|
||||||
@ -613,22 +650,31 @@ after_write:;
|
|||||||
if(ret==-1) {
|
if(ret==-1) {
|
||||||
|
|
||||||
/* >>> handle input error */;
|
/* >>> handle input error */;
|
||||||
fprintf(stderr,"\ncdrfifo: on read: errno=%d , \"%s\"\n",errno,
|
fprintf(stderr,"\ncdrfifo %d: on read: errno=%d , \"%s\"\n",
|
||||||
|
o->chain_idx,errno,
|
||||||
errno==0?"-no error code available-":strerror(errno));
|
errno==0?"-no error code available-":strerror(errno));
|
||||||
|
|
||||||
o->source_fd= -1;
|
o->source_fd= -1;
|
||||||
} else if(ret==0) { /* eof */
|
} else if(ret==0) { /* eof */
|
||||||
/* activate eventual follow-up source fd */
|
/* activate eventual follow-up source fd */
|
||||||
if(Cdrfifo_debuG || (flag&1))
|
if(Cdrfifo_debuG || (flag&1))
|
||||||
fprintf(stderr,"\ncdrfifo: on read(%d,buffer,%d): eof\n",
|
fprintf(stderr,"\ncdrfifo %d: on read(%d,buffer,%d): eof\n",
|
||||||
o->source_fd,can_read);
|
o->chain_idx,o->source_fd,can_read);
|
||||||
if(o->follow_up_fd_idx+1 < o->follow_up_fd_counter) {
|
if(o->follow_up_fd_idx+1 < o->follow_up_fd_counter) {
|
||||||
idx= ++(o->follow_up_fd_idx);
|
idx= ++(o->follow_up_fd_idx);
|
||||||
o->source_fd= o->follow_up_fds[idx][0];
|
o->source_fd= o->follow_up_fds[idx][0];
|
||||||
/* End-Of-Previous */
|
/* End-Of-Previous */
|
||||||
if(o->write_idx==0)
|
if(o->write_idx==0) {
|
||||||
o->follow_up_eop[idx]= o->buffer_size;
|
o->follow_up_eop[idx]= o->buffer_size;
|
||||||
else
|
|
||||||
|
/* A70304 : can this happen ? */
|
||||||
|
o->follow_up_was_full_buffer[idx]= (o->read_idx==0);
|
||||||
|
|
||||||
|
if(Cdrfifo_debuG || (flag&1))
|
||||||
|
fprintf(stderr,"\ncdrfifo %d: write_idx 0 on eop: read_idx= %d\n",
|
||||||
|
o->chain_idx,o->read_idx);
|
||||||
|
|
||||||
|
} else
|
||||||
o->follow_up_eop[idx]= o->write_idx;
|
o->follow_up_eop[idx]= o->write_idx;
|
||||||
/* Start-Of-Data . Try to start at next full chunk */
|
/* Start-Of-Data . Try to start at next full chunk */
|
||||||
sod= o->write_idx;
|
sod= o->write_idx;
|
||||||
@ -644,7 +690,8 @@ after_write:;
|
|||||||
o->fd_in_counter= 0;
|
o->fd_in_counter= 0;
|
||||||
o->fd_in_limit= o->follow_up_in_limits[idx];
|
o->fd_in_limit= o->follow_up_in_limits[idx];
|
||||||
if(Cdrfifo_debuG || (flag&1))
|
if(Cdrfifo_debuG || (flag&1))
|
||||||
fprintf(stderr,"\ncdrfio: new fifo source fd : %d\n",o->source_fd);
|
fprintf(stderr,"\ncdrfifo %d: new fifo source fd : %d\n",
|
||||||
|
o->chain_idx,o->source_fd);
|
||||||
} else {
|
} else {
|
||||||
o->source_fd= -1;
|
o->source_fd= -1;
|
||||||
}
|
}
|
||||||
@ -777,13 +824,13 @@ ex:;
|
|||||||
} else
|
} else
|
||||||
elapsed= wait_usec;
|
elapsed= wait_usec;
|
||||||
if(elapsed>=wait_usec) {
|
if(elapsed>=wait_usec) {
|
||||||
if((flag&1)||Cdrfifo_debuG) {
|
if((flag&1)||Cdrfifo_debuG>=2) {
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
for(ff= o; ff!=NULL; ff= ff->next) {
|
for(ff= o; ff!=NULL; ff= ff->next) {
|
||||||
buffer_space= Cdrfifo_tell_buffer_space(ff,0);
|
buffer_space= Cdrfifo_tell_buffer_space(ff,0);
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"cdrfifo_debug: w=%d r=%d | b=%d s=%d | i=%.f o=%.f\n",
|
"cdrfifo %d: w=%d r=%d | b=%d s=%d | i=%.f o=%.f\n",
|
||||||
ff->write_idx,ff->read_idx,
|
ff->chain_idx,ff->write_idx,ff->read_idx,
|
||||||
ff->buffer_size-buffer_space,buffer_space,
|
ff->buffer_size-buffer_space,buffer_space,
|
||||||
ff->in_counter,ff->out_counter);
|
ff->in_counter,ff->out_counter);
|
||||||
}
|
}
|
||||||
@ -875,6 +922,76 @@ double Scanf_io_size(char *text, int flag)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* This is a hardcoded test mock-up for two simultaneous fifos of which the
|
||||||
|
one runs with block size 2048 and feeds the other which runs with 2352.
|
||||||
|
Both fifos have the same number of follow_up pipes (tracks) which shall
|
||||||
|
be connected 1-to-1.
|
||||||
|
*/
|
||||||
|
int Test_mixed_bs(char **paths, int path_count,
|
||||||
|
int fs_size, double speed_limit, double interval, int flag)
|
||||||
|
/*
|
||||||
|
bit0= debugging verbousity
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
int fd_in[100],fd_out[100],ret,pipe_fds[100][2],real_out[100];
|
||||||
|
int i,iv,stall_counter= 0,cycle_counter= 0.0;
|
||||||
|
char buf[10240], target_path[80];
|
||||||
|
double in_counter, out_counter, prev_in= -1.0, prev_out= -1.0;
|
||||||
|
struct CdrfifO *ff_in= NULL, *ff_out= NULL;
|
||||||
|
|
||||||
|
if(path_count<1)
|
||||||
|
return(2);
|
||||||
|
Cdrfifo_new(&ff_in,fd_in[0],fd_out[0],2048,fs_size,0);
|
||||||
|
for(i= 0; i<path_count; i++) {
|
||||||
|
fd_in[2*i]= open(paths[i],O_RDONLY);
|
||||||
|
if(fd_in[2*i]==-1)
|
||||||
|
return(0);
|
||||||
|
if(pipe(pipe_fds[2*i])==-1)
|
||||||
|
return(-1);
|
||||||
|
fd_out[2*i]= pipe_fds[2*i][1];
|
||||||
|
if(i==0)
|
||||||
|
ret= Cdrfifo_new(&ff_in,fd_in[2*i],fd_out[2*i],2048,fs_size,0);
|
||||||
|
else
|
||||||
|
ret= Cdrfifo_attach_follow_up_fds(ff_in,fd_in[2*i],fd_out[2*i],0);
|
||||||
|
if(ret<=0)
|
||||||
|
return(ret);
|
||||||
|
fd_in[2*i+1]= pipe_fds[2*i][0];
|
||||||
|
sprintf(target_path,"/dvdbuffer/fifo_mixed_bs_test_%d",i);
|
||||||
|
fd_out[2*i+1]= open(target_path,O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
|
||||||
|
if(i==0)
|
||||||
|
ret= Cdrfifo_new(&ff_out,fd_in[2*i+1],fd_out[2*i+1],2352,fs_size,0);
|
||||||
|
else
|
||||||
|
ret= Cdrfifo_attach_follow_up_fds(ff_out,fd_in[2*i+1],fd_out[2*i+1],0);
|
||||||
|
if(ret<=0)
|
||||||
|
return(ret);
|
||||||
|
fprintf(stderr,"test_mixed_bs: %d : %2d fifo %2d pipe %2d fifo %2d : %s\n",
|
||||||
|
i, fd_in[2*i],fd_out[2*i],fd_in[2*i+1],fd_out[2*i+1], target_path);
|
||||||
|
}
|
||||||
|
Cdrfifo_attach_peer(ff_in,ff_out,0);
|
||||||
|
|
||||||
|
|
||||||
|
/* Let the fifos work */
|
||||||
|
iv= interval*1e6;
|
||||||
|
while(1) {
|
||||||
|
ret= Cdrfifo_try_to_work(ff_in,iv,NULL,NULL,flag&1);
|
||||||
|
if(ret<0 || ret==2) { /* <0 = error , 2 = work is done */
|
||||||
|
fprintf(stderr,"\ncdrfifo %d: fifo ended work with ret=%d\n",
|
||||||
|
ff_in->chain_idx,ret);
|
||||||
|
if(ret<0)
|
||||||
|
return(-7);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cycle_counter++;
|
||||||
|
Cdrfifo_get_counters(ff_in, &in_counter, &out_counter, 0);
|
||||||
|
if(prev_in == in_counter && prev_out == out_counter)
|
||||||
|
stall_counter++;
|
||||||
|
prev_in= in_counter;
|
||||||
|
prev_out= out_counter;
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* This is a hardcoded test mock-up for two simultaneous fifos of which the
|
/* This is a hardcoded test mock-up for two simultaneous fifos of which the
|
||||||
first one simulates the cdrskin fifo feeding libburn and the second one
|
first one simulates the cdrskin fifo feeding libburn and the second one
|
||||||
simulates libburn and the burner at given speed. Both have two fd pairs
|
simulates libburn and the burner at given speed. Both have two fd pairs
|
||||||
@ -933,7 +1050,8 @@ int Test_multi(int fs_size, double speed_limit, double interval, int flag)
|
|||||||
while(1) {
|
while(1) {
|
||||||
ret= Cdrfifo_try_to_work(ff1,iv,NULL,NULL,flag&1);
|
ret= Cdrfifo_try_to_work(ff1,iv,NULL,NULL,flag&1);
|
||||||
if(ret<0 || ret==2) { /* <0 = error , 2 = work is done */
|
if(ret<0 || ret==2) { /* <0 = error , 2 = work is done */
|
||||||
fprintf(stderr,"\ncdrfifo: fifo ended work with ret=%d\n",ret);
|
fprintf(stderr,"\ncdrfifo %d: fifo ended work with ret=%d\n",
|
||||||
|
ff1->chain_idx,ret);
|
||||||
if(ret<0)
|
if(ret<0)
|
||||||
return(-7);
|
return(-7);
|
||||||
break;
|
break;
|
||||||
@ -992,6 +1110,13 @@ int main(int argc, char **argv)
|
|||||||
} else if(strncmp(argv[i],"vb=",3)==0) {
|
} else if(strncmp(argv[i],"vb=",3)==0) {
|
||||||
sscanf(argv[i]+3,"%d",&verbous);
|
sscanf(argv[i]+3,"%d",&verbous);
|
||||||
|
|
||||||
|
} else if(strcmp(argv[i],"-mixed_bs_test")==0) {
|
||||||
|
|
||||||
|
ret= Test_mixed_bs(argv+i+1,argc-i-1,
|
||||||
|
(int) fs_value,speed_limit,interval,(verbous>=2));
|
||||||
|
fprintf(stderr,"Test_mixed_bs(): ret= %d\n",ret);
|
||||||
|
exit(ret<0);
|
||||||
|
|
||||||
} else if(strcmp(argv[i],"-multi_test")==0) {
|
} else if(strcmp(argv[i],"-multi_test")==0) {
|
||||||
|
|
||||||
if(speed_limit==0.0)
|
if(speed_limit==0.0)
|
||||||
@ -1035,7 +1160,7 @@ int main(int argc, char **argv)
|
|||||||
if(speed_limit!=0.0)
|
if(speed_limit!=0.0)
|
||||||
Cdrfifo_set_speed_limit(ff,speed_limit,0);
|
Cdrfifo_set_speed_limit(ff,speed_limit,0);
|
||||||
if(fill_buffer) {
|
if(fill_buffer) {
|
||||||
ret= Cdrfifo_fill(ff,0);
|
ret= Cdrfifo_fill(ff,0,0);
|
||||||
if(ret<=0) {
|
if(ret<=0) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"cdrfifo: FATAL : initial filling of fifo buffer failed\n");
|
"cdrfifo: FATAL : initial filling of fifo buffer failed\n");
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
.\" First parameter, NAME, should be all caps
|
.\" First parameter, NAME, should be all caps
|
||||||
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||||
.\" other parameters are allowed: see man(7), man(1)
|
.\" other parameters are allowed: see man(7), man(1)
|
||||||
.TH CDRSKIN 1 "January 12, 2007"
|
.TH CDRSKIN 1 "March 6, 2007"
|
||||||
.\" Please adjust this date whenever revising the manpage.
|
.\" Please adjust this date whenever revising the manpage.
|
||||||
.\"
|
.\"
|
||||||
.\" Some roff macros, for reference:
|
.\" Some roff macros, for reference:
|
||||||
@ -16,7 +16,7 @@
|
|||||||
.\" .sp <n> insert n+1 empty lines
|
.\" .sp <n> insert n+1 empty lines
|
||||||
.\" for manpage-specific macros, see man(7)
|
.\" for manpage-specific macros, see man(7)
|
||||||
.SH NAME
|
.SH NAME
|
||||||
cdrskin \- burns preformatted data to CD-R, CD-RW, DVD+/-RW, DVD-RAM
|
cdrskin \- burns preformatted data to CD-R[W], DVD-R[W], DVD+R[W], DVD-RAM
|
||||||
via libburn.
|
via libburn.
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B cdrskin
|
.B cdrskin
|
||||||
@ -29,12 +29,12 @@ via libburn.
|
|||||||
.\" respectively.
|
.\" respectively.
|
||||||
.PP
|
.PP
|
||||||
\fBcdrskin\fP is a program that provides some of cdrecord's options
|
\fBcdrskin\fP is a program that provides some of cdrecord's options
|
||||||
in a compatible way for CD media. With DVD it has its own ways for now.
|
in a compatible way for CD media. With DVD it has its own ways.
|
||||||
You do not need to be superuser for its daily usage.
|
You do not need to be superuser for its daily usage.
|
||||||
.PP
|
.PP
|
||||||
.B Overview of features:
|
.B Overview of features:
|
||||||
.br
|
.br
|
||||||
Blanking of CD-RW.
|
Blanking of CD-RW and DVD-RW.
|
||||||
.br
|
.br
|
||||||
Burning of data or audio tracks to CD,
|
Burning of data or audio tracks to CD,
|
||||||
.br
|
.br
|
||||||
@ -42,14 +42,32 @@ either in versatile Track at Once mode (TAO)
|
|||||||
.br
|
.br
|
||||||
or in Session at Once mode for seamless tracks.
|
or in Session at Once mode for seamless tracks.
|
||||||
.br
|
.br
|
||||||
Multi session on CD (follow-up sessions in TAO only).
|
Multi session on CD (follow-up sessions in TAO only)
|
||||||
|
.br
|
||||||
|
or on DVD-R[W] (in Incremental mode) or on DVD+R.
|
||||||
|
.br
|
||||||
|
Single session on DVD-RW or DVD-R (Disk-at-once)
|
||||||
|
.br
|
||||||
|
or on overwriteable DVD+RW, DVD-RW, DVD-RAM.
|
||||||
.br
|
.br
|
||||||
Bus scan, burnfree, speed options, retrieving media info, padding, fifo.
|
Bus scan, burnfree, speed options, retrieving media info, padding, fifo.
|
||||||
.br
|
.br
|
||||||
Burning of a single data track to DVD+RW, DVD-RW or DVD-RAM.
|
|
||||||
.br
|
|
||||||
See section EXAMPLES at the end of this text.
|
See section EXAMPLES at the end of this text.
|
||||||
.PP
|
.PP
|
||||||
|
.B General information paragraphs:
|
||||||
|
.br
|
||||||
|
Track recording model
|
||||||
|
.br
|
||||||
|
Write mode selection
|
||||||
|
.br
|
||||||
|
Recordable CD Media
|
||||||
|
.br
|
||||||
|
Sequentially Recordable DVD Media
|
||||||
|
.br
|
||||||
|
Overwriteable DVD Media
|
||||||
|
.br
|
||||||
|
Drive preparation and addressing
|
||||||
|
.PP
|
||||||
.B Track recording model:
|
.B Track recording model:
|
||||||
.br
|
.br
|
||||||
The input-output entities which get processed are called tracks.
|
The input-output entities which get processed are called tracks.
|
||||||
@ -64,7 +82,7 @@ More than one track can be burned by a single run of cdrskin.
|
|||||||
In the terms of the MMC standard all tracks written by the same run constitute
|
In the terms of the MMC standard all tracks written by the same run constitute
|
||||||
a \fBsession\fP.
|
a \fBsession\fP.
|
||||||
.br
|
.br
|
||||||
CDs can be kept appendable so that further tracks can
|
Some media types can be kept appendable so that further tracks can
|
||||||
be written to them in subsequent runs of cdrskin (see option -multi).
|
be written to them in subsequent runs of cdrskin (see option -multi).
|
||||||
Info about the addresses of burned tracks is kept in a table of
|
Info about the addresses of burned tracks is kept in a table of
|
||||||
content (TOC) on media and can be retrieved via cdrskin option -toc.
|
content (TOC) on media and can be retrieved via cdrskin option -toc.
|
||||||
@ -72,7 +90,7 @@ These informations are also used by the operating systems' CD-ROM read drivers.
|
|||||||
.PP
|
.PP
|
||||||
In general there are two types of tracks: data and audio. They differ in
|
In general there are two types of tracks: data and audio. They differ in
|
||||||
sector size, throughput and readability via the systems' CD-ROM drivers
|
sector size, throughput and readability via the systems' CD-ROM drivers
|
||||||
resp. by music CD players.
|
resp. by music CD players. With DVD there is only type data.
|
||||||
.br
|
.br
|
||||||
If not explicitely option -audio is given, then any track is burned as type
|
If not explicitely option -audio is given, then any track is burned as type
|
||||||
data, unless the track source is a file with suffix ".wav" or ".au" and has a
|
data, unless the track source is a file with suffix ".wav" or ".au" and has a
|
||||||
@ -92,11 +110,33 @@ have been developed for magnetic tapes. Only formats which mark a detectable
|
|||||||
end-of-archive in their data are suitable, though. Well tested are
|
end-of-archive in their data are suitable, though. Well tested are
|
||||||
the archivers afio and star. Not suitable seems GNU tar.
|
the archivers afio and star. Not suitable seems GNU tar.
|
||||||
.PP
|
.PP
|
||||||
|
.B Write mode selection:
|
||||||
|
.br
|
||||||
|
If none of the options -dao, -tao or -sao is given then the program will
|
||||||
|
try to choose a write mode which matches the defined recording job,
|
||||||
|
the capabilities of the drive and the state of the present media.
|
||||||
|
.br
|
||||||
|
So the mentioning of write modes in the following paragraphs and in the
|
||||||
|
examples is not so much a demand that the user shall choose one explicitely,
|
||||||
|
but rather an illustration of what to expect with particular media types.
|
||||||
|
.PP
|
||||||
.B Recordable CD Media:
|
.B Recordable CD Media:
|
||||||
.br
|
.br
|
||||||
CD-R can be initially written only once and eventually extended until they
|
CD-R can be initially written only once and eventually extended until they
|
||||||
get closed (or are spoiled because they are overly full). After that they are
|
get closed (or are spoiled because they are overly full). After that they are
|
||||||
read-only.
|
read-only. Closing is done automatically unless option
|
||||||
|
.B -multi
|
||||||
|
is given which keeps the media appendable.
|
||||||
|
.br
|
||||||
|
There are two write modes,
|
||||||
|
.B -tao
|
||||||
|
and
|
||||||
|
.B -sao .
|
||||||
|
.br
|
||||||
|
-tao allows to use track source of unpredictable length (like stdin) and allows
|
||||||
|
to write further sessions to appendable media. -sao produces audio sessions
|
||||||
|
with seamless tracks but needs predicted track sizes and cannot append sessions
|
||||||
|
to media.
|
||||||
.br
|
.br
|
||||||
CD-RW media can be blanked to make them re-usable for another
|
CD-RW media can be blanked to make them re-usable for another
|
||||||
round of overwriting. Usually
|
round of overwriting. Usually
|
||||||
@ -106,24 +146,77 @@ Blanking damages the previous content but does not
|
|||||||
make it completely unreadable. It is no effective privacy precaution.
|
make it completely unreadable. It is no effective privacy precaution.
|
||||||
Multiple cycles of blanking and overwriting with random numbers might be.
|
Multiple cycles of blanking and overwriting with random numbers might be.
|
||||||
.PP
|
.PP
|
||||||
.B Recordable DVD Media:
|
.B Sequentially Recordable DVD Media:
|
||||||
.br
|
.br
|
||||||
Currently only types DVD+RW, DVD-RW and DVD-RAM can be burned via cdrskin.
|
Currently DVD-RW, DVD-R and DVD+R can be used for the Sequential recording
|
||||||
|
model.
|
||||||
|
.br
|
||||||
|
DVD-RW must be in state "Sequential Recording".
|
||||||
|
The media must be either blank or appendable.
|
||||||
|
Newly purchased DVD-RW and DVD-R media are in this state.
|
||||||
|
Used DVD-RW get into blank sequential state by option
|
||||||
|
.B blank=deformat_sequential .
|
||||||
|
.br
|
||||||
|
With DVD-R[W] two write modes may be available:
|
||||||
|
.br
|
||||||
|
Mode DAO has many restrictions. It does not work with
|
||||||
|
appendable media, allows no -multi and only a single track. The size of the
|
||||||
|
track needs to be known in advance. So either its source has to be a disk file
|
||||||
|
of recognizable size or the size has to be announced explicitely by options
|
||||||
|
.B tsize=
|
||||||
|
or
|
||||||
|
.B tao_to_sao_tsize= .
|
||||||
|
.br
|
||||||
|
DAO is the only mode for media which do not offer feature 21h Incremental
|
||||||
|
Streaming. DAO may also be selected explicitely by option
|
||||||
|
.B -sao .
|
||||||
|
Program growisofs uses DAO on sequential DVD-R[W] media for maximum
|
||||||
|
DVD-ROM/-Video compatibility.
|
||||||
|
.br
|
||||||
|
The other mode, Incremental Streaming, is the default write mode if
|
||||||
|
it is available and if the restrictions of DAO would prevent the job.
|
||||||
|
Incremental Streaming may be selected explicitely by option
|
||||||
|
.B -tao
|
||||||
|
as it resembles much CD TAO by allowing track sources of
|
||||||
|
unpredicted length and to keep media appendable by option
|
||||||
|
.B -multi .
|
||||||
|
The only restriction towards CD-R[W] is the lack of support for -audio tracks.
|
||||||
|
Multiple tracks per session are permissible.
|
||||||
|
.br
|
||||||
|
The write modes for DVD+R resemble those with DVD-R except that with DVD+R
|
||||||
|
each track gets wrapped in an own session. There is no -dummy writing with
|
||||||
|
DVD+R.
|
||||||
|
.br
|
||||||
|
Quite deliberately write mode -sao insists in the tradition of a predicted
|
||||||
|
track size and blank media, whereas -tao writes the tracks open ended and
|
||||||
|
allows appendable media.
|
||||||
|
.br
|
||||||
|
Currently DVD+R are always kept appendable regardless wether -multi is given
|
||||||
|
or not. This might change in future so it is strongly advised to already now
|
||||||
|
use
|
||||||
|
.B -multi
|
||||||
|
whenever the disc shall be kept appendable.
|
||||||
|
.PP
|
||||||
|
.B Overwriteable DVD Media:
|
||||||
|
.br
|
||||||
|
Currently types DVD+RW, DVD-RW and DVD-RAM can be overwritten via cdrskin.
|
||||||
.br
|
.br
|
||||||
DVD+RW and DVD-RAM media get treated as blank media regardless wether they
|
DVD+RW and DVD-RAM media get treated as blank media regardless wether they
|
||||||
hold data or not. They need no special initial formatting.
|
hold data or not. They need no special initial formatting.
|
||||||
Options -audio and -multi are not allowed. Only one track is allowed.
|
Options -audio and -multi are not allowed. Only one track is allowed.
|
||||||
-toc does not return information about the media content.
|
-toc does not return information about the media content.
|
||||||
Speed is counted in DVD units (i.e. 1x = 1,385,000 bytes/second). Currently
|
Currently there is no difference between -sao and -tao. If ever, then -tao
|
||||||
there is no difference between -sao and -tao. If ever, then -tao will be the
|
will be the mode which preserves the current behavior.
|
||||||
mode which preserves the current behavior.
|
|
||||||
.br
|
.br
|
||||||
DVD-RW need to be formatted to state "Restricted Overwrite". Then they behave
|
DVD-RW are sold in state "Sequential Recording". To become suitable for the
|
||||||
much like DVD+RW. This formatting can be done by option
|
Overwriteable DVD recording model they need to get formatted to state
|
||||||
.B blank=format_overwrite
|
"Restricted Overwrite". Then they behave much like DVD+RW. This formatting
|
||||||
It is necessary for unused media, for media written or blanked by cdrecord,
|
can be done by option
|
||||||
for media which have been written unformatted by growisofs or blanked by
|
.B blank=format_overwrite .
|
||||||
dvd+rw-format -blank. If in doubt, just give it a try.
|
.br
|
||||||
|
Several programs like dvd+rw-format, cdrecord, wodim, or cdrskin
|
||||||
|
can bring a DVD-RW out of overwriteable state so
|
||||||
|
that it has to be formatted again. If in doubt, just give it a try.
|
||||||
.PP
|
.PP
|
||||||
.B Drive preparation and addressing:
|
.B Drive preparation and addressing:
|
||||||
.br
|
.br
|
||||||
@ -133,7 +226,9 @@ by a run of \fBcdrskin --devices\fP.
|
|||||||
.br
|
.br
|
||||||
On Linux, they are device files which traditionally do not offer
|
On Linux, they are device files which traditionally do not offer
|
||||||
w-permissions for normal users. Because libburn needs rw-permission,
|
w-permissions for normal users. Because libburn needs rw-permission,
|
||||||
it might be only the superuser who is able to get this list without further
|
it might be only the
|
||||||
|
.B superuser
|
||||||
|
who is able to get this list without further
|
||||||
precautions.
|
precautions.
|
||||||
.br
|
.br
|
||||||
It is consensus that \fBchmod a+rw /dev/sg0\fP or \fBchmod a+rw /dev/hdc\fP
|
It is consensus that \fBchmod a+rw /dev/sg0\fP or \fBchmod a+rw /dev/hdc\fP
|
||||||
@ -183,9 +278,11 @@ stereo. For little-endian byte order (which is usual on PCs) use option
|
|||||||
.wav are examined wether they have a header in MS-WAVE format confirming
|
.wav are examined wether they have a header in MS-WAVE format confirming
|
||||||
those parameters and eventually raw audio data get extracted and burned as
|
those parameters and eventually raw audio data get extracted and burned as
|
||||||
audio track. Same is done for suffix .au and SUN Audio.
|
audio track. Same is done for suffix .au and SUN Audio.
|
||||||
|
.br
|
||||||
|
Option -audio may be used only with CD media and not with DVD.
|
||||||
.TP
|
.TP
|
||||||
.BI blank= type
|
.BI blank= type
|
||||||
Blank a CD-RW or format a DVD+/-RW.
|
Blank a CD-RW, a DVD-RW, or format a DVD+/-RW.
|
||||||
This is combinable with burning in the same run of cdrskin.
|
This is combinable with burning in the same run of cdrskin.
|
||||||
The type given with blank= selects the particular behavior:
|
The type given with blank= selects the particular behavior:
|
||||||
.RS
|
.RS
|
||||||
@ -194,14 +291,17 @@ help
|
|||||||
Print this list of blanking types.
|
Print this list of blanking types.
|
||||||
.TP
|
.TP
|
||||||
all
|
all
|
||||||
Blank an entire CD.
|
Blank an entire CD-RW or an unformatted DVD-RW.
|
||||||
|
(See also --prodvd_cli_compatible)
|
||||||
.TP
|
.TP
|
||||||
fast
|
fast
|
||||||
Minimally blank an entire CD.
|
Minimally blank an entire CD-RW or blank an unformatted DVD-RW.
|
||||||
|
(See also --prodvd_cli_compatible)
|
||||||
.TP
|
.TP
|
||||||
format_overwrite
|
format_overwrite
|
||||||
Format a DVD-RW to "Restricted Overwrite". The user should bring some patience.
|
Format a DVD-RW to "Restricted Overwrite". The user should bring some patience.
|
||||||
(Note: format_overwrite* are not original cdrecord options.)
|
.br
|
||||||
|
(Note: blank=format_overwrite* are not original cdrecord options.)
|
||||||
.TP
|
.TP
|
||||||
format_overwrite_quickest
|
format_overwrite_quickest
|
||||||
Like format_overwrite without creating a 128 MB trailblazer session.
|
Like format_overwrite without creating a 128 MB trailblazer session.
|
||||||
@ -215,8 +315,24 @@ rather than just 128 MB.
|
|||||||
Most traditional formatting is attempted. No data get written.
|
Most traditional formatting is attempted. No data get written.
|
||||||
Much patience is required.
|
Much patience is required.
|
||||||
.br
|
.br
|
||||||
|
This option treats already formatted media even if not option -force is given.
|
||||||
|
.br
|
||||||
For DVD+RW this is the only supported explicit formatting type. It provides
|
For DVD+RW this is the only supported explicit formatting type. It provides
|
||||||
complete "de-icing" so no reader slips on unwritten data areas.
|
complete "de-icing" so no reader slips on unwritten data areas.
|
||||||
|
.TP
|
||||||
|
deformat_sequential
|
||||||
|
Like blank=all but with the additional ability to blank overwriteable DVD-RW.
|
||||||
|
This will destroy their formatting and make them sequentially recordable.
|
||||||
|
Another peculiarity is the ability to blank media which appear already blank.
|
||||||
|
This is similar to option -force but does not try to blank media other than
|
||||||
|
recognizable CD-RW and DVD-RW.
|
||||||
|
.br
|
||||||
|
(Note: blank=deformat_sequential* are not original cdrecord options.)
|
||||||
|
.TP
|
||||||
|
deformat_sequential_quickest
|
||||||
|
Like blank=deformat_sequential but blanking DVD-RW only minimally.
|
||||||
|
This is faster than full blanking but may yield media incapable of
|
||||||
|
Incremental Streaming (-tao).
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.BI \-checkdrive
|
.BI \-checkdrive
|
||||||
@ -224,7 +340,8 @@ Retrieve some info about the addressed drive.
|
|||||||
Exits with non-zero value if the drive cannot be found and opened.
|
Exits with non-zero value if the drive cannot be found and opened.
|
||||||
.TP
|
.TP
|
||||||
.BI \-dao
|
.BI \-dao
|
||||||
Alias for option -sao. Write disk in Session at Once mode.
|
Alias for option -sao. Write CD in Session at Once mode
|
||||||
|
or DVD-R[W] in Disc-at-once mode.
|
||||||
.TP
|
.TP
|
||||||
.BI \-data
|
.BI \-data
|
||||||
Subsequent tracks are data tracks. This option is default and only needed
|
Subsequent tracks are data tracks. This option is default and only needed
|
||||||
@ -247,17 +364,18 @@ Be aware that deprecated option --old_pseudo_scsi_adr may change the meaning
|
|||||||
of Bus,Target,Lun addresses.
|
of Bus,Target,Lun addresses.
|
||||||
.TP
|
.TP
|
||||||
.BI driveropts= opt
|
.BI driveropts= opt
|
||||||
Set "driveropts=burnfree" to enable the drive's eventual protection mechanism
|
Set "driveropts=noburnfree" to disable the drive's eventual protection
|
||||||
against temporary lack of source data (i.e. buffer underrun).
|
mechanism against temporary lack of source data (i.e. buffer underrun).
|
||||||
It is not an error to do this with a drive that has no such capabilities.
|
A drive that announces no such capabilities will not get them enabled anyway,
|
||||||
|
even if attempted explicitely via "driveropts=burnfree".
|
||||||
.TP
|
.TP
|
||||||
.BI \-dummy
|
.BI \-dummy
|
||||||
Try to perform the drive operations without actually affecting the inserted
|
Try to perform the drive operations without actually affecting the inserted
|
||||||
media. There is no guarantee that this will work with a particular drive
|
media. There is no guarantee that this will work with a particular combination
|
||||||
in a particular write mode. Blanking is prevented reliably, though.
|
of drive, media, and write mode. Blanking is prevented reliably, though.
|
||||||
.TP
|
.TP
|
||||||
.BI \-eject
|
.BI \-eject
|
||||||
Eject the disk after work is done.
|
Eject the disc after work is done.
|
||||||
.TP
|
.TP
|
||||||
.BI \-force
|
.BI \-force
|
||||||
Assume that the user knows better in situations when cdrskin or libburn are
|
Assume that the user knows better in situations when cdrskin or libburn are
|
||||||
@ -265,9 +383,10 @@ insecure about drive or media state. This includes the attempt to blank
|
|||||||
media which are classified as unknown or unsuitable, and the attempt to use
|
media which are classified as unknown or unsuitable, and the attempt to use
|
||||||
write modes which libburn believes they are not supported by the drive.
|
write modes which libburn believes they are not supported by the drive.
|
||||||
.br
|
.br
|
||||||
Another application is with blank=format_* to enforce re-formatting of media
|
Another application is to enforce blanking or re-formatting of media
|
||||||
which appear to be sufficiently formatted already.
|
which appear to be in the desired blank or format state already.
|
||||||
.br
|
.br
|
||||||
|
.B Caution:
|
||||||
Use this only when in urgent need.
|
Use this only when in urgent need.
|
||||||
.TP
|
.TP
|
||||||
.BI fs= size
|
.BI fs= size
|
||||||
@ -299,19 +418,23 @@ Note: msifile=path is actually an option of wodim and not of cdrecord.
|
|||||||
.BI \-msinfo
|
.BI \-msinfo
|
||||||
Retrieve multi-session info for preparing a follow-up session by option -C
|
Retrieve multi-session info for preparing a follow-up session by option -C
|
||||||
of programs mkisofs or genisoimage. Print result to standard output.
|
of programs mkisofs or genisoimage. Print result to standard output.
|
||||||
This option redirects to stderr all
|
This option redirects to stderr all message output except the one of option
|
||||||
message output besides its own result string, which consists of two numbers.
|
--tell_media_space and its own result string, which consists of two numbers.
|
||||||
The result string shall be used as argument of option -C with said programs.
|
The result string shall be used as argument of option -C with said programs.
|
||||||
It gives the start address of the most recent session and the predicted
|
It gives the start address of the most recent session and the predicted
|
||||||
start address of the next session to be appended. The string is empty if
|
start address of the next session to be appended. The string is empty if
|
||||||
the most recent session was not written with option -multi.
|
the most recent session was not written with option -multi.
|
||||||
.TP
|
.TP
|
||||||
.BI \-multi
|
.BI \-multi
|
||||||
This option keeps the CD appendable after the current session has been written.
|
This option keeps the CD or unformatted DVD-R[W] appendable after the current
|
||||||
Without it the disk gets closed and may not be written any more - unless it
|
session has been written.
|
||||||
is a CD-RW and gets blanked which causes loss of its content.
|
Without it the disc gets closed and may not be written any more - unless it
|
||||||
|
is a -RW and gets blanked which causes loss of its content.
|
||||||
.br
|
.br
|
||||||
The following sessions can only be written in -tao mode.
|
The following sessions can only be written in -tao mode. -multi is prohibited
|
||||||
|
with overwriteable DVD media and with DVD-R[W] DAO write mode.
|
||||||
|
Option --prodvd_cli_compatible eventually makes -multi tolerable but cannot
|
||||||
|
make it work.
|
||||||
.br
|
.br
|
||||||
In order to have all filesystem content accessible, the eventual ISO-9660
|
In order to have all filesystem content accessible, the eventual ISO-9660
|
||||||
filesystem of a follow-up
|
filesystem of a follow-up
|
||||||
@ -337,18 +460,30 @@ gets reset to padsize=0 after that next track is written. It may be set
|
|||||||
again before the next track argument. About size specifiers, see option fs=.
|
again before the next track argument. About size specifiers, see option fs=.
|
||||||
.TP
|
.TP
|
||||||
.BI \-raw96r
|
.BI \-raw96r
|
||||||
Write disk in RAW/RAW96R mode. This mode allows to put more payload bytes
|
Write CD in RAW/RAW96R mode. This mode allows to put more payload bytes
|
||||||
into a CD sector but obviously at the cost of error correction. It can only
|
into a CD sector but obviously at the cost of error correction. It can only
|
||||||
be used for tracks of fixely predicted size. Some drives allow this mode but
|
be used for tracks of fixely predicted size. Some drives allow this mode but
|
||||||
then behave strange or even go bad for the next few attempts to burn a CD.
|
then behave strange or even go bad for the next few attempts to burn a CD.
|
||||||
One should use it only if inavoidable.
|
One should use it only if inavoidable.
|
||||||
.TP
|
.TP
|
||||||
.BI \-sao
|
.BI \-sao
|
||||||
Write disk in Session At Once mode. This mode is able to put several audio
|
Write CD in Session At Once mode, a sequential DVD-R[W] in Disc-at-once
|
||||||
tracks on CD without producing audible gaps between them. It can only
|
(DAO) mode, or a DVD+R.
|
||||||
be used for tracks of fixely predicted size. This implies that track arguments
|
.br
|
||||||
which depict stdin or named pipes need to be preceeded by option tsize= or
|
With CD this mode is able to put several audio tracks on media without
|
||||||
by option tao_to_sao_tsize=.
|
producing audible gaps between them.
|
||||||
|
.br
|
||||||
|
With DVD-R[W] this mode can only write a single track.
|
||||||
|
No -multi is allowed with DVD-R[W] -sao.
|
||||||
|
.br
|
||||||
|
-sao is permissible with overwriteable DVD and with DVD+R but actually only
|
||||||
|
imposes restrictions without providing known advantages.
|
||||||
|
.br
|
||||||
|
-sao can only be used for tracks of fixely predicted size. This implies that
|
||||||
|
track arguments which depict stdin or named pipes need to be preceeded by
|
||||||
|
option tsize= or by option tao_to_sao_tsize=.
|
||||||
|
.br
|
||||||
|
-sao cannot be used on appendable media.
|
||||||
.TP
|
.TP
|
||||||
.BI \-scanbus
|
.BI \-scanbus
|
||||||
Scan the system for drives. On Linux the drives at /dev/s* and at /dev/hd*
|
Scan the system for drives. On Linux the drives at /dev/s* and at /dev/hd*
|
||||||
@ -365,7 +500,8 @@ Bus,Target,Lun Number) 'Vendor' 'Mode' 'Revision'
|
|||||||
.TP
|
.TP
|
||||||
.BI speed= number
|
.BI speed= number
|
||||||
Set speed of drive. With data CD, 1x speed corresponds to a throughput of
|
Set speed of drive. With data CD, 1x speed corresponds to a throughput of
|
||||||
150 kB/s. It is not an error to set a speed higher than is suitable for drive
|
150,000 bytes/second. With DVD, 1x = 1,385,000 bytes/second.
|
||||||
|
It is not an error to set a speed higher than is suitable for drive
|
||||||
and media. One should stay within a realistic speed range, though.
|
and media. One should stay within a realistic speed range, though.
|
||||||
.TP
|
.TP
|
||||||
.BI \-swab
|
.BI \-swab
|
||||||
@ -377,13 +513,17 @@ Less guesswork is needed if track sources are in format MS-WAVE in a file with
|
|||||||
suffix ".wav".
|
suffix ".wav".
|
||||||
.TP
|
.TP
|
||||||
.BI \-tao
|
.BI \-tao
|
||||||
Write disk in Track At Once (TAO) mode. This mode can be used with track
|
Write CD in Track At Once (TAO) mode, sequential DVD-R[W] in Incremental
|
||||||
sources of unpredictable size, like standard input or named pipes. It is
|
Streaming mode, or DVD+R without traditional -sao restrictions.
|
||||||
also the only mode that can be used for writing to appendable CD which
|
This mode also applies pro-forma to overwriteable DVD media.
|
||||||
already hold data.
|
.br
|
||||||
|
Mode -tao can be used with track sources of unpredictable size, like standard
|
||||||
|
input or named pipes. It is also the only mode that can be used for writing
|
||||||
|
to appendable media which already hold data. With unformatted DVD-R[W] it is
|
||||||
|
the only mode which allows -multi.
|
||||||
.TP
|
.TP
|
||||||
.BI \-toc
|
.BI \-toc
|
||||||
Print the table of content (TOC) which describes the tracks recorded on CD.
|
Print the table of content (TOC) which describes the tracks recorded on disc.
|
||||||
The output contains all info from option -atip plus lines which begin with
|
The output contains all info from option -atip plus lines which begin with
|
||||||
"track:", the track number, the word "lba:" and a number which gives the
|
"track:", the track number, the word "lba:" and a number which gives the
|
||||||
start address of the track. Addresses are counted in CD sectors which with
|
start address of the track. Addresses are counted in CD sectors which with
|
||||||
@ -416,7 +556,7 @@ About size specifiers, see option fs=.
|
|||||||
If the track source does not deliver the predicted amount of bytes, the
|
If the track source does not deliver the predicted amount of bytes, the
|
||||||
remainder of the track is padded with zeros. This is not considered an error.
|
remainder of the track is padded with zeros. This is not considered an error.
|
||||||
If on the other hand the track source delivers more than the announced bytes
|
If on the other hand the track source delivers more than the announced bytes
|
||||||
then the track on CD gets truncated to the predicted size and cdrskin exits
|
then the track on media gets truncated to the predicted size and cdrskin exits
|
||||||
with non-zero value.
|
with non-zero value.
|
||||||
.TP
|
.TP
|
||||||
.BI \-v
|
.BI \-v
|
||||||
@ -441,6 +581,20 @@ contain a "=" character.
|
|||||||
By default such arguments are seen as misspelled options. It is nevertheless
|
By default such arguments are seen as misspelled options. It is nevertheless
|
||||||
not possible to use one of the options listed with --list_ignored_options.
|
not possible to use one of the options listed with --list_ignored_options.
|
||||||
.TP
|
.TP
|
||||||
|
.BI assert_write_lba= block_number | byte_address
|
||||||
|
Abort if the write address given with this option is not the same as predicted
|
||||||
|
immediately before the write session starts. This option can ensure that a
|
||||||
|
start address which was presumed by a formatter like mkisofs -C is really used
|
||||||
|
by the drive for writing.
|
||||||
|
assert_write_lba=0 effectively demands blank media and excludes appendables.
|
||||||
|
.br
|
||||||
|
Block numbering is peculiar: If the last character of the option string is
|
||||||
|
a letter [a-zA-Z] then the usual unit scaling by "s", "k", "m", etc. applies
|
||||||
|
and the result is divided by 2048. Else the number value of the string is
|
||||||
|
taken as plain block number with block size 2048 byte.
|
||||||
|
(E.g ...=1000 or ...=1000s means block 1000, ...=1m means block
|
||||||
|
512, ...=4096b means block number 2)
|
||||||
|
.TP
|
||||||
.BI \--demand_a_drive
|
.BI \--demand_a_drive
|
||||||
Exit with a nonzero value if no drive can be found during a bus scan.
|
Exit with a nonzero value if no drive can be found during a bus scan.
|
||||||
.TP
|
.TP
|
||||||
@ -465,10 +619,10 @@ fifo_start_at= combine a quick burn start and a large savings buffer to
|
|||||||
compensate for temporary lack of source data. At the beginning of burning,
|
compensate for temporary lack of source data. At the beginning of burning,
|
||||||
the software protection against buffer underun is as weak as the size of
|
the software protection against buffer underun is as weak as the size of
|
||||||
fifo_start_at= . So it is best if the drive offers hardware protection which
|
fifo_start_at= . So it is best if the drive offers hardware protection which
|
||||||
has to be enabled by driveropts=burnfree.
|
is enabled automatically if not driveropts=noburnfree is given.
|
||||||
.TP
|
.TP
|
||||||
.BI \--list_ignored_options
|
.BI \--list_ignored_options
|
||||||
List all ignored cdrecord options. The --options cannot be used as addresses
|
List all ignored cdrecord options. The "-" options cannot be used as addresses
|
||||||
of track sources. No track source address may begin with a text equal to an
|
of track sources. No track source address may begin with a text equal to an
|
||||||
option which ends by "=". The list is ended by an empty line.
|
option which ends by "=". The list is ended by an empty line.
|
||||||
.TP
|
.TP
|
||||||
@ -476,9 +630,52 @@ option which ends by "=". The list is ended by an empty line.
|
|||||||
Only if used as first command line argument this option prevents reading and
|
Only if used as first command line argument this option prevents reading and
|
||||||
interpretation of eventual startup files. See section FILES below.
|
interpretation of eventual startup files. See section FILES below.
|
||||||
.TP
|
.TP
|
||||||
|
.BI \--prodvd_cli_compatible
|
||||||
|
Activates behavior modifications with some DVD situations which bring cdrskin
|
||||||
|
nearer to the behavior of cdrecord-ProDVD:
|
||||||
|
.br
|
||||||
|
Option -multi with unsuitable media is not an error but simply has no effect.
|
||||||
|
.br
|
||||||
|
Options blank=fast and blank=all deformat overwriteable DVD-RW media.
|
||||||
|
.br
|
||||||
|
Option blank=fast does indeed minmal blanking with DVD-RW. This may yield media
|
||||||
|
which can only do DAO but not Incremental Streaming.
|
||||||
|
.TP
|
||||||
.BI \--single_track
|
.BI \--single_track
|
||||||
Accept only the last argument of the command line as track source address.
|
Accept only the last argument of the command line as track source address.
|
||||||
.TP
|
.TP
|
||||||
|
.BI tao_to_sao_tsize= size
|
||||||
|
Set an exact fixed size for the next track to be in effect only if the track
|
||||||
|
source cannot deliver a size prediction and no tsize= was specified and an
|
||||||
|
exact track size prediction is demanded by the write mode.
|
||||||
|
.br
|
||||||
|
This was the fallback from bad old times when cdrskin was unable to burn
|
||||||
|
in mode -tao . It came back with minimally blanked DVD-RW which allow no
|
||||||
|
Incremental Streaming (-tao) resp. with explicitly selected write mode -sao
|
||||||
|
for best DVD-ROM compatibility.
|
||||||
|
.br
|
||||||
|
If the track source delivers less bytes than announced then the missing ones
|
||||||
|
will be filled with zeros.
|
||||||
|
.TP
|
||||||
|
.BI --tell_media_space
|
||||||
|
Prepare a recording session, do not perform it but rather inquire the
|
||||||
|
maximum number of 2048 byte data blocks which may be written in
|
||||||
|
the current state of media with the prepared setup. So this option disables
|
||||||
|
recording of data. It does allow blanking, though, and will measure space
|
||||||
|
afterwards.
|
||||||
|
.br
|
||||||
|
It is not mandatory to give track sources but their nature may influence
|
||||||
|
the available capacity. So for most realistic results one may set up
|
||||||
|
the full burn session and add --tell_media_space. But if one has to expect
|
||||||
|
a cdrskin version prior to 0.3.3 no track source should be given in order
|
||||||
|
not to start an involuntary burn session.
|
||||||
|
In this case set at least -sao or -tao explicitely.
|
||||||
|
.br
|
||||||
|
The result gets printed to standard output. It is 0 or empty if no writing
|
||||||
|
is possible with the given options.
|
||||||
|
This option redirects to stderr all message output except its own result
|
||||||
|
string and eventual output of -msinfo.
|
||||||
|
.TP
|
||||||
.BI write_start_address= byte_offset
|
.BI write_start_address= byte_offset
|
||||||
Set the address on media where to start writing the track. With DVD+RW or
|
Set the address on media where to start writing the track. With DVD+RW or
|
||||||
DVD-RAM byte_offset must be aligned to 2 KB blocks, but better is 32 kB.
|
DVD-RAM byte_offset must be aligned to 2 KB blocks, but better is 32 kB.
|
||||||
@ -495,6 +692,17 @@ but rather to shut it down and to wait until it has ended the final operations.
|
|||||||
This option is only needed for revoking eventual --ignore_signals or
|
This option is only needed for revoking eventual --ignore_signals or
|
||||||
--no_abort_handler.
|
--no_abort_handler.
|
||||||
.TP
|
.TP
|
||||||
|
.BI \--allow_untested_media
|
||||||
|
Enable the use of media profiles which have been implemented but not yet
|
||||||
|
tested. Currently this applies to :
|
||||||
|
.br
|
||||||
|
Profile 0015h , DVD-R/DL Sequential (will not allow -multi).
|
||||||
|
.br
|
||||||
|
Profile 002Bh , DVD+R/DL.
|
||||||
|
.br
|
||||||
|
If you really test such media, then please report the outcome on
|
||||||
|
libburn-hackers@pykix.org
|
||||||
|
.TP
|
||||||
.BI dev_translation= <sep><from><sep><to>
|
.BI dev_translation= <sep><from><sep><to>
|
||||||
Set drive address alias. This was necessary before cdrskin-0.2.4 to manually
|
Set drive address alias. This was necessary before cdrskin-0.2.4 to manually
|
||||||
translate cdrecord addresses into cdrskin addresses.
|
translate cdrecord addresses into cdrskin addresses.
|
||||||
@ -530,6 +738,18 @@ Disable fifo despite any fs=.
|
|||||||
.BI \--fifo_per_track
|
.BI \--fifo_per_track
|
||||||
Use a separate fifo for each track.
|
Use a separate fifo for each track.
|
||||||
.TP
|
.TP
|
||||||
|
.BI \--fill_up_media
|
||||||
|
Expand the last track of the session to occupy all remaining free space on
|
||||||
|
the media.
|
||||||
|
.br
|
||||||
|
This option overrides option -multi. It will not fill up media if option -sao
|
||||||
|
is given with CD media.
|
||||||
|
.br
|
||||||
|
.B Caution:
|
||||||
|
This option might increase read compatibility with DVD-ROM drives but
|
||||||
|
with some DVD recorders and media types it might also fail to produce readable
|
||||||
|
media at all. "Your mileage may vary".
|
||||||
|
.TP
|
||||||
.BI grab_drive_and_wait= seconds
|
.BI grab_drive_and_wait= seconds
|
||||||
Open the addressed drive, wait the given number of seconds, release the drive,
|
Open the addressed drive, wait the given number of seconds, release the drive,
|
||||||
and do normal work as indicated by the other options used. This option helps
|
and do normal work as indicated by the other options used. This option helps
|
||||||
@ -547,8 +767,8 @@ On signals exit even if the drive is in busy state. This is not a very good
|
|||||||
idea. You might end up with a stuck drive that refuses to hand out the media.
|
idea. You might end up with a stuck drive that refuses to hand out the media.
|
||||||
.TP
|
.TP
|
||||||
.BI \--no_blank_appendable
|
.BI \--no_blank_appendable
|
||||||
Refuse to blank appendable CD-RW. This is a feature that was once builtin with
|
Refuse to blank appendable CD-RW or DVD-RW. This is a feature that was once
|
||||||
libburn. No information available for what use case it was needed.
|
builtin with libburn. No information available for what use case it was needed.
|
||||||
.TP
|
.TP
|
||||||
.BI \--no_convert_fs_adr
|
.BI \--no_convert_fs_adr
|
||||||
Do only literal translations of dev=. This prevents cdrskin from test-opening
|
Do only literal translations of dev=. This prevents cdrskin from test-opening
|
||||||
@ -565,16 +785,10 @@ Linux specific:
|
|||||||
Use and report literal Bus,Target,Lun addresses rather than real SCSI and
|
Use and report literal Bus,Target,Lun addresses rather than real SCSI and
|
||||||
pseudo ATA addresses. This method is outdated and was never compatible with
|
pseudo ATA addresses. This method is outdated and was never compatible with
|
||||||
original cdrecord.
|
original cdrecord.
|
||||||
.TP
|
|
||||||
.BI tao_to_sao_tsize= size
|
|
||||||
Set an exact fixed size for the next track to be in effect only if the track
|
|
||||||
source cannot deliver a size prediction and no tsize= was specified.
|
|
||||||
This is the fallback from bad old times when cdrskin was unable to burn
|
|
||||||
in mode -tao.
|
|
||||||
.br
|
.br
|
||||||
.SH EXAMPLES
|
.SH EXAMPLES
|
||||||
.SS
|
.SS
|
||||||
.B Get an overview of drives:
|
.B Get an overview of drives and their addresses:
|
||||||
.br
|
.br
|
||||||
cdrskin -scanbus
|
cdrskin -scanbus
|
||||||
.br
|
.br
|
||||||
@ -586,57 +800,65 @@ cdrskin --devices
|
|||||||
.br
|
.br
|
||||||
cdrskin dev=0,1,0 -checkdrive
|
cdrskin dev=0,1,0 -checkdrive
|
||||||
.br
|
.br
|
||||||
cdrskin dev=ATA:1,0,0 -atip
|
cdrskin dev=ATA:1,0,0 -v -atip
|
||||||
.br
|
.br
|
||||||
cdrskin dev=/dev/hdc -toc
|
cdrskin dev=/dev/hdc -toc
|
||||||
.SS
|
.SS
|
||||||
.B Make used CD-RW writable again:
|
.B Make used CD-RW or used unformatted DVD-RW writable again:
|
||||||
.br
|
.br
|
||||||
cdrskin -v dev=/dev/sg1 blank=all -eject
|
cdrskin -v dev=/dev/sg1 blank=fast -eject
|
||||||
.br
|
.br
|
||||||
cdrskin -v dev=/dev/dvd blank=fast -eject
|
cdrskin -v dev=/dev/dvd blank=all -eject
|
||||||
.SS
|
.SS
|
||||||
.B Format DVD-RW before first use with cdrskin:
|
.B Format DVD-RW to avoid need for blanking before re-use:
|
||||||
.br
|
.br
|
||||||
cdrskin -v dev=/dev/sr0 blank=format_overwrite
|
cdrskin -v dev=/dev/sr0 blank=format_overwrite
|
||||||
.SS
|
.SS
|
||||||
.B Write ISO-9660 filesystem image:
|
.B De-format DVD-RW to make it capable of multi-session again:
|
||||||
|
.br
|
||||||
|
cdrskin -v dev=/dev/sr0 blank=deformat_sequential
|
||||||
|
.SS
|
||||||
|
.B Write ISO-9660 filesystem image as only one to blank or formatted media:
|
||||||
.br
|
.br
|
||||||
cdrskin -v dev=/dev/hdc speed=12 fs=8m \\
|
cdrskin -v dev=/dev/hdc speed=12 fs=8m \\
|
||||||
.br
|
.br
|
||||||
driveropts=burnfree -sao -eject \\
|
-sao -eject padsize=300k my_image.iso
|
||||||
.br
|
|
||||||
padsize=300k my_image.iso
|
|
||||||
.SS
|
.SS
|
||||||
.B Write compressed afio archive on-the-fly:
|
.B Write compressed afio archive on-the-fly (not possible with minimally blanked DVD-RW):
|
||||||
.br
|
.br
|
||||||
find . | afio -oZ - | \\
|
find . | afio -oZ - | \\
|
||||||
.br
|
.br
|
||||||
cdrskin -v dev=0,1,0 fs=32m speed=8 driveropts=burnfree \\
|
cdrskin -v dev=0,1,0 fs=32m speed=8 \\
|
||||||
.br
|
.br
|
||||||
padsize=300k -tao -
|
-tao padsize=300k -
|
||||||
.SS
|
.SS
|
||||||
.B Write several sessions to the same CD:
|
.B Write multi-session to the same CD, DVD-R[W] or DVD+R:
|
||||||
.br
|
.br
|
||||||
cdrskin dev=/dev/hdc padsize=300k -multi 1.iso
|
cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 1.iso
|
||||||
.br
|
.br
|
||||||
cdrskin dev=/dev/hdc padsize=300k -multi -tao 2.afio
|
cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 2.iso
|
||||||
.br
|
.br
|
||||||
cdrskin dev=/dev/hdc padsize=300k -multi -tao 3.afio
|
cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 3.iso
|
||||||
.br
|
.br
|
||||||
cdrskin dev=/dev/hdc padsize=300k -tao 4.afio
|
cdrskin dev=/dev/hdc -v padsize=300k -tao 4.iso
|
||||||
.SS
|
.SS
|
||||||
.B Get CD multi-session info for option -C of program mkisofs:
|
.B Get multi-session info for option -C of program mkisofs:
|
||||||
.br
|
.br
|
||||||
c_values=$(cdrskin dev=/dev/sr0 -msinfo 2>/dev/null)
|
c_values=$(cdrskin dev=/dev/hdc -msinfo 2>/dev/null)
|
||||||
.br
|
.br
|
||||||
mkisofs ... -C "$c_values" ...
|
mkisofs ... -C "$c_values" ...
|
||||||
.SS
|
.SS
|
||||||
|
.B Inquire free space on media for a -tao -multi run:
|
||||||
|
.br
|
||||||
|
x=$(cdrskin dev=/dev/sr0 -tao -multi \\
|
||||||
|
.br
|
||||||
|
--tell_media_space 2>/dev/null)
|
||||||
|
.br
|
||||||
|
echo "Available: $x blocks of 2048 data bytes"
|
||||||
|
.SS
|
||||||
.B Write audio tracks to CD:
|
.B Write audio tracks to CD:
|
||||||
.br
|
.br
|
||||||
cdrskin -v dev=ATA:1,0,0 speed=48 \\
|
cdrskin -v dev=ATA:1,0,0 speed=48 -sao \\
|
||||||
.br
|
|
||||||
driveropts=burnfree -sao \\
|
|
||||||
.br
|
.br
|
||||||
track1.wav track2.au -audio -swab track3.raw
|
track1.wav track2.au -audio -swab track3.raw
|
||||||
.br
|
.br
|
||||||
@ -691,7 +913,7 @@ Other CD/DVD burn programs:
|
|||||||
.BR wodim (1)
|
.BR wodim (1)
|
||||||
.br
|
.br
|
||||||
.TP
|
.TP
|
||||||
For DVD burning:
|
For DVD burning (also tutor of libburn's DVD capabilities):
|
||||||
.br
|
.br
|
||||||
.BR growisofs (1)
|
.BR growisofs (1)
|
||||||
.br
|
.br
|
||||||
|
1155
cdrskin/cdrskin.c
1155
cdrskin/cdrskin.c
File diff suppressed because it is too large
Load Diff
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<HEAD>
|
<HEAD>
|
||||||
<META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn">
|
<META NAME="description" CONTENT="cdrskin, a limited cdrecord compatibility wrapper for libburn">
|
||||||
<META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, linux, CDR, CD-R, CDRW, CD-RW, cdrecord, compatible, scdbackup, burning">
|
<META NAME="keywords" CONTENT="cdrskin, libburn, libburnia, burn, CD, DVD, linux, recording, burning, CD-R, CD-RW, DVD-R, DVD-RW, DVD+RW, DVD+R, cdrecord, compatible, scdbackup">
|
||||||
<META NAME="robots" CONTENT="follow">
|
<META NAME="robots" CONTENT="follow">
|
||||||
<TITLE>cdrskin homepage english</TITLE>
|
<TITLE>cdrskin homepage english</TITLE>
|
||||||
</HEAD>
|
</HEAD>
|
||||||
@ -24,9 +24,8 @@
|
|||||||
|
|
||||||
<P>
|
<P>
|
||||||
<H2>Purpose:</H2>
|
<H2>Purpose:</H2>
|
||||||
<UL>
|
Burns preformatted data to CD and single layer DVD media:<BR>
|
||||||
<LI>Burns preformatted data to CD-R, CD-RW, DVD-RAM, DVD+RW, DVD-RW</LI>
|
CD-R, DVD-R, DVD+R, CD-RW, DVD-RW, DVD-RAM, DVD+RW
|
||||||
</UL>
|
|
||||||
</P>
|
</P>
|
||||||
<P>
|
<P>
|
||||||
|
|
||||||
@ -34,9 +33,10 @@
|
|||||||
|
|
||||||
<P>
|
<P>
|
||||||
<H2>Hardware requirements:</H2>
|
<H2>Hardware requirements:</H2>
|
||||||
A CD recorder suitable for
|
A CD/DVD recorder suitable for
|
||||||
<A HREF="http://libburnia.pykix.org">libburnia.pykix.org</A>
|
<A HREF="http://libburnia.pykix.org">libburnia.pykix.org</A> <BR>
|
||||||
(SCSI or IDE/ATAPI writers compliant to mmc-3 standard).
|
(SCSI , ATA , USB , or SATA writers compliant to standard MMC-3 for CD
|
||||||
|
and to MMC-5 for DVD).
|
||||||
<BR>
|
<BR>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ A CD recorder suitable for
|
|||||||
<H2>Software requirements :</H2>
|
<H2>Software requirements :</H2>
|
||||||
<DL>
|
<DL>
|
||||||
<DT>Linux kernel 2.4 or higher</DT>
|
<DT>Linux kernel 2.4 or higher</DT>
|
||||||
<DD>With kernel 2.4 the drive has to be under ide-scsi emulation.</DD>
|
<DD>With kernel 2.4 an ATA drive has to be under ide-scsi emulation.</DD>
|
||||||
<DD>With kernel 2.6 the drive should not be under ide-scsi.</DD>
|
<DD>With kernel 2.6 the drive should not be under ide-scsi.</DD>
|
||||||
<DT>libpthread</DT>
|
<DT>libpthread</DT>
|
||||||
<DD>is supposed to be a standard system component.</DD>
|
<DD>is supposed to be a standard system component.</DD>
|
||||||
@ -56,7 +56,7 @@ A CD recorder suitable for
|
|||||||
GPL software included:<BR>
|
GPL software included:<BR>
|
||||||
</H2>
|
</H2>
|
||||||
<DL>
|
<DL>
|
||||||
<DT>libburn-0.3.0</DT>
|
<DT>libburn-0.3.4</DT>
|
||||||
<DD>(by Derek Foreman, Ben Jansens, and team of libburnia.pykix.org)</DD>
|
<DD>(by Derek Foreman, Ben Jansens, and team of libburnia.pykix.org)</DD>
|
||||||
<DD>transfers data to CD</DD>
|
<DD>transfers data to CD</DD>
|
||||||
</DL>
|
</DL>
|
||||||
@ -88,41 +88,84 @@ and for data CD projects of <A HREF="http://www.k3b.org">K3b</A>
|
|||||||
(see <A HREF="#examples">examples</A>).
|
(see <A HREF="#examples">examples</A>).
|
||||||
Suitability for audio CD frontends has been improved much and is now being
|
Suitability for audio CD frontends has been improved much and is now being
|
||||||
evaluated.<BR>
|
evaluated.<BR>
|
||||||
DVD are written in a pseudo -tao mode which is very different from the
|
Most DVD types are written in pseudo -tao modes which are very different
|
||||||
write mode used by cdrecord(-ProDVD).<BR>
|
from the write mode DAO used by cdrecord(-ProDVD). With DVD-R[W] cdrskin
|
||||||
|
can use this write mode, too.<BR>
|
||||||
Further enhancements depend on people who can describe and discuss their
|
Further enhancements depend on people who can describe and discuss their
|
||||||
wishes as well as on the development of libburn.</DT>
|
wishes as well as on the development of libburn.</DT>
|
||||||
<BR><BR>
|
<BR><BR>
|
||||||
<DT>Get an overview of drives:</DT>
|
<DT>Get an overview of drives and their addresses</DT>
|
||||||
<DD>$ cdrskin -scanbus</DD>
|
<DD>#<KBD> cdrskin -scanbus</KBD></DD>
|
||||||
<DD>$ cdrskin dev=ATA -scanbus</DD>
|
<DD>#<KBD> cdrskin dev=ATA -scanbus</KBD></DD>
|
||||||
<DD>$ cdrskin --devices</DD>
|
<DD>#<KBD> cdrskin --devices</KBD></DD>
|
||||||
|
<DT>Being superuser avoids permission problems with /dev/sgN resp. /dev/hdX .
|
||||||
|
</DT>
|
||||||
|
<DT>Ordinary users should then get granted rw access to the /dev files
|
||||||
|
as listed by option --devices.</DT>
|
||||||
|
<DT> </DT>
|
||||||
|
|
||||||
<DT>Get info about a particular drive or loaded media:</DT>
|
<DT>Get info about a particular drive or loaded media:</DT>
|
||||||
<DD>$ cdrskin dev=0,1,0 -checkdrive</DD>
|
<DD>$<KBD> cdrskin dev=0,1,0 -checkdrive</KBD></DD>
|
||||||
<DD>$ cdrskin dev=ATA:1,0,0 -atip</DD>
|
<DD>$<KBD> cdrskin dev=ATA:1,0,0 -v -atip</KBD></DD>
|
||||||
<DD>$ cdrskin dev=/dev/hdc -toc</DD>
|
<DD>$<KBD> cdrskin dev=/dev/hdc -toc</KBD></DD>
|
||||||
<DT>Make used CD-RW writable again:</DT>
|
|
||||||
<DD>$ cdrskin -v dev=/dev/sg1 blank=all -eject</DD>
|
<DT>Make used CD-RW or used unformatted DVD-RW writable again:</DT>
|
||||||
<DD>$ cdrskin -v dev=/dev/dvd blank=fast -eject</DD>
|
<DD>$<KBD> cdrskin -v dev=/dev/sg1 blank=fast -eject</KBD></DD>
|
||||||
<DT>Format DVD-RW before first use with cdrskin</DT>
|
<DD>$<KBD> cdrskin -v dev=/dev/dvd blank=all -eject</KBD></DD>
|
||||||
<DD>$ cdrskin -v dev=0,1,0 blank=format_overwrite -eject<DD>
|
|
||||||
<DT>Write ISO-9660 filesystem image:</DT>
|
<DT>Format DVD-RW to avoid need for blanking before re-use:</DT>
|
||||||
<DD>$ cdrskin -v dev=/dev/hdc speed=12 fs=8m driveropts=burnfree -eject padsize=300k my_image.iso</DD>
|
<DD>$<KBD> cdrskin -v dev=/dev/sr0 blank=format_overwrite</KBD></DD>
|
||||||
|
|
||||||
|
<DT>De-format DVD-RW to make it capable of multi-session again:</DT>
|
||||||
|
<DD>$<KBD> cdrskin -v dev=/dev/sr0 blank=deformat_sequential</KBD></DD>
|
||||||
|
|
||||||
|
<DT>Write ISO-9660 filesystem image as only one to blank or formatted media:
|
||||||
|
</DT>
|
||||||
|
<DD>$<KBD> cdrskin -v dev=/dev/hdc speed=12 fs=8m \</KBD></DD>
|
||||||
|
<DD><KBD> -sao -eject padsize=300k my_image.iso</KBD></DD>
|
||||||
|
|
||||||
<DT>Write compressed afio archive on-the-fly:</DT>
|
<DT>Write compressed afio archive on-the-fly:</DT>
|
||||||
<DD>$ find . | afio -oZ - | cdrskin -v dev=0,1,0 fs=32m speed=8 driveropts=burnfree padsize=300k -tao -</DD>
|
<DD>$<KBD> find . | afio -oZ - | \</KBD></DD>
|
||||||
<DT>Write audio tracks:</DT>
|
<DD><KBD> cdrskin -v dev=0,1,0 fs=32m speed=8 \</KBD></DD>
|
||||||
<DD>$ cdrskin -v dev=ATA:1,0,0 speed=48 driveropts=burnfree -sao track1.wav track2.au -audio -swab track3.raw
|
<DD><KBD> -tao padsize=300k -</KBD></DD>
|
||||||
<DD>
|
|
||||||
<BR>
|
<DT>Write several sessions to the same CD, DVD-R[W] or DVD+R:</DT>
|
||||||
|
<DD>$<KBD> cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 1.iso</KBD>
|
||||||
|
</DD>
|
||||||
|
<DD>$<KBD> cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 2.iso</KBD>
|
||||||
|
</DD>
|
||||||
|
<DD>$<KBD> cdrskin dev=/dev/hdc -v padsize=300k -multi -tao 3.iso</KBD>
|
||||||
|
</DD>
|
||||||
|
<DD>$<KBD> cdrskin dev=/dev/hdc -v padsize=300k -tao 4.iso</KBD></DD>
|
||||||
|
|
||||||
|
<DT>Get multi-session info for option -C of program mkisofs:</DT>
|
||||||
|
<DD>$<KBD> c_values=$(cdrskin dev=/dev/sr0 -msinfo 2>/dev/null)</KBD></DD>
|
||||||
|
<DD>$<KBD> mkisofs ... -C "$c_values" ...</KBD></DD>
|
||||||
|
|
||||||
|
<DT>Inquire free space on media for a -tao -multi run:</DT>
|
||||||
|
<DD>$<KBD> x=$(cdrskin dev=/dev/sr0 -tao -multi \</KBD></DD>
|
||||||
|
<DD><KBD> --tell_media_space 2>/dev/null)</KBD></DD>
|
||||||
|
<DD>$<KBD> echo "Available: $x blocks of 2048 data bytes"</KBD></DD>
|
||||||
|
|
||||||
|
<DT>Write audio tracks to CD:</DT>
|
||||||
|
<DD>$<KBD> cdrskin -v dev=ATA:1,0,0 speed=48 -sao \</KBD></DD>
|
||||||
|
<DD><KBD> track1.wav track2.au -audio -swab track3.raw</KBD></DD>
|
||||||
|
|
||||||
<DT>Get overview of the cdrecord compatible options:</DT>
|
<DT>Get overview of the cdrecord compatible options:</DT>
|
||||||
<DD><A HREF="cdrskin_help">$ cdrskin -help</A></DD>
|
<DD>$<KBD> <A HREF="cdrskin_help">cdrskin -help</A></KBD></DD>
|
||||||
|
|
||||||
<DT>Get overview of the non-cdrecord options:</DT>
|
<DT>Get overview of the non-cdrecord options:</DT>
|
||||||
<DD><A HREF="cdrskin__help">$ cdrskin --help</A></DD>
|
<DD>$<KBD> <A HREF="cdrskin__help">cdrskin --help</A></KBD></DD>
|
||||||
|
|
||||||
<DT>Read the detailed manual page:</DT>
|
<DT>Read the detailed manual page:</DT>
|
||||||
<DD><A HREF="man_1_cdrskin.html">$ man cdrskin</A></DD>
|
<DD>$<KBD> <A HREF="man_1_cdrskin.html">man cdrskin</A></KBD></DD>
|
||||||
|
</DL>
|
||||||
|
|
||||||
|
<DL>
|
||||||
<DT>Read about the standard for which cdrskin is striving:</DT>
|
<DT>Read about the standard for which cdrskin is striving:</DT>
|
||||||
<DD><A HREF="http://cdrecord.berlios.de/old/private/man/cdrecord-2.0.html">
|
<DD>$<KBD>
|
||||||
$ man cdrecord</A></DD>
|
<A HREF="http://cdrecord.berlios.de/old/private/man/cdrecord-2.0.html">
|
||||||
|
man cdrecord</A></KBD></DD>
|
||||||
<DD><B>Do not bother Joerg Schilling with any cdrskin problems.</B>
|
<DD><B>Do not bother Joerg Schilling with any cdrskin problems.</B>
|
||||||
(Be cursed if you install cdrskin as "cdrecord" without clearly forwarding
|
(Be cursed if you install cdrskin as "cdrecord" without clearly forwarding
|
||||||
this "don't bother Joerg" demand.)
|
this "don't bother Joerg" demand.)
|
||||||
@ -130,35 +173,13 @@ $ man cdrecord</A></DD>
|
|||||||
</DL>
|
</DL>
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<P>
|
|
||||||
<H2>Known deficiencies:</H2>
|
|
||||||
<UL>
|
|
||||||
<DT></DT>
|
|
||||||
<LI>
|
|
||||||
Appending sessions to unclosed media is restricted to write mode TAO.
|
|
||||||
</LI>
|
|
||||||
<LI>
|
|
||||||
cdrskin -scanbus or --devices hangs for quite a while if there is
|
|
||||||
a CD drive which does not work properly (e.g. because it has individual
|
|
||||||
problems with DMA).
|
|
||||||
So if the superuser gets no result with cdrskin --devices then one should
|
|
||||||
disable DMA with the problematic CD drives
|
|
||||||
(like: <KBD>hdparm -d0 /dev/hdd</KBD> )
|
|
||||||
and try again.<BR>
|
|
||||||
In severe cases it might be necessary to guess the device name /dev/sgN resp.
|
|
||||||
/dev/hdX of the non-ill burner if it cannot be found otherwise among its
|
|
||||||
ill peers. Alternatively one can guess the address of the ill device, remove
|
|
||||||
rw-permissions and retry the bus scan as non-superuser.
|
|
||||||
</UL>
|
|
||||||
</P>
|
|
||||||
|
|
||||||
<HR>
|
<HR>
|
||||||
|
|
||||||
<P>
|
<P>
|
||||||
<DL>
|
<DL>
|
||||||
<DT>Download as source code (see README):</DT>
|
<DT>Download as source code (see README):</DT>
|
||||||
<DD><A HREF="cdrskin-0.3.0.pl00.tar.gz">cdrskin-0.3.0.pl00.tar.gz</A>
|
<DD><A HREF="cdrskin-0.3.4.pl00.tar.gz">cdrskin-0.3.4.pl00.tar.gz</A>
|
||||||
(540 KB).
|
(570 KB).
|
||||||
</DD>
|
</DD>
|
||||||
<DD>
|
<DD>
|
||||||
The "stable" cdrskin tarballs are source code identical with "stable"
|
The "stable" cdrskin tarballs are source code identical with "stable"
|
||||||
@ -168,21 +189,21 @@ cdrskin is part of libburn - full libburn is provided with cdrskin releases.
|
|||||||
</DD>
|
</DD>
|
||||||
<DD> </DD>
|
<DD> </DD>
|
||||||
<DT>Download as single x86 binaries (untar and move to /usr/bin/cdrskin):</DT>
|
<DT>Download as single x86 binaries (untar and move to /usr/bin/cdrskin):</DT>
|
||||||
<DD><A HREF="cdrskin_0.3.0.pl00-x86-suse9_0.tar.gz">
|
<DD><A HREF="cdrskin_0.3.4.pl00-x86-suse9_0.tar.gz">
|
||||||
cdrskin_0.3.0.pl00-x86-suse9_0.tar.gz</A>, (75 KB),
|
cdrskin_0.3.4.pl00-x86-suse9_0.tar.gz</A>, (80 KB),
|
||||||
<DL>
|
<DL>
|
||||||
<DD>runs on SuSE 9.0 (2.4.21) , RIP-14.4 (2.6.14) ,
|
<DD>runs on SuSE 9.0 (2.4.21) , RIP-14.4 (2.6.14) ,
|
||||||
Gentoo (2.6.15 x86_64 Athlon).</DD>
|
Gentoo (2.6.15 x86_64 Athlon).</DD>
|
||||||
</DL>
|
</DL>
|
||||||
<DD><A HREF="cdrskin_0.3.0.pl00-x86-suse9_0-static.tar.gz">
|
<DD><A HREF="cdrskin_0.3.4.pl00-x86-suse9_0-static.tar.gz">
|
||||||
cdrskin_0.3.0.pl00-x86-suse9_0-static.tar.gz</A>, (275 KB), -static compiled,
|
cdrskin_0.3.4.pl00-x86-suse9_0-static.tar.gz</A>, (285 KB), -static compiled,
|
||||||
<DL>
|
<DL>
|
||||||
<DD>runs on SuSE 7.2 (2.4.4), and on the systems above.</DD>
|
<DD>runs on SuSE 7.2 (2.4.4), and on the systems above.</DD>
|
||||||
</DL>
|
</DL>
|
||||||
</DD>
|
</DD>
|
||||||
</DL>
|
</DL>
|
||||||
<DL><DT>Documentation:</DT>
|
<DL><DT>Documentation:</DT>
|
||||||
<DD><A HREF="README_cdrskin">README</A> a short introduction</DD>
|
<DD><A HREF="README_cdrskin">README</A> an introduction</DD>
|
||||||
<DD><A HREF="cdrskin__help">cdrskin --help</A> non-cdrecord options</DD>
|
<DD><A HREF="cdrskin__help">cdrskin --help</A> non-cdrecord options</DD>
|
||||||
<DD><A HREF="cdrskin_help">cdrskin -help</A> cdrecord compatible options</DD>
|
<DD><A HREF="cdrskin_help">cdrskin -help</A> cdrecord compatible options</DD>
|
||||||
<DD><A HREF="man_1_cdrskin.html">man cdrskin</A> the manual page</DD>
|
<DD><A HREF="man_1_cdrskin.html">man cdrskin</A> the manual page</DD>
|
||||||
@ -202,33 +223,38 @@ cdrskin_0.3.0.pl00-x86-suse9_0-static.tar.gz</A>, (275 KB), -static compiled,
|
|||||||
<HR>
|
<HR>
|
||||||
|
|
||||||
<P>
|
<P>
|
||||||
Enhancements towards previous stable version cdrskin-0.2.6:
|
Enhancements towards previous stable version cdrskin-0.3.2:
|
||||||
<UL>
|
<UL>
|
||||||
<LI>Improved recognition of unsuitable media types</LI>
|
<LI>Multi-session burning to DVD+R</LI>
|
||||||
<LI>Ban of chmod u+s is replaced by a loud warning</LI>
|
<LI>New option --tell_media_space tells the maximum size for the next burn</LI>
|
||||||
<LI>Detailed man page</LI>
|
<LI>New option assert_write_lba= prevents inadverted writing to appendable
|
||||||
<LI>Burning to DVD+RW and DVD-RAM as non-multi, non-appending,
|
<LI>Bug fix: Multi-track runs with fifo could stall in rare cases</LI>
|
||||||
single-track session</LI>
|
|
||||||
<LI>Formatting and then burning to DVD-RW like to DVD+RW</LI>
|
|
||||||
<LI>Emulation of new wodim option msifile=path</LI>
|
|
||||||
</UL>
|
</UL>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Bug fixes towards cdrskin-0.3.4.pl00:
|
||||||
|
<UL>
|
||||||
|
<LI>none yet</LI>
|
||||||
|
</UL>
|
||||||
|
-->
|
||||||
|
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<HR>
|
<HR>
|
||||||
|
|
||||||
<P>
|
<P>
|
||||||
<DL>
|
<DL>
|
||||||
<DT><H3>Development snapshot, version 0.3.1 :</H3></DT>
|
<DT><H3>Development snapshot, version 0.3.5 :</H3></DT>
|
||||||
<DD>Enhancements towards stable version 0.3.0:
|
<DD>Enhancements towards stable version 0.3.4.pl00:
|
||||||
<UL>
|
<UL>
|
||||||
<LI>-none yet-</LI>
|
<LI>none yet</LI>
|
||||||
</UL>
|
</UL>
|
||||||
</DD>
|
</DD>
|
||||||
<DD> </DD>
|
<DD> </DD>
|
||||||
<DD><A HREF="README_cdrskin_devel">README 0.3.1</A>
|
<DD><A HREF="README_cdrskin_devel">README 0.3.5</A>
|
||||||
<DD><A HREF="cdrskin__help_devel">cdrskin_0.3.1 --help</A></DD>
|
<DD><A HREF="cdrskin__help_devel">cdrskin_0.3.5 --help</A></DD>
|
||||||
<DD><A HREF="cdrskin_help_devel">cdrskin_0.3.1 -help</A></DD>
|
<DD><A HREF="cdrskin_help_devel">cdrskin_0.3.5 -help</A></DD>
|
||||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.3.1)</A></DD>
|
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 0.3.5)</A></DD>
|
||||||
<DD> </DD>
|
<DD> </DD>
|
||||||
<DT>Maintainers of cdrskin unstable packages please use SVN of
|
<DT>Maintainers of cdrskin unstable packages please use SVN of
|
||||||
<A HREF="http://libburnia.pykix.org"> libburnia.pykix.org</A></DT>
|
<A HREF="http://libburnia.pykix.org"> libburnia.pykix.org</A></DT>
|
||||||
@ -248,15 +274,15 @@ admins with full system souvereignty.</DT>
|
|||||||
<A HREF="README_cdrskin_devel">upcoming README</A> ):
|
<A HREF="README_cdrskin_devel">upcoming README</A> ):
|
||||||
</DD>
|
</DD>
|
||||||
<DD>
|
<DD>
|
||||||
<A HREF="cdrskin-0.3.1.tar.gz">cdrskin-0.3.1.tar.gz</A>
|
<A HREF="cdrskin-0.3.5.tar.gz">cdrskin-0.3.5.tar.gz</A>
|
||||||
(550 KB).
|
(570 KB).
|
||||||
</DD>
|
</DD>
|
||||||
<DD>Binary (untar and move to /usr/bin/cdrskin):</DD>
|
<DD>Binary (untar and move to /usr/bin/cdrskin):</DD>
|
||||||
<DD><A HREF="cdrskin_0.3.1-x86-suse9_0.tar.gz">
|
<DD><A HREF="cdrskin_0.3.5-x86-suse9_0.tar.gz">
|
||||||
cdrskin_0.3.1-x86-suse9_0.tar.gz</A>, (75 KB).
|
cdrskin_0.3.5-x86-suse9_0.tar.gz</A>, (80 KB).
|
||||||
</DD>
|
</DD>
|
||||||
<DD><A HREF="cdrskin_0.3.1-x86-suse9_0-static.tar.gz">
|
<DD><A HREF="cdrskin_0.3.5-x86-suse9_0-static.tar.gz">
|
||||||
cdrskin_0.3.1-x86-suse9_0-static.tar.gz</A>, (275 KB)
|
cdrskin_0.3.5-x86-suse9_0-static.tar.gz</A>, (280 KB)
|
||||||
</DD>
|
</DD>
|
||||||
</DL>
|
</DL>
|
||||||
</P>
|
</P>
|
||||||
@ -272,6 +298,10 @@ Historic versions based on Derek's and Ben's
|
|||||||
<A HREF="http://icculus.org/burn">icculus.org/burn</A> :<BR>
|
<A HREF="http://icculus.org/burn">icculus.org/burn</A> :<BR>
|
||||||
<A HREF="cdrskin-0.1.2.0.2.ts.tar.gz">cdrskin-0.1.2.0.2.ts.tar.gz</A><BR>
|
<A HREF="cdrskin-0.1.2.0.2.ts.tar.gz">cdrskin-0.1.2.0.2.ts.tar.gz</A><BR>
|
||||||
<A HREF="cdrskin-0.1.3.0.2.ts.tar.gz">cdrskin-0.1.3.0.2.ts.tar.gz</A>
|
<A HREF="cdrskin-0.1.3.0.2.ts.tar.gz">cdrskin-0.1.3.0.2.ts.tar.gz</A>
|
||||||
|
<BR>
|
||||||
|
Very special thanks to Andy Polyakov whose
|
||||||
|
<A HREF="http://fy.chalmers.se/~appro/linux/DVD+RW/tools">dvd+rw-tools</A>
|
||||||
|
provide libburn with invaluable examples on how to deal with DVD media.
|
||||||
</P>
|
</P>
|
||||||
|
|
||||||
<HR>
|
<HR>
|
||||||
@ -314,7 +344,7 @@ is a GUI frontend which uses cdrecord for CD burning.)
|
|||||||
<DD><KBD>...</KBD></DD>
|
<DD><KBD>...</KBD></DD>
|
||||||
<DD><KBD> 1,0,0 1) 'LITE-ON' 'LTR-48125S' '?' Removable CD-ROM</KBD></DD>
|
<DD><KBD> 1,0,0 1) 'LITE-ON' 'LTR-48125S' '?' Removable CD-ROM</KBD></DD>
|
||||||
<DD>$ <KBD><B>export SCDBACKUP_SCSI_ADR="ATA:1,0,0"</B></KBD></DD>
|
<DD>$ <KBD><B>export SCDBACKUP_SCSI_ADR="ATA:1,0,0"</B></KBD></DD>
|
||||||
<DD>$ <KBD><B>export SCDBACKUP_CDRECORD="cdrskin -v -v tao_to_sao_tsize=650m"</B></KBD></DD>
|
<DD>$ <KBD><B>export SCDBACKUP_CDRECORD="cdrskin -v -v"</B></KBD></DD>
|
||||||
<DD>$ <KBD><B>scdbackup_home</B></KBD></DD>
|
<DD>$ <KBD><B>scdbackup_home</B></KBD></DD>
|
||||||
</DL>
|
</DL>
|
||||||
<DL>
|
<DL>
|
||||||
@ -323,7 +353,7 @@ is a GUI frontend which uses cdrecord for CD burning.)
|
|||||||
<DD>$ <KBD><B>export SCDBACKUP_USE_CDRSKIN=1</B></KBD></DD>
|
<DD>$ <KBD><B>export SCDBACKUP_USE_CDRSKIN=1</B></KBD></DD>
|
||||||
<DD>$ <KBD><B>./CONFIGURE_CD</B></KBD></DD>
|
<DD>$ <KBD><B>./CONFIGURE_CD</B></KBD></DD>
|
||||||
<DD><KBD>...</KBD></DD>
|
<DD><KBD>...</KBD></DD>
|
||||||
<DD><KBD>cdrskin 0.3.0 : limited cdrecord compatibility wrapper for libburn</KBD></DD>
|
<DD><KBD>cdrskin 0.3.4 : limited cdrecord compatibility wrapper for libburn</KBD></DD>
|
||||||
</DL>
|
</DL>
|
||||||
If your system is stricken with some ill CD device then this can stall
|
If your system is stricken with some ill CD device then this can stall
|
||||||
and you will have to press <KBD>Ctrl+C</KBD> to abort.
|
and you will have to press <KBD>Ctrl+C</KBD> to abort.
|
||||||
@ -382,8 +412,8 @@ Contact me. Let's see what we can achieve.
|
|||||||
<BR>
|
<BR>
|
||||||
<BR>
|
<BR>
|
||||||
libburn and cdrskin are now mature enough to substitute cdrecord in its
|
libburn and cdrskin are now mature enough to substitute cdrecord in its
|
||||||
major use cases of CD burning. It is possible to foist cdrskin on various
|
major use cases of CD and DVD burning. It is possible to foist cdrskin on
|
||||||
software packages if it gets falsely named "cdrecord".
|
various software packages if it gets falsely named "cdrecord".
|
||||||
I do not encourage this approach, but of course such a replacement
|
I do not encourage this approach, but of course such a replacement
|
||||||
opportunity is the goal of a cdrecord compatibility wrapper.
|
opportunity is the goal of a cdrecord compatibility wrapper.
|
||||||
<BR>
|
<BR>
|
||||||
|
@ -1 +1 @@
|
|||||||
#define Cdrskin_timestamP "2007.01.16.120001"
|
#define Cdrskin_timestamP "2007.03.12.110001"
|
||||||
|
@ -13,17 +13,27 @@ Deliberate deviations of cdrskin from cdrecord compatibility:
|
|||||||
+ -sao is default where possible, -tao is default where needed
|
+ -sao is default where possible, -tao is default where needed
|
||||||
(Note: cdrecord write mode defaults have changed in cdrtools-2.01.01a20)
|
(Note: cdrecord write mode defaults have changed in cdrtools-2.01.01a20)
|
||||||
|
|
||||||
|
+ driveropts=burnfree is default if the drive supports buffer underrun
|
||||||
|
protection. If desired, use driveropts=noburnfree to disable this feature.
|
||||||
|
|
||||||
+ premature end of source is not an error and leads to full announced tracksize
|
+ premature end of source is not an error and leads to full announced tracksize
|
||||||
|
|
||||||
+ -msinfo pushes all other messages to stderr. It works independent of
|
+ -msinfo pushes all other messages to stderr. It works independent of
|
||||||
other options which would prevent it with cdrecord (-atip, -scanbus, ...)
|
other options which would prevent it with cdrecord (-atip, -scanbus, ...)
|
||||||
|
|
||||||
+ DVD+RW writing is like -tao on giant blank CD-RW.
|
+ DVD track sources get not concateneated to a single track. In general DVD
|
||||||
Same with DVD-RW in mode Restricted Overwrite.
|
writing is quite different from cdrecord-ProDVD:
|
||||||
|
DVD-R[W] "Disc-at-once" (-sao) is nearest to cdrecord-ProDVD's methods.
|
||||||
|
DVD-R[W] "Incremental Streaming" (-tao) on unformatted media allows
|
||||||
|
multi-session and track sources of unpredictable size.
|
||||||
|
Writing DVD-RAM, DVD+RW and "Restricted Overwrite" DVD-RW is like single
|
||||||
|
track -tao on blank CD. Formatting is done via cdrskin-specific
|
||||||
|
blank=format_overwrite and not with option -format.
|
||||||
|
|
||||||
|
+ DVD-RW get blanked fast only with option blank=deformat_sequential_quickest .
|
||||||
|
Option blank=fast is the same as blank=all in order to achieve media which
|
||||||
|
are capable of Incremental Streaming.
|
||||||
|
|
||||||
+ DVD-RW "Restricted Overwrite" writing is like DVD+RW (i.e. like -tao).
|
|
||||||
Formatting is done via cdrskin-specific blank=format_overwrite and not
|
|
||||||
with option -format.
|
|
||||||
|
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
Changelog
|
Changelog
|
||||||
@ -2352,21 +2362,21 @@ Greeting the new year
|
|||||||
* Formatting and then burning to DVD-RW like to DVD+RW
|
* Formatting and then burning to DVD-RW like to DVD+RW
|
||||||
|
|
||||||
|
|
||||||
2 Jan 2006 [576]
|
2 Jan 2007 [576]
|
||||||
cdrskin/changelog.txt
|
cdrskin/changelog.txt
|
||||||
Next cdrskin-0.2.7 cycle
|
Next cdrskin-0.2.7 cycle
|
||||||
|
|
||||||
2 Jan 2006 [577]
|
2 Jan 2007 [577]
|
||||||
cdrskin/wiki_plain.txt
|
cdrskin/wiki_plain.txt
|
||||||
cdrskin/README
|
cdrskin/README
|
||||||
Some DVD-RW statements
|
Some DVD-RW statements
|
||||||
|
|
||||||
2 Jan 2006 [578]
|
2 Jan 2007 [578]
|
||||||
test/libburner.c
|
test/libburner.c
|
||||||
doc/comments
|
doc/comments
|
||||||
Made use of formatting of DVD-RW
|
Made use of formatting of DVD-RW
|
||||||
|
|
||||||
2 Jan 2006 [579]
|
2 Jan 2007 [579]
|
||||||
cdrskin/cdrskin.1
|
cdrskin/cdrskin.1
|
||||||
Some DVD-RW statements
|
Some DVD-RW statements
|
||||||
|
|
||||||
@ -2560,7 +2570,7 @@ Updated about overwriteable DVD and pointer to dvd+rw-tools
|
|||||||
cdrskin/changelog.txt
|
cdrskin/changelog.txt
|
||||||
Next cdrskin-0.2.7 cycle
|
Next cdrskin-0.2.7 cycle
|
||||||
|
|
||||||
2007.01.16.120001 [tag]
|
2007.01.16.120001 [tag 624]
|
||||||
Makefile.am
|
Makefile.am
|
||||||
configure.ac
|
configure.ac
|
||||||
README
|
README
|
||||||
@ -2569,7 +2579,33 @@ cdrskin/README
|
|||||||
cdrskin/compile_cdrskin.sh
|
cdrskin/compile_cdrskin.sh
|
||||||
cdrskin/cdrskin_timestamp.h
|
cdrskin/cdrskin_timestamp.h
|
||||||
cdrskin/changelog.txt
|
cdrskin/changelog.txt
|
||||||
Make version number transition to 0.3.0
|
Made version number transition to 0.3.0
|
||||||
|
|
||||||
|
15 Jan 2007 [tag 625]
|
||||||
|
- cdrskin/add_ts_changes_to_libburn_0_2_6
|
||||||
|
- cdrskin/add_ts_changes_to_libburn_0_2_7
|
||||||
|
+ cdrskin/add_ts_changes_to_libburn_0_3_0
|
||||||
|
Updated cdrskin tarball generator
|
||||||
|
|
||||||
|
16 Jan 2007 [tag 626]
|
||||||
|
README
|
||||||
|
Corrected statement about restriction to CD
|
||||||
|
|
||||||
|
16 Jan 2007 [tag 627]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Silenced a compiler warning
|
||||||
|
|
||||||
|
16 Jan 2007 [tag 628]
|
||||||
|
cdrskin/README
|
||||||
|
Corrected name of tarball
|
||||||
|
|
||||||
|
16 Jan 2007 [tag 632]
|
||||||
|
test/telltoc.c
|
||||||
|
Corrected old libburn.pykix.org URL
|
||||||
|
|
||||||
|
16 Jan 2007 [tag 634]
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
Updated web page
|
||||||
|
|
||||||
|
|
||||||
------------------------------- cycle - cdrskin-0.3.0.pl00 - 2007.01.16.120001
|
------------------------------- cycle - cdrskin-0.3.0.pl00 - 2007.01.16.120001
|
||||||
@ -2578,32 +2614,767 @@ Make version number transition to 0.3.0
|
|||||||
* detailed man page for cdrskin
|
* detailed man page for cdrskin
|
||||||
* Burning of DVD+RW and DVD-RAM media as single-track TAO-like initial session
|
* Burning of DVD+RW and DVD-RAM media as single-track TAO-like initial session
|
||||||
* Formatting and then burning to DVD-RW like to DVD+RW
|
* Formatting and then burning to DVD-RW like to DVD+RW
|
||||||
* New option -msifile=path from cdrskit/wodim
|
* New option -msifile=path from cdrkit/wodim
|
||||||
|
|
||||||
|
|
||||||
|
16 Jan 2007 [629]
|
||||||
|
- cdrskin/add_ts_changes_to_libburn_0_2_6
|
||||||
|
- cdrskin/add_ts_changes_to_libburn_0_2_7
|
||||||
|
+ cdrskin/add_ts_changes_to_libburn_0_3_0
|
||||||
|
+ cdrskin/add_ts_changes_to_libburn_0_3_1
|
||||||
|
Updated cdrskin tarball generator
|
||||||
|
|
||||||
|
2007.01.16.151041 [630]
|
||||||
|
Makefile.am
|
||||||
|
configure.ac
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/README
|
||||||
|
cdrskin/compile_cdrskin.sh
|
||||||
|
Made version number transition to 0.3.1
|
||||||
|
|
||||||
|
16 Jan 2007 [631]
|
||||||
|
test/telltoc.c
|
||||||
|
Corrected old libburn.pykix.org URL
|
||||||
|
|
||||||
|
16 Jan 2007 [633]
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
Corrected typo
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.1 - 2007.01.16.152345
|
||||||
|
|
||||||
|
|
||||||
|
16 Jan 2007 [635]
|
||||||
|
cdrskin/changelog.txt
|
||||||
|
Next cdrskin-0.3.1 cycle
|
||||||
|
|
||||||
|
17 Jan 2007 [636]
|
||||||
|
cdrskin/wiki_plain.txt
|
||||||
|
Removed paragraph about obsoleted tao_to_sao_tsize=
|
||||||
|
|
||||||
|
18 Jan 2007 [637]
|
||||||
|
+ doc/cookbook.txt
|
||||||
|
Wrote down what i learned from implementing support for overwriteable DVD
|
||||||
|
|
||||||
|
18 Jan 2007 [638]
|
||||||
|
doc/cookbook.txt
|
||||||
|
More info about Current/Maximum Capacity Descriptor
|
||||||
|
|
||||||
|
18 Jan 2007 [639]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Made clarification about formatting state recognition
|
||||||
|
|
||||||
|
2007.01.18.211740 [640]
|
||||||
|
libburn/transport.h
|
||||||
|
libburn/mmc.c
|
||||||
|
libburn/write.c
|
||||||
|
Kept DVD+RW from stopping BG formatting if it was not started at all
|
||||||
|
|
||||||
|
2007.01.19.110510 [641]
|
||||||
|
libburn/mmc.c
|
||||||
|
Removed forgotten debug message printed to stderr
|
||||||
|
|
||||||
|
19 Jan 2007 [642]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Began to describe TAO multi-session CD writing
|
||||||
|
|
||||||
|
20 Jan 2007 [643]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Changes with CD part. Especially explanation of TOC.
|
||||||
|
|
||||||
|
2007.01.21.190928 [644]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Removed unnecessary after-grab loops
|
||||||
|
|
||||||
|
2007.01.21.191058 [645]
|
||||||
|
libburn/write.c
|
||||||
|
Comments learned from studying MMC-3 and MMC-5 for SAO CD cookbook
|
||||||
|
|
||||||
|
21 Jan 2007 [646]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Clarification about TAO and mode page 05h per track
|
||||||
|
|
||||||
|
2007.01.22.114245 [647]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/write.c
|
||||||
|
libburn/async.c
|
||||||
|
libburn/libdax_msgs.h
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Bug fix: Banned mixed mode SAO (because broken in libburn and unclear in MMC)
|
||||||
|
|
||||||
|
23 Jan 2007 [648]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Added SAO CD Cookbook
|
||||||
|
|
||||||
|
23 Jan 2007 [649]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Corrections of typos and text debris
|
||||||
|
|
||||||
|
2007.01.25.145846 [652]
|
||||||
|
libburn/structure.c
|
||||||
|
Bug fix: DVD tracks of defined size >=2GB suffered 32-bit integer wraparound
|
||||||
|
|
||||||
|
2007.01.25.185214 [655]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/write.c
|
||||||
|
libburn/structure.h
|
||||||
|
libburn/structure.c
|
||||||
|
libburn/file.h
|
||||||
|
libburn/file.c
|
||||||
|
Enforce minimum track length with SAO
|
||||||
|
|
||||||
|
2007.01.25.180001 [tag 656]
|
||||||
|
libburn_0_3_0_1/libburn/structure.c
|
||||||
|
libburn_0_3_0_1/cdrskin/cdrskin_timestamp.h
|
||||||
|
libburn_0_3_0_1/cdrskin/README
|
||||||
|
Bug fix: DVD tracks of defined size >=2GB suffered 32-bit integer wraparound
|
||||||
|
|
||||||
|
26 Jan 2007 [tag 657]
|
||||||
|
libburn_0_3_0_1/cdrskin/cdrskin_eng.html
|
||||||
|
Mentioned new cdrskin patch level 01
|
||||||
|
|
||||||
|
26 Jan 2007 [658]
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
Now offering cdrskin-0.3.0.pl01 for download
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.1 - 2007.01.26.111920
|
||||||
|
|
||||||
|
2007.01.26.173236 [659]
|
||||||
|
libburn/file.h
|
||||||
|
libburn/file.c
|
||||||
|
Unified burn_file_source and burn_fd_source
|
||||||
|
|
||||||
|
27 Jan 2007 [660]
|
||||||
|
libburn/null.c
|
||||||
|
Initialized member set_size of burn_source within burn_null_source_new()
|
||||||
|
|
||||||
|
27 Jan 2007 [tag 661]
|
||||||
|
libburn_0_3_0_1/libburn/file.c
|
||||||
|
Removed 1.3 GB curbs for sources created by burn_file_source_new()
|
||||||
|
|
||||||
|
29 Jan 2007 [662]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Added a statement about blanking of DVD-RW
|
||||||
|
|
||||||
|
2007.01.29.175822 [663]
|
||||||
|
libburn/transport.h
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/write.c
|
||||||
|
libburn/mmc.c
|
||||||
|
Experiments about list of features and profiles
|
||||||
|
|
||||||
|
2007.01.30.165317 [664]
|
||||||
|
libburn/write.c
|
||||||
|
libburn/mmc.c
|
||||||
|
Preparations for DVD-R[W] Sequential Recording
|
||||||
|
|
||||||
|
2007.01.30.191740 [665]
|
||||||
|
libburn/write.c
|
||||||
|
libburn/mmc.c
|
||||||
|
First successful multi-session write to a sequential DVD-RW
|
||||||
|
|
||||||
|
30 Jan 2007 [666]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Added snapshot of emerging sequential DVD-R[W] cookbook
|
||||||
|
|
||||||
|
2007.01.30.220220 [667]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Enabled Burnfree buffer underrun protection by default
|
||||||
|
|
||||||
|
2007.01.31.130100 [668]
|
||||||
|
libburn/async.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Blank sequential DVD-RW, deformat overwriteable DVD-RW
|
||||||
|
|
||||||
|
2007.01.31.173611 [669]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/transport.h
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/mmc.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Provisorily obtain multi-session -C parameters (violates MMC specs but works)
|
||||||
|
|
||||||
|
2007.02.01.161634 [670]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/transport.h
|
||||||
|
libburn/mmc.c
|
||||||
|
test/telltoc.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Obtain TOC from non-CD via 52h READ TRACK INFORMATION
|
||||||
|
|
||||||
|
2007.02.01.163511 [671]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Reacted on justified compiler warning about unitialized sessions variable
|
||||||
|
|
||||||
|
2007.02.01.191638 [672]
|
||||||
|
libburn/mmc.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Allow blanking of DVD-RW which offer no Incremental Streaming
|
||||||
|
|
||||||
|
1 Feb 2007 [673]
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
cdrskin/README
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Prepared next cdrskin-0.3.1 cycle
|
||||||
|
|
||||||
|
1 Feb 2007 [674]
|
||||||
|
cdrskin/changelog.txt
|
||||||
|
Prepared next cdrskin-0.3.1 cycle
|
||||||
|
|
||||||
|
1 Feb 2007 [675] [676]
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Mentioned DVD-RW multi-session in overview of features
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.1 - 2007.02.01.203057
|
||||||
|
* Burnfree enabled by default
|
||||||
|
* Multi-session recording on sequential DVD-RW, including -toc, -msinfo
|
||||||
|
|
||||||
|
|
||||||
|
2 Feb 2007 [677]
|
||||||
|
cdrskin/convert_man_to_html.sh
|
||||||
|
Some sed expressions for beautification
|
||||||
|
|
||||||
|
2 Feb 2007 [678]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Updated about DVD-R[W] blanking, multi-session info and TOC
|
||||||
|
|
||||||
|
2007.02.02.151327 [679]
|
||||||
|
libburn/mmc.c
|
||||||
|
test/telltoc.c
|
||||||
|
Make mmc_read_multi_session_c1 use TOC if available
|
||||||
|
|
||||||
|
2007.02.02.173345 [680]
|
||||||
|
libburn/mmc.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Improved classification and TOC of finalized DVD-R[W] media
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.1 - 2007.02.02.183755
|
||||||
|
|
||||||
|
3 Feb 2007 [681]
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
cdrskin/wiki_plain.txt
|
||||||
|
Mentioned DVD-RW multi-session
|
||||||
|
|
||||||
|
2007.02.03.205526 (comitted 4 Feb 2007) [682]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/mmc.c
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/async.c
|
||||||
|
test/telltoc.c
|
||||||
|
New in API : struct burn_multi_caps and burn_disc_get_multi_caps()
|
||||||
|
|
||||||
|
2007.02.05.132335 [683]
|
||||||
|
libburn/transport.h
|
||||||
|
libburn/mmc.c
|
||||||
|
Preparations for DVD-R[W] DAO
|
||||||
|
|
||||||
|
2007.02.06.130410 [684]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/mmc.c
|
||||||
|
libburn/write.c
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/libdax_msgs.h
|
||||||
|
Implemented DVD-R[W] DAO as BURN_WRITE_SAO
|
||||||
|
|
||||||
|
2007.02.06.170621 [685]
|
||||||
|
libburn/write.c
|
||||||
|
libburn/mmc.c
|
||||||
|
Beautification of debugging messages
|
||||||
|
|
||||||
|
2007.02.06.174320 [686]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
tao_to_sao_tsize= for DVD-R[W] DAO
|
||||||
|
|
||||||
|
2007.02.06.185534 [687]
|
||||||
|
libburn/async.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Enabled fast blank for DVD-R[W]
|
||||||
|
|
||||||
|
6 Feb 2007 [688]
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Clarified CD and DVD peculiarities
|
||||||
|
|
||||||
|
6 Feb 2007 [689]
|
||||||
|
doc/cookbook.txt
|
||||||
|
Described DVD-R[W] DAO mode
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.1 - 2007.02.06.200802
|
||||||
|
* DVD-R[W] Disk-at-once writing
|
||||||
|
|
||||||
|
6 Feb 2007 [690]
|
||||||
|
cdrskin/README
|
||||||
|
cdrskin/changelog.txt
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
Next cdrskin-0.3.1 cycle
|
||||||
|
|
||||||
|
2007.02.07.162836 [691]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/drive.h
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/options.c
|
||||||
|
libburn/libdax_msgs.h
|
||||||
|
New API function burn_write_opts_auto_write_type()
|
||||||
|
|
||||||
|
7 Feb 2007 [692]
|
||||||
|
test/libburner.c
|
||||||
|
Made use of burn_write_opts_auto_write_type()
|
||||||
|
|
||||||
|
7 Feb 2007 [693]
|
||||||
|
test/libburner.c
|
||||||
|
doc/comments
|
||||||
|
Updated documentation aspects
|
||||||
|
|
||||||
|
8 Feb 2007 [694]
|
||||||
|
README
|
||||||
|
doc/comments
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
cdrskin/README
|
||||||
|
Finally made tests with DVD-R. They burn indeed like DVD-RW.
|
||||||
|
|
||||||
|
2007.02.08.210744 [695]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
New option --prodvd_cli_compatible
|
||||||
|
|
||||||
|
8 Feb 2007 [696]
|
||||||
|
cdrskin/wiki_plain.txt
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
Mentioned DVD-R
|
||||||
|
|
||||||
|
2007.02.08.225208 [697]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Silenced compiler warning
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.1 - 2007.02.09.074058
|
||||||
|
|
||||||
|
9 Feb 2006 [698]
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
Added special thanks towards Andy Polyakov
|
||||||
|
|
||||||
|
9 Feb 2006 [699]
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
doc/cookbook.txt
|
||||||
|
Small corrections in documentation
|
||||||
|
|
||||||
|
10 Feb 2007 [tag 701] [705]
|
||||||
|
- cdrskin/add_ts_changes_to_libburn_0_3_0
|
||||||
|
- cdrskin/add_ts_changes_to_libburn_0_3_1
|
||||||
|
+ cdrskin/add_ts_changes_to_libburn_0_3_2
|
||||||
|
+ cdrskin/add_ts_changes_to_libburn_0_3_3
|
||||||
|
Updated cdrskin tarball generator
|
||||||
|
|
||||||
|
2007.02.10.120001 [tag 702] [704]
|
||||||
|
Makefile.am
|
||||||
|
configure.ac
|
||||||
|
README
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/README
|
||||||
|
cdrskin/compile_cdrskin.sh
|
||||||
|
cdrskin/cdrskin_timestamp.h
|
||||||
|
cdrskin/wiki_plain.txt
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
Made number transition and activated development documentation
|
||||||
|
|
||||||
|
10 Feb 2007 [tag 703] [707]
|
||||||
|
cdrskin/changelog.txt
|
||||||
|
Documented changes and 0.3.2 release timestamp
|
||||||
|
|
||||||
|
|
||||||
|
----------------------------- release - cdrskin-0.3.2.pl00 - 2007.02.10.120001
|
||||||
|
* Burnfree enabled by default
|
||||||
|
* Multi-session recording on sequential DVD-R[W], including -toc, -msinfo
|
||||||
|
* DVD-R[W] Disk-at-once recording
|
||||||
|
|
||||||
|
|
||||||
|
10 Feb 2007 [706]
|
||||||
|
libburn/mmc.c
|
||||||
|
Added a comment about DVD-R
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.3 - 2007.02.10.190528
|
||||||
|
|
||||||
|
|
||||||
|
12 Feb 2007 [708]
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Being exacting about on-the-fly and DVD-RW
|
||||||
|
|
||||||
|
|
||||||
|
12 Feb 2007 [709]
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
Updated list of keywords
|
||||||
|
|
||||||
|
2007.02.12.142245 [710]
|
||||||
|
libburn/mmc.c
|
||||||
|
Made profile 0010h DVD-ROM suitable,full,not erasable. So it delivers a TOC.
|
||||||
|
|
||||||
|
|
||||||
|
2007.02.13.115459 [711]
|
||||||
|
libburn/spc.c
|
||||||
|
Set a suitable page 05h after spc_probe_write_modes()
|
||||||
|
|
||||||
|
2007.02.13.143718 [712]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/transport.h
|
||||||
|
libburn/mmc.c
|
||||||
|
libburn/spc.c
|
||||||
|
libburn/drive.c
|
||||||
|
Mew API function burn_disc_available_space()
|
||||||
|
|
||||||
|
13 Feb 2007 [713]
|
||||||
|
test/libburner.c
|
||||||
|
Removed or updated outdated restriction statements
|
||||||
|
|
||||||
|
13 Feb 2007 [714]
|
||||||
|
test/telltoc.c
|
||||||
|
Applied new API function burn_disc_available_space()
|
||||||
|
|
||||||
|
2007.02.14.120213 [715]
|
||||||
|
libburn/spc.c
|
||||||
|
Removed outdated ifdef
|
||||||
|
|
||||||
|
14 Feb 2007 [716]
|
||||||
|
test/telltoc.c
|
||||||
|
Set the advised write mode before inquiring media space
|
||||||
|
|
||||||
|
2007.02.14.121440 [717]
|
||||||
|
libburn/libdax_msgs.h
|
||||||
|
libburn/mmc.c
|
||||||
|
Handle eventual ridiculously high d->last_track_no
|
||||||
|
|
||||||
|
2007.02.14.122218 [718]
|
||||||
|
libburn/mmc.h
|
||||||
|
Forgotten part of revision 718
|
||||||
|
|
||||||
|
2007.02.14.202944 [719]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/options.h
|
||||||
|
libburn/options.c
|
||||||
|
libburn/structure.h
|
||||||
|
libburn/structure.c
|
||||||
|
libburn/write.c
|
||||||
|
libburn/drive.c
|
||||||
|
Optional padding up to full media size when closing (incomplete yet)
|
||||||
|
|
||||||
|
2007.02.14.203635 [720]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
New options --fill_up_media and --tell_media_space
|
||||||
|
|
||||||
|
2007.02.15.201506 [722]
|
||||||
|
libburn/options.c
|
||||||
|
libburn/drive.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
libburn/write.c
|
||||||
|
Took fill_up_media into respect with automatic write mode decisions
|
||||||
|
|
||||||
|
2007.02.15.201651 [723]
|
||||||
|
libburn/transport.h
|
||||||
|
libburn/mmc.c
|
||||||
|
libburn/libdax_msgs.h
|
||||||
|
Installed a guardian for predicted track end
|
||||||
|
|
||||||
|
2007.02.15.201757 [724]
|
||||||
|
libburn/structure.c
|
||||||
|
Corrected bug about open_ended filluped tracks
|
||||||
|
|
||||||
|
15 Feb 2007 [725]
|
||||||
|
libburn/libburn.h
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Clarifications about current state of fillup
|
||||||
|
|
||||||
|
2007.02.15.203448 [726]
|
||||||
|
libburn/write.c
|
||||||
|
Repaired debugging message spoiled by uninitialized variable
|
||||||
|
|
||||||
|
2007.02.16.111941 [728]
|
||||||
|
libburn/write.c
|
||||||
|
Corrected CD TAO bug introduced with DVD bug fix 724 and CD SAO change 655
|
||||||
|
|
||||||
|
2007.02.17.085118 [729]
|
||||||
|
libburn/structure.c
|
||||||
|
Another bug fix for revision 724
|
||||||
|
|
||||||
|
2007.02.17.085533 [730]
|
||||||
|
libburn/async.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
test/libburner.c
|
||||||
|
Allowed forceful blanking of blank media in burn_disc_erase()
|
||||||
|
|
||||||
|
17 Feb 2007 [731]
|
||||||
|
test/libburner.c
|
||||||
|
Removed unprecise unnecessary comment
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.3 - 2007.02.17.121238
|
||||||
|
* New option --tell_media_space tells the maximum size for the next burn
|
||||||
|
|
||||||
|
|
||||||
|
2007.02.18.094414 [732]
|
||||||
|
libburn/libburn.h
|
||||||
|
Clarified usage comment with burn_drive_info_free() (see ticket 98)
|
||||||
|
|
||||||
|
18 Feb 2007 [733]
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
cdrskin/changelog.txt
|
||||||
|
Next cdrskin-0.3.3 cycle
|
||||||
|
|
||||||
|
|
||||||
|
2007.02.18.094858 [734]
|
||||||
|
libburn/mmc.h
|
||||||
|
Adjusted maximum realistic number of tracks to MMC specs
|
||||||
|
|
||||||
|
2007.02.19.184132 [735]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Repaired slightly broken pacifier track size display with -audio
|
||||||
|
|
||||||
|
2007.02.19.225102 [736]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/async.c
|
||||||
|
libburn/structure.h
|
||||||
|
libburn/structure.c
|
||||||
|
libburn/write.h
|
||||||
|
libburn/write.c
|
||||||
|
libburn/drive.h
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/options.c
|
||||||
|
libburn/libdax_msgs.h
|
||||||
|
Re-arranged checking and defaulting of write parameters
|
||||||
|
=
|
||||||
|
New API function burn_track_set_default_size()
|
||||||
|
New API function burn_precheck_write()
|
||||||
|
Make wide use of burn_disc_write_mode_demands()
|
||||||
|
|
||||||
|
2007.02.21.205244 [737]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/async.c
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/options.c
|
||||||
|
libburn/structure.c
|
||||||
|
libburn/write.c
|
||||||
|
libburn/libdax_msgs.h
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Moved tao_to_sao_tsize into libburn, let cdrskin use auto_write_type and precheck
|
||||||
|
|
||||||
|
21 Feb 2007 [738]
|
||||||
|
cdrskin/add_ts_changes_to_libburn_0_3_3
|
||||||
|
cdrskin/add_ts_changes_to_libburn_0_3_2
|
||||||
|
Added -O2 to binary production
|
||||||
|
|
||||||
|
2007.02.22.072700 [739]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/options.c
|
||||||
|
Re-enabled overwriteable pseudo-pseudo-SAO with unpredicted track size
|
||||||
|
|
||||||
|
2007.02.22.073157 [740]
|
||||||
|
libburn/mmc.c
|
||||||
|
Disabled debugging messages about format descriptors
|
||||||
|
|
||||||
|
2007.02.22.094939 [741]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/options.c
|
||||||
|
libburn/write.c
|
||||||
|
libburn/async.c
|
||||||
|
test/libburner.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Macro for length of rejection reasons string (old size is still safe)
|
||||||
|
|
||||||
|
2007.02.22.113016 [742]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/drive.c
|
||||||
|
Made burn_disc_available_space() take into respect burn_write_opts_set_start_byte()
|
||||||
|
|
||||||
|
2007.02.23.190937 [743]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/mmc.c
|
||||||
|
libburn/write.c
|
||||||
|
doc/cookbook.txt
|
||||||
|
Enabled DVD-R/DL Sequential via burn_allow_untested_profiles()
|
||||||
|
|
||||||
|
2007.02.23.191117 [744]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Enabled DVD-R/DL Sequential via --allow_untested_media_types
|
||||||
|
|
||||||
|
2007.02.23.193427 [745]
|
||||||
|
libburn/init.c
|
||||||
|
Forgotten source file for revision 743
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.3 - 2007.02.24.102731
|
||||||
|
|
||||||
|
|
||||||
|
2007.02.25.112733 [746]
|
||||||
|
libburn/write.h
|
||||||
|
libburn/write.c
|
||||||
|
libburn/drive.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Took into respect deliberate lack of DVD-R/DL multi session capability
|
||||||
|
|
||||||
|
2007.03.01.120945 [747]
|
||||||
|
libburn/drive.c
|
||||||
|
libburn/mmc.c
|
||||||
|
libburn/write.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
doc/cookbook.txt
|
||||||
|
Preparations for supporting DVD+R[/DL]
|
||||||
|
|
||||||
|
3 Mar 2007 [748]
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
Updated DVD-R[W] write mode description
|
||||||
|
|
||||||
|
2007.03.03.141240 [749]
|
||||||
|
libburn/transport.h
|
||||||
|
libburn/mmc.c
|
||||||
|
Determine physical interface SCSI,ATA,SATA,USB,... (for future use)
|
||||||
|
|
||||||
|
2007.03.03.141435 [750]
|
||||||
|
libburn/libburn.h
|
||||||
|
libburn/write.c
|
||||||
|
libburn/options.h
|
||||||
|
libburn/options.c
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
Re-enabled -force with write modes which seem unavailable
|
||||||
|
|
||||||
|
2007.03.03.151812 [751]
|
||||||
|
libburn/options.c
|
||||||
|
Fixed bug introduced with rev 736ff which prevented audio CD burning
|
||||||
|
|
||||||
|
2007.03.04.184720 [752]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrfifo.c
|
||||||
|
Fifo got stuck if sum of processed track sizes was exactly aligned to fifo size
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.3 - 2007.03.04.185202
|
||||||
|
* Bug fix: Multi-track runs with fifo could stall in rare cases
|
||||||
|
|
||||||
|
5 Mar 2007 [753]
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
cdrskin/add_ts_changes_to_libburn_0_3_2
|
||||||
|
Released cdrskin-0.3.2.pl01
|
||||||
|
|
||||||
|
2007.03.06.195203 [754]
|
||||||
|
libburn/mmc.c
|
||||||
|
libburn/write.c
|
||||||
|
Enabled DVD+R, DVD+R DL via --allow_untested_media_types, always -multi for now
|
||||||
|
|
||||||
|
2007.03.06.205312 [755]
|
||||||
|
libburn/mmc.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
doc/cookbook.txt
|
||||||
|
doc/comments
|
||||||
|
Enabled DVD+R as tested media (-multi is still always on)
|
||||||
|
|
||||||
|
2007.03.07.151514 [756]
|
||||||
|
libburn/write.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
cdrskin/README
|
||||||
|
doc/cookbook.txt
|
||||||
|
Some adjustments for DVD+R recording
|
||||||
|
|
||||||
|
2007.03.07.151514 [756]
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
cdrskin/changelog.txt
|
||||||
|
Next cdrskin-0.3.3 cycle
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.3 - 2007.03.07.155750
|
||||||
|
* Multi-session burning to DVD+R
|
||||||
|
|
||||||
|
|
||||||
|
8 Mar 2007 [757]
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
cdrskin/convert_man_to_html.sh
|
||||||
|
cdrskin/wiki_plain.txt
|
||||||
|
Polished documentation
|
||||||
|
|
||||||
|
2007.03.09.134622 [758]
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
New option assert_write_lba=
|
||||||
|
|
||||||
|
10 Mar 2007 [759]
|
||||||
|
cdrskin/cdrskin.1
|
||||||
|
cdrskin/wiki_plain.txt
|
||||||
|
Polished documentation
|
||||||
|
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.3 - 2007.03.10.
|
||||||
|
* New option assert_write_lba=
|
||||||
|
|
||||||
|
2007.03.12.110001 [tag 761]
|
||||||
|
Makefile.am
|
||||||
|
configure.ac
|
||||||
|
README
|
||||||
|
cdrskin/cdrskin.c
|
||||||
|
cdrskin/README
|
||||||
|
cdrskin/compile_cdrskin.sh
|
||||||
|
cdrskin/cdrskin_timestamp.h
|
||||||
|
cdrskin/cdrskin_eng.html
|
||||||
|
Made number transition to 0.3.4 and activated development documentation
|
||||||
|
|
||||||
|
12 Mar 2007 [tag 762]
|
||||||
|
- cdrskin/add_ts_changes_to_libburn_0_3_2
|
||||||
|
- cdrskin/add_ts_changes_to_libburn_0_3_3
|
||||||
|
+ cdrskin/add_ts_changes_to_libburn_0_3_4
|
||||||
|
+ cdrskin/add_ts_changes_to_libburn_0_3_5
|
||||||
|
Updated cdrskin tarball generator
|
||||||
|
|
||||||
|
12 Mar 2007 [tag ]
|
||||||
|
cdrskin/changelog.txt
|
||||||
|
Documented most recent changes
|
||||||
|
|
||||||
|
----------------------------- release - cdrskin-0.3.4.pl00 - 2007.03.12.110001
|
||||||
|
* Multi-session burning to DVD+R
|
||||||
|
* New option --tell_media_space tells the maximum size for the next burn
|
||||||
|
* New option assert_write_lba=
|
||||||
|
* Bug fix: Multi-track runs with fifo could stall in rare cases
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
TODO
|
||||||
|
===============================================================================
|
||||||
|
|
||||||
|
------------------------------------ cycle - cdrskin-0.3.3 -
|
||||||
|
|
||||||
|
cdrskin: prevent usage of burn drive as track source
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Post cdrskin/wiki_plain.txt
|
What about minimum track sizes ? (POWER OFF/ON , BUS RESET ?)
|
||||||
|
|
||||||
|
How to handle finalizing ?
|
||||||
|
growisofs does not finalize multi-session DVD[+-]R unless padding up. Why ?
|
||||||
|
|
||||||
|
Make wide use of mmc_four_char_to_int(), mmc_int_to_four_char()
|
||||||
|
|
||||||
|
Think about cdrecord option minbuf= for simultaneous operation on hdc and hdd
|
||||||
|
|
||||||
|
After cooking: review of -do_diet ?
|
||||||
|
|
||||||
|
growisofs.c : _LINUX_CAPABILITY_VERSION CAP_SYS_RAWIO SYS_capset ?
|
||||||
|
|
||||||
|
Questions to post:
|
||||||
|
A70211_to_cdwrite_growisofs_question_finalizing
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Format DVD-RAM ?
|
Format DVD-RAM ?
|
||||||
|
Disable error checking with DVD-RAM.
|
||||||
|
|
||||||
How to handle finalizing ?
|
|
||||||
|
|
||||||
Check wether current_profile is kept up to date with each possible media change
|
|
||||||
|
|
||||||
Make drive_info reflect DVD capabilities
|
|
||||||
Make proper use of reflected capabilities (e.g. in burn_drive_inquire_media())
|
|
||||||
|
|
||||||
Rectify mmc_read_atip speed interpretation. 12x media are reported as 10x. I never heard of 6x media.
|
Rectify mmc_read_atip speed interpretation. 12x media are reported as 10x. I never heard of 6x media.
|
||||||
|
|
||||||
|
|
||||||
Sequentially check option list for DVD compliance
|
Sequentially check option list for DVD compliance
|
||||||
|
|
||||||
|
|
||||||
(Learn about multi-track with DVD-RW Restricted Overwrite.) My drives don't offer
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
----------------------------------------- long term intentions:
|
----------------------------------------- long term intentions:
|
||||||
|
|
||||||
[]
|
[]
|
||||||
@ -2619,7 +3390,6 @@ Open O_EXCL all devices in address resolution chain
|
|||||||
(Might help with non-standard hdX device siblings)
|
(Might help with non-standard hdX device siblings)
|
||||||
|
|
||||||
[]
|
[]
|
||||||
Convert libburn_experimental: into LIBDAX_MSGS_SEV_DEBUG
|
|
||||||
Convert burn_print() into libdax_msgs_submit()
|
Convert burn_print() into libdax_msgs_submit()
|
||||||
|
|
||||||
[]
|
[]
|
||||||
@ -2629,7 +3399,8 @@ Test unlocking of single drive by burn_drive_grab(), burn_drive_release()
|
|||||||
[]
|
[]
|
||||||
Clear outdated persistent read buffer after small CD image was read (ticket 57)
|
Clear outdated persistent read buffer after small CD image was read (ticket 57)
|
||||||
|
|
||||||
[]
|
|
||||||
Enable multi-session for write modes other than TAO
|
|
||||||
|
|
||||||
|
|
||||||
|
===============================================================================
|
||||||
|
This is the dirty end of the todo list.
|
||||||
|
For most recent changelog entries scroll up about 100 lines.
|
||||||
|
===============================================================================
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
debug_opts=
|
debug_opts=
|
||||||
def_opts=
|
def_opts=
|
||||||
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
|
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
|
||||||
libvers="-DCdrskin_libburn_0_3_0"
|
libvers="-DCdrskin_libburn_0_3_4"
|
||||||
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"
|
||||||
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
|
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
|
||||||
@ -33,15 +33,15 @@ do
|
|||||||
libdax_audioxtr_o=
|
libdax_audioxtr_o=
|
||||||
libdax_msgs_o="libburn/message.o"
|
libdax_msgs_o="libburn/message.o"
|
||||||
cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c"
|
cleanup_src_or_obj="-DCleanup_has_no_libburn_os_H cdrskin/cleanup.c"
|
||||||
elif test "$i" = "-libburn_0_3_0"
|
elif test "$i" = "-libburn_0_3_4"
|
||||||
then
|
then
|
||||||
libvers="-DCdrskin_libburn_0_3_0"
|
libvers="-DCdrskin_libburn_0_3_4"
|
||||||
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
|
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
|
||||||
libdax_msgs_o="libburn/libdax_msgs.o"
|
libdax_msgs_o="libburn/libdax_msgs.o"
|
||||||
cleanup_src_or_obj="libburn/cleanup.o"
|
cleanup_src_or_obj="libburn/cleanup.o"
|
||||||
elif test "$i" = "-libburn_svn"
|
elif test "$i" = "-libburn_svn"
|
||||||
then
|
then
|
||||||
libvers="-DCdrskin_libburn_0_3_1"
|
libvers="-DCdrskin_libburn_0_3_5"
|
||||||
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
|
libdax_audioxtr_o="libburn/libdax_audioxtr.o"
|
||||||
libdax_msgs_o="libburn/libdax_msgs.o"
|
libdax_msgs_o="libburn/libdax_msgs.o"
|
||||||
cleanup_src_or_obj="libburn/cleanup.o"
|
cleanup_src_or_obj="libburn/cleanup.o"
|
||||||
@ -79,7 +79,7 @@ do
|
|||||||
echo " -compile_cdrfifo compile program cdrskin/cdrfifo."
|
echo " -compile_cdrfifo compile program cdrskin/cdrfifo."
|
||||||
echo " -compile_dewav compile program test/dewav without libburn."
|
echo " -compile_dewav compile program test/dewav without libburn."
|
||||||
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_3_0 set macro to match libburn-0.3.0."
|
echo " -libburn_0_3_4 set macro to match libburn-0.3.4."
|
||||||
echo " -libburn_svn set macro to match current libburn-SVN."
|
echo " -libburn_svn set macro to match current libburn-SVN."
|
||||||
echo " -no_largefile do not use 64 bit off_t (must match libburn)."
|
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."
|
||||||
|
@ -43,11 +43,15 @@ then
|
|||||||
-e 's/<h1 align=center>CDRSKIN<\/h1>/<h1 align=center>man 1 cdrskin<\/h1>/' \
|
-e 's/<h1 align=center>CDRSKIN<\/h1>/<h1 align=center>man 1 cdrskin<\/h1>/' \
|
||||||
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
|
-e 's/<body>/<body BGCOLOR="#F5DEB3" TEXT=#000000 LINK=#0000A0 VLINK=#800000>/' \
|
||||||
-e 's/<b>Overview of features:<\/b>/\ <BR><b>Overview of features:<\/b>/' \
|
-e 's/<b>Overview of features:<\/b>/\ <BR><b>Overview of features:<\/b>/' \
|
||||||
|
-e 's/<b>General information paragraphs:<\/b>/\ <BR><b>General information paragraphs:<\/b>/' \
|
||||||
-e 's/<b>Track recording model:<\/b>/\ <BR><b>Track recording model:<\/b>/' \
|
-e 's/<b>Track recording model:<\/b>/\ <BR><b>Track recording model:<\/b>/' \
|
||||||
-e 's/In general there are two types of tracks: data and audio./\ <BR>In general there are two types of tracks: data and audio./' \
|
-e 's/In general there are two types of tracks: data and audio./\ <BR>In general there are two types of tracks: data and audio./' \
|
||||||
-e 's/While audio tracks just contain a given/\ <BR>While audio tracks just contain a given/' \
|
-e 's/While audio tracks just contain a given/\ <BR>While audio tracks just contain a given/' \
|
||||||
|
-e 's/<b>Write mode selection:<\/b>/\ <BR><b>Write mode selection:<\/b>/' \
|
||||||
-e 's/<b>Recordable CD Media:<\/b>/\ <BR><b>Recordable CD Media:<\/b>/' \
|
-e 's/<b>Recordable CD Media:<\/b>/\ <BR><b>Recordable CD Media:<\/b>/' \
|
||||||
-e 's/<b>Recordable DVD Media:<\/b>/\ <BR><b>Recordable DVD Media:<\/b>/' \
|
-e 's/<b>Overwriteable DVD Media:<\/b>/\ <BR><b>Overwriteable DVD Media:<\/b>/' \
|
||||||
|
-e 's/<b>Sequentially Recordable DVD Media:<\/b>/\ <BR><b>Sequentially Recordable DVD Media:<\/b>/' \
|
||||||
|
-e 's/The write modes for DVD+R/\ <BR>The write modes for DVD+R/' \
|
||||||
-e 's/<b>Drive preparation and addressing:<\/b>/\ <BR><b>Drive preparation and addressing:<\/b>/' \
|
-e 's/<b>Drive preparation and addressing:<\/b>/\ <BR><b>Drive preparation and addressing:<\/b>/' \
|
||||||
-e 's/If you only got one CD capable drive/\ <BR>If you only got one CD capable drive/' \
|
-e 's/If you only got one CD capable drive/\ <BR>If you only got one CD capable drive/' \
|
||||||
-e 's/^Alphabetical list of options/\ <BR>Alphabetical list of options/' \
|
-e 's/^Alphabetical list of options/\ <BR>Alphabetical list of options/' \
|
||||||
@ -59,7 +63,7 @@ then
|
|||||||
|
|
||||||
chmod u+rw,go+r,go-w "$htmlpage"
|
chmod u+rw,go+r,go-w "$htmlpage"
|
||||||
echo "Emerged file:"
|
echo "Emerged file:"
|
||||||
ls -l "$htmlpage"
|
ls -lL "$htmlpage"
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
|
@ -7,8 +7,12 @@
|
|||||||
|
|
||||||
Its paragon, cdrecord, is a powerful GPL'ed burn program included in Joerg
|
Its paragon, cdrecord, is a powerful GPL'ed burn program included in Joerg
|
||||||
Schilling's cdrtools. cdrskin strives to be a second source for the services
|
Schilling's cdrtools. cdrskin strives to be a second source for the services
|
||||||
traditionally provided by cdrecord. Currently it does CD-R and CD-RW.
|
traditionally provided by cdrecord. Currently it does CD-R and CD-RW this way.
|
||||||
Its future ability to burn DVD media depends on the development of libburn.
|
Overwriteable media DVD-RAM, DVD+RW and DVD-RW are handled differently than
|
||||||
|
with cdrecord-ProDVD in order to offer TAO-like single track recording.
|
||||||
|
Sequential DVD-R[W] and DVD+R are handled like CD-R[W] with TAO and
|
||||||
|
multi-session. Additionally cdrskin offers cdrecord-ProDVD-like mode DAO
|
||||||
|
with DVD-R[W].
|
||||||
|
|
||||||
cdrskin does not contain any bytes copied from cdrecord's sources.
|
cdrskin does not contain any bytes copied from cdrecord's sources.
|
||||||
Many bytes have been copied from the message output of cdrecord
|
Many bytes have been copied from the message output of cdrecord
|
||||||
@ -19,14 +23,9 @@ About libburn API for burning CD: http://libburnia-api.pykix.org
|
|||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
Appending sessions to an unclosed CD is restricted to write mode TAO.
|
For dual layer DVD types and for appending sessions to ISO filesystems on
|
||||||
(Users who have a burner which succeeds with a follow-up session via
|
DVD other than DVD-RW, DVD-R, DVD+R see the advise to use dvd+rw-tools at
|
||||||
cdrecord -sao : please contact us.)
|
the end of this text.
|
||||||
|
|
||||||
The development version of cdrskin is able to burn a single track to DVD+RW
|
|
||||||
or DVD-RW media.
|
|
||||||
For other DVD types and for appending sessions to ISO filesystems see the
|
|
||||||
advise to use dvd+rw-tools at the end of this text.
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -83,20 +82,64 @@ has to offer both, r- and w-permission.
|
|||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
Non-cdrecord blank mode blank=format_overwrite is needed to bring a DVD-RW
|
The DVD capabilities of cdrskin differ from those of cdrecord-ProDVD. cdrskin
|
||||||
|
offers TAO-like multi-session with DVD-R[W], DVD+R and TAO-like single session
|
||||||
|
with overwriteable DVD media. It also offers DAO on DVD-R[W] which is probably
|
||||||
|
the same as the traditional cdrecord-ProDVD write mode.
|
||||||
|
|
||||||
|
Non-cdrecord blank mode blank=format_overwrite brings a DVD-RW
|
||||||
disc from its initial profile "Sequential Recording" into profile state
|
disc from its initial profile "Sequential Recording" into profile state
|
||||||
"Restricted Overwrite". The latter is usable with cdrskin.
|
"Restricted Overwrite".
|
||||||
{{{
|
{{{
|
||||||
cdrskin dev=/dev/sr0 -v blank=format_overwrite
|
cdrskin dev=/dev/sr0 -v blank=format_overwrite
|
||||||
}}}
|
}}}
|
||||||
|
|
||||||
DVD-RW "Restricted Overwrite" and DVD+RW appear to cdrskin as blank media
|
DVD-RAM, DVD+RW and overwriteable DVD-RW appear to cdrskin as blank media
|
||||||
which are capable of taking only a single track. This track may be positioned
|
which are capable of taking only a single track. This track may be positioned
|
||||||
on a 32KiB aligned address, though.
|
on a 32KiB aligned address, though.
|
||||||
{{{
|
{{{
|
||||||
cdrskin ... write_start_address=2412m ...
|
cdrskin ... write_start_address=2412m ...
|
||||||
}}}
|
}}}
|
||||||
|
|
||||||
|
Non-cdrecord blank mode blank=deformat_sequential brings an overwriteable
|
||||||
|
DVD-RW back into state "Sequential Recording" with the capability of doing
|
||||||
|
multi-session, if the drive is capable of "Incremental Streaming"
|
||||||
|
(MMC feature 21h).
|
||||||
|
|
||||||
|
Used sequential DVD-RW media may be blanked by blank=fast or blank=all which
|
||||||
|
normally both do full blanking.
|
||||||
|
|
||||||
|
blank=deformat_sequential does minimal blanking of DVD-RW which usually yields
|
||||||
|
media incapable of "Incremental Streaming".
|
||||||
|
|
||||||
|
Option --prodvd_cli_compatible activates blank=fast and blank=all for
|
||||||
|
overwriteable DVD-RW which normally ignore those two options. It also makes
|
||||||
|
option -multi tolerable with media and write modes which are not suitable for
|
||||||
|
multi-session. (The default behavior of cdrskin deems me to be preferrable.)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
assert_write_lba=<lba> allows to ensure that the start block address which
|
||||||
|
was used with the formatter program (e.g. mkisofs -C) matches the start block
|
||||||
|
address which will be used by the upcoming burn.
|
||||||
|
|
||||||
|
E.g. cdrskin aborts with an error message if
|
||||||
|
{{{
|
||||||
|
assert_write_lba=0
|
||||||
|
}}}
|
||||||
|
is given but an appendable media is to be burned which would start ati
|
||||||
|
block 68432.
|
||||||
|
|
||||||
|
|
||||||
|
An ISO-9660 file system image must be prepared according to a particular
|
||||||
|
block address on media. If the prepared address and the real address on media
|
||||||
|
do not match then the filesystem will not be mountable or may even cause system
|
||||||
|
trouble.
|
||||||
|
|
||||||
|
A sequential archive format like afio or star will not necessarily need such
|
||||||
|
a coordination of addresses. It might nevertheless be confusing to a reader
|
||||||
|
if the archive does not start at block 0.
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
fifo_start_at=<num> is a throughput enhancer for unsteady data streams
|
fifo_start_at=<num> is a throughput enhancer for unsteady data streams
|
||||||
@ -154,21 +197,6 @@ $HOME/.cdrskinrc
|
|||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
tao_to_sao_tsize=<num> allows the - actually unsupported - cdrecord option
|
|
||||||
-tao and defines a default track size to be used if - as custom with -tao -
|
|
||||||
no option tsize=# is given.
|
|
||||||
|
|
||||||
Since -tao is supported in cdrskin-0.2.6 the TAO-to-SAO workaround has become
|
|
||||||
quite obsolete. Nevertheless, tao_to_sao_tsize= allows to preset a default
|
|
||||||
size for SAO mode which is in effect only if no track size is available.
|
|
||||||
|
|
||||||
As in general with cdrskin tsize=# the data source does not have to provide
|
|
||||||
the full annouced amount of data. Missing data will be padded up by 0-bytes.
|
|
||||||
Surplus data is supposed to cause an error, though. The burn will then
|
|
||||||
be a failure in any way.
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
dev_translation=<sep><from><sep><to> may be needed to foist cdrskin to
|
dev_translation=<sep><from><sep><to> may be needed to foist cdrskin to
|
||||||
frontend programs of cdrecord which do *not* ask cdrecord -scanbus but
|
frontend programs of cdrecord which do *not* ask cdrecord -scanbus but
|
||||||
which make own assumptions and guesses about cdrecord's device addresses.
|
which make own assumptions and guesses about cdrecord's device addresses.
|
||||||
@ -200,9 +228,10 @@ for an illustrated example with K3b 0.10 .
|
|||||||
|
|
||||||
DVD advise:
|
DVD advise:
|
||||||
|
|
||||||
For burning of DVD media the cdrskin project currently advises to use
|
For burning of DVD media other than DVD-RAM, DVD+RW, DVD+R, DVD-RW, DVD-R,
|
||||||
Andy Polyakov's dvd+rw-tools which despite their historic name burn
|
the cdrskin project currently advises to use Andy Polyakov's dvd+rw-tools
|
||||||
for me on above burner: DVD+RW, DVD+R, DVD-RW, DVD-R .
|
which despite their historic name are capable of all the media above
|
||||||
|
and also do dual layer and even BD discs.
|
||||||
|
|
||||||
http://fy.chalmers.se/~appro/linux/DVD+RW/tools
|
http://fy.chalmers.se/~appro/linux/DVD+RW/tools
|
||||||
|
|
||||||
@ -210,21 +239,19 @@ They are not compatible or related to cdrecord resp. cdrecord-ProDVD
|
|||||||
(now obsoleted by original source cdrtools cdrecord with identical
|
(now obsoleted by original source cdrtools cdrecord with identical
|
||||||
capabilities besides the license key).
|
capabilities besides the license key).
|
||||||
|
|
||||||
libburn and thus the cdrskin project are currently aquiring own capabilities
|
A special feature of dvd+rw-tools is growing of ISO-9660 filesystems on
|
||||||
to burn to DVD media. For now restricted to DVD+RW and DVD-RW and to single
|
overwriteable media. This is not the same as multi-session writing of cdrskin
|
||||||
|
with CD media, but retrieves additional information from the existing ISO
|
||||||
|
image and finally manipulates the start sectors of this existing image.
|
||||||
|
So for growable ISO filesystems on DVD-RAM or DVD+RW growisofs is the only
|
||||||
|
choice, currently.
|
||||||
|
|
||||||
|
|
||||||
|
cdrskin can offer DVD multi-session only with sequential DVD-R[W] and with
|
||||||
|
DVD+R.
|
||||||
|
Associated options blank=, -multi, -msinfo and -toc are available in this case.
|
||||||
|
Thus sequential DVD-RW behave much like large CD-RW with possibly more than 99
|
||||||
tracks.
|
tracks.
|
||||||
|
|
||||||
To my knowledge, Linux kernels 2.6 do write to DVD+RW via block devices as
|
|
||||||
they would write to a traditional tape device. Try old tape archiver
|
|
||||||
commands with addresses like /dev/sr0 or /dev/hdc rather than /dev/mt0 .
|
|
||||||
I have heard rumors that DVD-RW in mode "restricted overwrite" would be
|
|
||||||
block device ready, too. My burner is not a real friend of DVD-RW and
|
|
||||||
in an experiment the burn worked fine - but the result was not identical
|
|
||||||
to the stream sent to the device. I had similar failure with DVD-RAM, too.
|
|
||||||
|
|
||||||
Beware of the impact of a slow block device on overall system i/o buffering.
|
|
||||||
It is wise to curb its input to a speed which it is able to deliver to media.
|
|
||||||
Else your i/o dedicated RAM might buffer a big amount of stream data.
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
|
|
||||||
|
16
configure.ac
16
configure.ac
@ -1,4 +1,4 @@
|
|||||||
AC_INIT([libburn], [0.3.0], [http://libburnia.pykix.org])
|
AC_INIT([libburn], [0.3.4], [http://libburnia.pykix.org])
|
||||||
AC_PREREQ([2.50])
|
AC_PREREQ([2.50])
|
||||||
dnl AC_CONFIG_HEADER([config.h])
|
dnl AC_CONFIG_HEADER([config.h])
|
||||||
|
|
||||||
@ -7,12 +7,6 @@ AC_CANONICAL_TARGET
|
|||||||
|
|
||||||
AM_INIT_AUTOMAKE([subdir-objects])
|
AM_INIT_AUTOMAKE([subdir-objects])
|
||||||
|
|
||||||
dnl A61101 This breaks Linux build (makes 32 bit off_t)
|
|
||||||
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;
|
||||||
dnl BURN_INTERFACE_AGE += 1;
|
dnl BURN_INTERFACE_AGE += 1;
|
||||||
@ -25,7 +19,7 @@ dnl if MAJOR or MINOR version changes, be sure to change AC_INIT above to match
|
|||||||
dnl
|
dnl
|
||||||
BURN_MAJOR_VERSION=0
|
BURN_MAJOR_VERSION=0
|
||||||
BURN_MINOR_VERSION=3
|
BURN_MINOR_VERSION=3
|
||||||
BURN_MICRO_VERSION=0
|
BURN_MICRO_VERSION=4
|
||||||
BURN_INTERFACE_AGE=0
|
BURN_INTERFACE_AGE=0
|
||||||
BURN_BINARY_AGE=0
|
BURN_BINARY_AGE=0
|
||||||
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
|
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
|
||||||
@ -76,12 +70,6 @@ AC_PROG_INSTALL
|
|||||||
|
|
||||||
AC_CHECK_HEADERS()
|
AC_CHECK_HEADERS()
|
||||||
|
|
||||||
AC_CHECK_MEMBER([struct tm.tm_gmtoff],
|
|
||||||
[AC_DEFINE(HAVE_TM_GMTOFF, 1,
|
|
||||||
[Define this if tm structure includes a tm_gmtoff entry.])],
|
|
||||||
,
|
|
||||||
[#include <time.h>])
|
|
||||||
|
|
||||||
THREAD_LIBS=-lpthread
|
THREAD_LIBS=-lpthread
|
||||||
AC_SUBST(THREAD_LIBS)
|
AC_SUBST(THREAD_LIBS)
|
||||||
|
|
||||||
|
51
doc/comments
51
doc/comments
@ -6,9 +6,11 @@
|
|||||||
@section intro Introduction
|
@section intro Introduction
|
||||||
|
|
||||||
Libburnia is an open-source project for reading, mastering and writing
|
Libburnia is an open-source project for reading, mastering and writing
|
||||||
optical discs. For now this means only CD-R and CD-RW.
|
optical discs.
|
||||||
Support for DVD+RW and DVD-RW is emerging.
|
For now this means CD-R, CD-RW, DVD-RAM, DVD+RW, DVD+R, DVD-RW, DVD-R.
|
||||||
|
|
||||||
|
Not supported yet are dual layer media, HD-DVD, BD (blue ray). Testers for
|
||||||
|
dual layer DVD+/-R are wanted, though.
|
||||||
|
|
||||||
The project comprises of several more or less interdependent parts which
|
The project comprises of several more or less interdependent parts which
|
||||||
together strive to be a usable foundation for application development.
|
together strive to be a usable foundation for application development.
|
||||||
@ -20,9 +22,9 @@ we would need : login on a development machine resp. a live OS on CD or DVD,
|
|||||||
advise from a system person about the equivalent of Linux sg or FreeBSD CAM,
|
advise from a system person about the equivalent of Linux sg or FreeBSD CAM,
|
||||||
volunteers for testing of realistic use cases.
|
volunteers for testing of realistic use cases.
|
||||||
|
|
||||||
We have a workable code base for burning data and audio CDs. The burn API is
|
We have a workable code base for burning data and audio CDs and many DVD types.
|
||||||
quite comprehensively documented and can be used to build a presentable
|
The burn API is quite comprehensively documented and can be used to build a
|
||||||
application.
|
presentable application.
|
||||||
We have a functional binary which emulates the core use cases of cdrecord in
|
We have a functional binary which emulates the core use cases of cdrecord in
|
||||||
order to prove that usability, and in order to allow you to explore libburn's
|
order to prove that usability, and in order to allow you to explore libburn's
|
||||||
scope by help of existing cdrecord frontends.
|
scope by help of existing cdrecord frontends.
|
||||||
@ -32,7 +34,10 @@ scope by help of existing cdrecord frontends.
|
|||||||
- libburn is the library by which preformatted data get onto optical media.
|
- libburn is the library by which preformatted data get onto optical media.
|
||||||
It uses either /dev/sgN (e.g. on kernel 2.4 with ide-scsi) or
|
It uses either /dev/sgN (e.g. on kernel 2.4 with ide-scsi) or
|
||||||
/dev/hdX (e.g. on kernel 2.6).
|
/dev/hdX (e.g. on kernel 2.6).
|
||||||
libburn is the foundation of our cdrecord emulation.
|
libburn is the foundation of our cdrecord emulation. Its code is
|
||||||
|
independent of cdrecord. Its DVD capabilities are learned from
|
||||||
|
studying the code of dvd+rw-tools and MMC-5 specs. No code but only
|
||||||
|
the pure SCSI knowledge has been taken from dvd+rw-tools, though.
|
||||||
|
|
||||||
- libisofs is the library to pack up hard disk files and directories into a
|
- libisofs is the library to pack up hard disk files and directories into a
|
||||||
ISO 9660 disk image. This may then be brought to CD via libburn.
|
ISO 9660 disk image. This may then be brought to CD via libburn.
|
||||||
@ -41,15 +46,18 @@ scope by help of existing cdrecord frontends.
|
|||||||
- cdrskin is a limited cdrecord compatibility wrapper for libburn.
|
- cdrskin is a limited cdrecord compatibility wrapper for libburn.
|
||||||
cdrecord is a powerful GPL'ed burn program included in Joerg
|
cdrecord is a powerful GPL'ed burn program included in Joerg
|
||||||
Schilling's cdrtools. cdrskin strives to be a second source for
|
Schilling's cdrtools. cdrskin strives to be a second source for
|
||||||
the services traditionally provided by cdrecord.
|
the services traditionally provided by cdrecord. Additionally it
|
||||||
|
provides libburn's DVD capabilities, where only -sao is compatible
|
||||||
|
with cdrecord.
|
||||||
cdrskin does not contain any bytes copied from cdrecord's sources.
|
cdrskin does not contain any bytes copied from cdrecord's sources.
|
||||||
Many bytes have been copied from the message output of cdrecord
|
Many bytes have been copied from the message output of cdrecord
|
||||||
runs, though.
|
runs, though.
|
||||||
See cdrskin/README for more.
|
See cdrskin/README for more.
|
||||||
|
|
||||||
- "test" is a collection of application gestures and examples given by the
|
- "test" is a collection of application gestures and examples given by the
|
||||||
authors of the library features. The main API example of libburn
|
authors of the library features. The burn API example of libburn
|
||||||
is named test/libburner.c .
|
is named test/libburner.c . The API for media information inquiry is
|
||||||
|
demonstrated in test/telltoc.c .
|
||||||
Explore these examples if you look for inspiration.
|
Explore these examples if you look for inspiration.
|
||||||
|
|
||||||
We plan to be a responsive upstream. Bear with us.
|
We plan to be a responsive upstream. Bear with us.
|
||||||
@ -82,9 +90,8 @@ languages and development tools.
|
|||||||
|
|
||||||
libburner is a minimal demo application for the library libburn
|
libburner is a minimal demo application for the library libburn
|
||||||
(see: libburn/libburn.h) as provided on http://libburn.pykix.org .
|
(see: libburn/libburn.h) as provided on http://libburn.pykix.org .
|
||||||
It can list the available devices, can blank a CD-RW and
|
It can list the available devices, can blank a CD-RW or DVD-RW and
|
||||||
can burn to CD-R or CD-RW.
|
can burn to recordable CD and recordable single layer DVD.
|
||||||
New: burning to DVD+/-RW (single data track, single session only).
|
|
||||||
|
|
||||||
It's main purpose, nevertheless, is to show you how to use libburn and also
|
It's main purpose, nevertheless, is to show you how to use libburn and also
|
||||||
to serve the libburnia team as reference application. libburner does indeed
|
to serve the libburnia team as reference application. libburner does indeed
|
||||||
@ -95,8 +102,9 @@ stay upward compatible for a good while.
|
|||||||
<pre>
|
<pre>
|
||||||
Usage: test/libburner
|
Usage: test/libburner
|
||||||
[--drive <address>|<driveno>|"-"] [--audio]
|
[--drive <address>|<driveno>|"-"] [--audio]
|
||||||
[--blank_fast|--blank_full] [--try_to_simulate]
|
[--blank_fast|--blank_full|--format_overwrite]
|
||||||
[--multi] [one or more imagefiles|"-"]
|
[--try_to_simulate]
|
||||||
|
[--multi] [<one or more imagefiles>|"-"]
|
||||||
Examples
|
Examples
|
||||||
A bus scan (needs rw-permissions to see a drive):
|
A bus scan (needs rw-permissions to see a drive):
|
||||||
test/libburner --drive -
|
test/libburner --drive -
|
||||||
@ -106,22 +114,27 @@ Burn a file to drive chosen by persistent address, close:
|
|||||||
test/libburner --drive /dev/hdc my_image_file
|
test/libburner --drive /dev/hdc my_image_file
|
||||||
Blank a used CD-RW (is combinable with burning in one run):
|
Blank a used CD-RW (is combinable with burning in one run):
|
||||||
test/libburner --drive /dev/hdc --blank_fast
|
test/libburner --drive /dev/hdc --blank_fast
|
||||||
Burn two audio tracks
|
Blank a used DVD-RW (is combinable with burning in one run):
|
||||||
|
test/libburner --drive /dev/hdc --blank_full
|
||||||
|
Format a DVD-RW to avoid need for blanking before re-use:
|
||||||
|
test/libburner --drive /dev/hdc --format_overwrite
|
||||||
|
Burn two audio tracks (to CD only):
|
||||||
lame --decode -t /path/to/track1.mp3 track1.cd
|
lame --decode -t /path/to/track1.mp3 track1.cd
|
||||||
test/dewav /path/to/track2.wav -o track2.cd
|
test/dewav /path/to/track2.wav -o track2.cd
|
||||||
test/libburner --drive /dev/hdc --audio track1.cd track2.cd
|
test/libburner --drive /dev/hdc --audio track1.cd track2.cd
|
||||||
Burn a compressed afio archive on-the-fly:
|
Burn a compressed afio archive on-the-fly:
|
||||||
( cd my_directory ; find . -print | afio -oZ - ) | \
|
( cd my_directory ; find . -print | afio -oZ - ) | \
|
||||||
test/libburner --drive /dev/hdc -
|
test/libburner --drive /dev/hdc -
|
||||||
To be read from *not mounted* CD via: afio -tvZ /dev/hdc
|
To be read from *not mounted* media via: afio -tvZ /dev/hdc
|
||||||
Program tar would need a clean EOF which our padded CD cannot deliver.
|
|
||||||
</pre>
|
</pre>
|
||||||
libburner has two companions, telltoc and dewav, which help to perform some
|
libburner has two companions, telltoc and dewav, which help to perform some
|
||||||
peripheral tasks of burning.
|
peripheral tasks of burning.
|
||||||
|
|
||||||
telltoc prints a table of content (sessions, tracks and leadouts), it tells
|
telltoc prints a table of content (sessions, tracks and leadouts), it tells
|
||||||
about type and state of CD media, and also is able to provide the necessary
|
about type and state of media, and also is able to provide the necessary
|
||||||
multi-session information for program mkisofs option -C.
|
multi-session information for program mkisofs option -C. Especially helpful
|
||||||
|
are its predictions with "Write multi" and "Write modes" where availability
|
||||||
|
of "TAO" indicates that tracks of unpredicted length can be written.
|
||||||
See: test/telltoc --help.
|
See: test/telltoc --help.
|
||||||
|
|
||||||
dewav extracts raw byte-swapped audio data from files of format .wav (MS WAVE)
|
dewav extracts raw byte-swapped audio data from files of format .wav (MS WAVE)
|
||||||
|
1099
doc/cookbook.txt
Normal file
1099
doc/cookbook.txt
Normal file
File diff suppressed because it is too large
Load Diff
@ -12,6 +12,7 @@
|
|||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
#include <a ssert.h>
|
#include <a ssert.h>
|
||||||
@ -235,9 +236,18 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
|
|||||||
|
|
||||||
/* ts A70103 moved up from burn_disc_erase_sync() */
|
/* ts A70103 moved up from burn_disc_erase_sync() */
|
||||||
/* ts A60825 : allow on parole to blank appendable CDs */
|
/* ts A60825 : allow on parole to blank appendable CDs */
|
||||||
if ( ! (drive->status == BURN_DISC_FULL ||
|
/* ts A70131 : allow blanking of overwriteable DVD-RW (profile 0x13) */
|
||||||
(drive->status == BURN_DISC_APPENDABLE &&
|
/* ts A70216 : allow blanking of CD-RW or DVD-RW in any regular state
|
||||||
! libburn_back_hack_42) ) ) {
|
and of any kind of full media */
|
||||||
|
if ((drive->current_profile != 0x0a &&
|
||||||
|
drive->current_profile != 0x13 &&
|
||||||
|
drive->current_profile != 0x14 &&
|
||||||
|
drive->status != BURN_DISC_FULL)
|
||||||
|
||
|
||||||
|
(drive->status != BURN_DISC_FULL &&
|
||||||
|
drive->status != BURN_DISC_APPENDABLE &&
|
||||||
|
drive->status != BURN_DISC_BLANK)
|
||||||
|
) {
|
||||||
libdax_msgs_submit(libdax_messenger, drive->global_index,
|
libdax_msgs_submit(libdax_messenger, drive->global_index,
|
||||||
0x00020130,
|
0x00020130,
|
||||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
@ -323,6 +333,18 @@ static void *write_disc_worker_func(struct w_list *w)
|
|||||||
void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
||||||
{
|
{
|
||||||
struct write_opts o;
|
struct write_opts o;
|
||||||
|
char reasons[BURN_REASONS_LEN+80];
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
int i, j, mode, mixed_mode = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* For the next lines any return indicates failure */
|
||||||
|
opts->drive->cancel = 1;
|
||||||
|
|
||||||
|
/* ts A70203 : people have been warned in API specs */
|
||||||
|
if (opts->write_type == BURN_WRITE_NONE)
|
||||||
|
return;
|
||||||
|
|
||||||
/* ts A61006 */
|
/* ts A61006 */
|
||||||
/* a ssert(!SCAN_GOING()); */
|
/* a ssert(!SCAN_GOING()); */
|
||||||
@ -343,9 +365,56 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc)
|
|||||||
"Drive capabilities not inquired yet", 0, 0);
|
"Drive capabilities not inquired yet", 0, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* ts A61009 : obsolete Assert in sector_headers() */
|
|
||||||
if (! burn_disc_write_is_ok(opts, disc)) /* issues own msgs */
|
/* ts A70219 : intended to replace all further tests here and many
|
||||||
|
tests in burn_*_write_sync()
|
||||||
|
*/
|
||||||
|
strcpy(reasons, "Write job parameters are unsuitable:\n");
|
||||||
|
if (burn_precheck_write(opts, disc, reasons + strlen(reasons), 1)
|
||||||
|
== BURN_WRITE_NONE) {
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
opts->drive->global_index, 0x00020139,
|
||||||
|
LIBDAX_MSGS_SEV_WARNING, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
reasons, 0, 0);
|
||||||
|
#else
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
opts->drive->global_index, 0x00020139,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
reasons, 0, 0);
|
||||||
return;
|
return;
|
||||||
|
#endif /* Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
/* <<< covered burn_precheck_write() */
|
||||||
|
/* ts A61009 : obsolete Assert in sector_headers() */
|
||||||
|
if (! burn_disc_write_is_ok(opts, disc, 0)) /* issues own msgs */
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* <<< covered burn_precheck_write() */
|
||||||
|
/* ts A70122 : libburn SAO code mishandles mode changes */
|
||||||
|
for (i = 0; i < disc->sessions; i++) {
|
||||||
|
if (disc->session[i]->tracks <= 0)
|
||||||
|
continue;
|
||||||
|
mode = disc->session[i]->track[0]->mode;
|
||||||
|
for (j = 1; j < disc->session[i]->tracks; j++)
|
||||||
|
if (mode != disc->session[i]->track[j]->mode)
|
||||||
|
mixed_mode = 1;
|
||||||
|
}
|
||||||
|
if (mixed_mode && opts->write_type == BURN_WRITE_SAO) {
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
opts->drive->global_index, 0x00020133,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"Cannot mix data and audio in SAO mode", 0, 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
|
opts->drive->cancel = 0; /* End of the return = failure area */
|
||||||
|
|
||||||
o.drive = opts->drive;
|
o.drive = opts->drive;
|
||||||
o.opts = opts;
|
o.opts = opts;
|
||||||
|
258
libburn/drive.c
258
libburn/drive.c
@ -29,6 +29,12 @@
|
|||||||
/* ts A70107 : to get BE_CANCELLED */
|
/* ts A70107 : to get BE_CANCELLED */
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
|
|
||||||
|
/* ts A70219 : for burn_disc_get_write_mode_demands() */
|
||||||
|
#include "options.h"
|
||||||
|
|
||||||
|
/* A70225 : to learn about eventual Libburn_dvd_r_dl_multi_no_close_sessioN */
|
||||||
|
#include "write.h"
|
||||||
|
|
||||||
#include "libdax_msgs.h"
|
#include "libdax_msgs.h"
|
||||||
extern struct libdax_msgs *libdax_messenger;
|
extern struct libdax_msgs *libdax_messenger;
|
||||||
|
|
||||||
@ -347,6 +353,9 @@ int burn_drive_mark_unready(struct burn_drive *d)
|
|||||||
|
|
||||||
/* ts A61202 */
|
/* ts A61202 */
|
||||||
d->current_profile = -1;
|
d->current_profile = -1;
|
||||||
|
d->current_has_feat21h = 0;
|
||||||
|
d->current_feat2fh_byte4 = -1;
|
||||||
|
|
||||||
d->status = BURN_DISC_UNREADY;
|
d->status = BURN_DISC_UNREADY;
|
||||||
if (d->toc_entry != NULL)
|
if (d->toc_entry != NULL)
|
||||||
free(d->toc_entry);
|
free(d->toc_entry);
|
||||||
@ -1406,6 +1415,55 @@ int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70131 : new API function */
|
||||||
|
int burn_disc_get_msc1(struct burn_drive *d, int *start)
|
||||||
|
{
|
||||||
|
int ret, trackno;
|
||||||
|
|
||||||
|
if (burn_drive_is_released(d)) {
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x0002011b,
|
||||||
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"Attempt to read track info from ungrabbed drive",
|
||||||
|
0, 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (d->busy != BURN_DRIVE_IDLE) {
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x0002011c,
|
||||||
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"Attempt to read track info from busy drive",
|
||||||
|
0, 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ret = d->read_multi_session_c1(d, &trackno, start);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70213 : new API function */
|
||||||
|
off_t burn_disc_available_space(struct burn_drive *d,
|
||||||
|
struct burn_write_opts *o)
|
||||||
|
{
|
||||||
|
int lba, nwa;
|
||||||
|
|
||||||
|
if (burn_drive_is_released(d))
|
||||||
|
goto ex;
|
||||||
|
if (d->busy != BURN_DRIVE_IDLE)
|
||||||
|
goto ex;
|
||||||
|
if (o != NULL)
|
||||||
|
d->send_write_parameters(d, o);
|
||||||
|
d->get_nwa(d, -1, &lba, &nwa);
|
||||||
|
ex:;
|
||||||
|
if (o->start_byte > 0) {
|
||||||
|
if (o->start_byte > d->media_capacity_remaining)
|
||||||
|
return 0;
|
||||||
|
return d->media_capacity_remaining - o->start_byte;
|
||||||
|
}
|
||||||
|
return d->media_capacity_remaining;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ts A61202 : New API function */
|
/* ts A61202 : New API function */
|
||||||
int burn_disc_get_profile(struct burn_drive *d, int *pno, char name[80])
|
int burn_disc_get_profile(struct burn_drive *d, int *pno, char name[80])
|
||||||
{
|
{
|
||||||
@ -1529,3 +1587,203 @@ int burn_drive_free_speedlist(struct burn_speed_descriptor **speed_list)
|
|||||||
return burn_speed_descriptor_destroy(speed_list, 1);
|
return burn_speed_descriptor_destroy(speed_list, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70203 : API function */
|
||||||
|
int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
|
||||||
|
struct burn_multi_caps **caps, int flag)
|
||||||
|
{
|
||||||
|
enum burn_disc_status s;
|
||||||
|
struct burn_multi_caps *o;
|
||||||
|
int status, num_formats, ret, type, i;
|
||||||
|
off_t size;
|
||||||
|
unsigned dummy;
|
||||||
|
|
||||||
|
*caps = NULL;
|
||||||
|
s = burn_disc_get_status(d);
|
||||||
|
if(s == BURN_DISC_UNGRABBED)
|
||||||
|
return -1;
|
||||||
|
*caps = o = (struct burn_multi_caps *)
|
||||||
|
malloc(sizeof(struct burn_multi_caps));
|
||||||
|
if(*caps == NULL)
|
||||||
|
return -1;
|
||||||
|
/* Default says nothing is available */
|
||||||
|
o->multi_session = o->multi_track = 0;
|
||||||
|
o-> start_adr = 0;
|
||||||
|
o->start_alignment = o->start_range_low = o->start_range_high = 0;
|
||||||
|
o->might_do_tao = o->might_do_sao = o->might_do_raw = 0;
|
||||||
|
o->advised_write_mode = BURN_WRITE_NONE;
|
||||||
|
o->selected_write_mode = wt;
|
||||||
|
o->current_profile = d->current_profile;
|
||||||
|
o->current_is_cd_profile = d->current_is_cd_profile;
|
||||||
|
|
||||||
|
if (s != BURN_DISC_BLANK && s != BURN_DISC_APPENDABLE) {
|
||||||
|
return 0;
|
||||||
|
} else if (s == BURN_DISC_APPENDABLE &&
|
||||||
|
(wt == BURN_WRITE_SAO || wt == BURN_WRITE_RAW)) {
|
||||||
|
return 0;
|
||||||
|
} else if (wt == BURN_WRITE_RAW && !d->current_is_cd_profile) {
|
||||||
|
return 0;
|
||||||
|
} else if (d->current_profile == 0x09 || d->current_profile == 0x0a) {
|
||||||
|
/* CD-R , CD-RW */
|
||||||
|
if (d->block_types[BURN_WRITE_TAO]) {
|
||||||
|
o->multi_session = o->multi_track = 1;
|
||||||
|
o->might_do_tao = 2;
|
||||||
|
if (o->advised_write_mode == BURN_WRITE_NONE)
|
||||||
|
o->advised_write_mode = BURN_WRITE_TAO;
|
||||||
|
}
|
||||||
|
if (d->block_types[BURN_WRITE_SAO]) {
|
||||||
|
o->multi_session = o->multi_track = 1;
|
||||||
|
o->might_do_sao = 1;
|
||||||
|
if (o->advised_write_mode == BURN_WRITE_NONE)
|
||||||
|
o->advised_write_mode = BURN_WRITE_SAO;
|
||||||
|
}
|
||||||
|
if (d->block_types[BURN_WRITE_RAW]) {
|
||||||
|
o->might_do_raw = 1;
|
||||||
|
if (o->advised_write_mode == BURN_WRITE_NONE)
|
||||||
|
o->advised_write_mode = BURN_WRITE_RAW;
|
||||||
|
}
|
||||||
|
if (wt == BURN_WRITE_RAW)
|
||||||
|
o->multi_session = o->multi_track = 0;
|
||||||
|
} else if (d->current_profile == 0x11 || d->current_profile == 0x14 ||
|
||||||
|
d->current_profile == 0x15) {
|
||||||
|
/* DVD-R , sequential DVD-RW , DVD-R/DL Sequential */
|
||||||
|
if (s == BURN_DISC_BLANK) {
|
||||||
|
o->might_do_sao = 1;
|
||||||
|
o->advised_write_mode = BURN_WRITE_SAO;
|
||||||
|
}
|
||||||
|
if (d->current_has_feat21h) {
|
||||||
|
#ifndef Libburn_dvd_r_dl_multi_no_close_sessioN
|
||||||
|
if (d->current_profile != 0x15)
|
||||||
|
#endif
|
||||||
|
o->multi_session = 1;
|
||||||
|
o->multi_track = 1;
|
||||||
|
o->might_do_tao = 2;
|
||||||
|
o->advised_write_mode = BURN_WRITE_TAO;
|
||||||
|
}
|
||||||
|
if (wt == BURN_WRITE_SAO)
|
||||||
|
o->multi_session = o->multi_track = 0;
|
||||||
|
} else if (d->current_profile == 0x12 || d->current_profile == 0x13 ||
|
||||||
|
d->current_profile == 0x1a) {
|
||||||
|
/* DVD-RAM, overwriteable DVD-RW, DVD+RW */
|
||||||
|
o->start_adr = 1;
|
||||||
|
ret = burn_disc_get_formats(d, &status, &size, &dummy,
|
||||||
|
&num_formats);
|
||||||
|
if (ret == 1) {
|
||||||
|
if (status == BURN_FORMAT_IS_FORMATTED)
|
||||||
|
o->start_range_high = size;
|
||||||
|
if (d->current_profile == 0x13) {
|
||||||
|
o->start_alignment = 32 * 1024;
|
||||||
|
for (i = 0; i < num_formats; i++) {
|
||||||
|
ret = burn_disc_get_format_descr(d, i,
|
||||||
|
&type, &size, &dummy);
|
||||||
|
if (ret <= 0)
|
||||||
|
continue;
|
||||||
|
if (type == 0x13) /* expandable */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (i >= num_formats) /* not expandable */
|
||||||
|
o->start_range_high -= 32 * 1024;
|
||||||
|
} else {
|
||||||
|
o->start_alignment = 2 * 1024;
|
||||||
|
if (d->best_format_size - 2048 >
|
||||||
|
o->start_range_high)
|
||||||
|
o->start_range_high =
|
||||||
|
d->best_format_size - 2048;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
o->might_do_sao = 4;
|
||||||
|
o->might_do_tao = 2;
|
||||||
|
o->advised_write_mode = BURN_WRITE_TAO;
|
||||||
|
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b) {
|
||||||
|
/* DVD+R , DVD+R/DL */
|
||||||
|
o->multi_session = o->multi_track = 1;
|
||||||
|
o->might_do_tao = 2;
|
||||||
|
o->might_do_sao = 1;
|
||||||
|
o->advised_write_mode = BURN_WRITE_TAO;
|
||||||
|
} else /* unknown media */
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (s == BURN_DISC_APPENDABLE)
|
||||||
|
o->might_do_sao = o->might_do_raw = 0;
|
||||||
|
|
||||||
|
if (wt == BURN_WRITE_TAO && !o->might_do_tao)
|
||||||
|
return 0;
|
||||||
|
else if (wt == BURN_WRITE_SAO && !o->might_do_sao)
|
||||||
|
return 0;
|
||||||
|
else if (wt == BURN_WRITE_RAW && !o->might_do_raw)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70203 : API function */
|
||||||
|
int burn_disc_free_multi_caps(struct burn_multi_caps **caps)
|
||||||
|
{
|
||||||
|
if (*caps == NULL)
|
||||||
|
return 0;
|
||||||
|
free((char *) *caps);
|
||||||
|
*caps = NULL;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70207 : evaluate write mode related peculiarities of a disc
|
||||||
|
@param flag bit0= fill_up_media is active
|
||||||
|
*/
|
||||||
|
int burn_disc_get_write_mode_demands(struct burn_disc *disc,
|
||||||
|
struct burn_write_opts *opts,
|
||||||
|
struct burn_disc_mode_demands *result, int flag)
|
||||||
|
{
|
||||||
|
struct burn_session *session;
|
||||||
|
struct burn_track *track;
|
||||||
|
int i, j, mode, unknown_track_sizes = 0, last_track_is_unknown = 0;
|
||||||
|
enum burn_disc_status s;
|
||||||
|
|
||||||
|
|
||||||
|
memset((char *) result, 0, sizeof(struct burn_disc_mode_demands));
|
||||||
|
if (disc == NULL)
|
||||||
|
return 2;
|
||||||
|
s = burn_disc_get_status(opts->drive);
|
||||||
|
if (s == BURN_DISC_APPENDABLE || disc->sessions > 1)
|
||||||
|
result->will_append = 1;
|
||||||
|
if (disc->sessions > 1)
|
||||||
|
result->multi_session = 1;
|
||||||
|
for (i = 0; i < disc->sessions; i++) {
|
||||||
|
session = disc->session[i];
|
||||||
|
if (session->tracks <= 0)
|
||||||
|
continue;
|
||||||
|
mode = session->track[0]->mode;
|
||||||
|
if (session->tracks > 1)
|
||||||
|
result->multi_track = 1;
|
||||||
|
for (j = 0; j < session->tracks; j++) {
|
||||||
|
track = session->track[j];
|
||||||
|
if (burn_track_is_open_ended(track)) {
|
||||||
|
if (burn_track_get_default_size(track) > 0) {
|
||||||
|
if (result->unknown_track_size == 0)
|
||||||
|
result->unknown_track_size = 2;
|
||||||
|
} else
|
||||||
|
result->unknown_track_size = 1;
|
||||||
|
unknown_track_sizes++;
|
||||||
|
last_track_is_unknown = 1;
|
||||||
|
} else
|
||||||
|
last_track_is_unknown = 0;
|
||||||
|
if (mode != track->mode)
|
||||||
|
result->mixed_mode = 1;
|
||||||
|
if (track->mode == BURN_MODE1) {
|
||||||
|
result->block_types |= BURN_BLOCK_MODE1;
|
||||||
|
} else if (track->mode == BURN_AUDIO) {
|
||||||
|
result->audio = 1;
|
||||||
|
result->block_types |= BURN_BLOCK_RAW0;
|
||||||
|
result->exotic_track = 1;
|
||||||
|
} else {
|
||||||
|
result->block_types |= opts->block_type;
|
||||||
|
result->exotic_track = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (flag&1) {/* fill_up_media will define the size of the last track */
|
||||||
|
if (unknown_track_sizes == 1 && last_track_is_unknown)
|
||||||
|
result->unknown_track_size = 0;
|
||||||
|
}
|
||||||
|
return (disc->sessions > 0);
|
||||||
|
}
|
||||||
|
@ -95,4 +95,20 @@ int burn_mdata_free_subs(struct scsi_mode_data *m);
|
|||||||
/* ts A61230 */
|
/* ts A61230 */
|
||||||
void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag);
|
void burn_disc_format_sync(struct burn_drive *d, off_t size, int flag);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70207 : evaluate write mode related peculiarities of a disc */
|
||||||
|
struct burn_disc_mode_demands {
|
||||||
|
int multi_session;
|
||||||
|
int multi_track;
|
||||||
|
int unknown_track_size; /* 0=known, 1=unknown, 2=unknown+defaulted */
|
||||||
|
int mixed_mode;
|
||||||
|
int audio;
|
||||||
|
int exotic_track;
|
||||||
|
int block_types;
|
||||||
|
int will_append; /* because of media state or multi session disc */
|
||||||
|
};
|
||||||
|
int burn_disc_get_write_mode_demands(struct burn_disc *disc,
|
||||||
|
struct burn_write_opts *opts,
|
||||||
|
struct burn_disc_mode_demands *result, int flag);
|
||||||
|
|
||||||
#endif /* __DRIVE */
|
#endif /* __DRIVE */
|
||||||
|
@ -42,7 +42,7 @@ static int file_read(struct burn_source *source,
|
|||||||
unsigned char *buffer,
|
unsigned char *buffer,
|
||||||
int size)
|
int size)
|
||||||
{
|
{
|
||||||
struct burn_source_fd *fs = source->data;
|
struct burn_source_file *fs = source->data;
|
||||||
|
|
||||||
return read_full_buffer(fs->datafd, buffer, size);
|
return read_full_buffer(fs->datafd, buffer, size);
|
||||||
}
|
}
|
||||||
@ -71,14 +71,24 @@ static off_t file_size(struct burn_source *source)
|
|||||||
struct stat buf;
|
struct stat buf;
|
||||||
struct burn_source_file *fs = source->data;
|
struct burn_source_file *fs = source->data;
|
||||||
|
|
||||||
|
if (fs->fixed_size > 0)
|
||||||
|
return fs->fixed_size;
|
||||||
if (fstat(fs->datafd, &buf) == -1)
|
if (fstat(fs->datafd, &buf) == -1)
|
||||||
return (off_t) 0;
|
return (off_t) 0;
|
||||||
/* for now we keep it compatible to the old (int) return value */
|
|
||||||
if(buf.st_size >= 1308622848) /* 2 GB - 800 MB to prevent rollover */
|
|
||||||
return (off_t) 1308622848;
|
|
||||||
return (off_t) buf.st_size;
|
return (off_t) buf.st_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70125 */
|
||||||
|
static int file_set_size(struct burn_source *source, off_t size)
|
||||||
|
{
|
||||||
|
struct burn_source_file *fs = source->data;
|
||||||
|
|
||||||
|
fs->fixed_size = size;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct burn_source *burn_file_source_new(const char *path, const char *subpath)
|
struct burn_source *burn_file_source_new(const char *path, const char *subpath)
|
||||||
{
|
{
|
||||||
struct burn_source_file *fs;
|
struct burn_source_file *fs;
|
||||||
@ -103,84 +113,43 @@ struct burn_source *burn_file_source_new(const char *path, const char *subpath)
|
|||||||
if (subpath)
|
if (subpath)
|
||||||
fs->subfd = fd2;
|
fs->subfd = fd2;
|
||||||
|
|
||||||
|
/* ts A70125 */
|
||||||
|
fs->fixed_size = 0;
|
||||||
|
|
||||||
src = burn_source_new();
|
src = burn_source_new();
|
||||||
src->read = file_read;
|
src->read = file_read;
|
||||||
if (subpath)
|
if (subpath)
|
||||||
src->read_sub = file_read_sub;
|
src->read_sub = file_read_sub;
|
||||||
|
|
||||||
src->get_size = file_size;
|
src->get_size = file_size;
|
||||||
|
src->set_size = file_set_size;
|
||||||
src->free_data = file_free;
|
src->free_data = file_free;
|
||||||
src->data = fs;
|
src->data = fs;
|
||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ------ provisory location for the new source subclass fd --------- */
|
/* ts A70126 : removed class burn_source_fd in favor of burn_source_file */
|
||||||
|
|
||||||
static off_t fd_get_size(struct burn_source *source)
|
|
||||||
{
|
|
||||||
struct stat buf;
|
|
||||||
struct burn_source_fd *fs = source->data;
|
|
||||||
|
|
||||||
if (fs->fixed_size > 0)
|
|
||||||
return fs->fixed_size;
|
|
||||||
if (fstat(fs->datafd, &buf) == -1)
|
|
||||||
return (off_t) 0;
|
|
||||||
/* for now we keep it compatible to the old (int) return value */
|
|
||||||
if (buf.st_size >= 1308622848) /* 2 GB - 800 MB to prevent rollover */
|
|
||||||
return (off_t) 1308622848;
|
|
||||||
return buf.st_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int fd_read(struct burn_source *source,
|
|
||||||
unsigned char *buffer,
|
|
||||||
int size)
|
|
||||||
{
|
|
||||||
struct burn_source_fd *fs = source->data;
|
|
||||||
|
|
||||||
return read_full_buffer(fs->datafd, buffer, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int fd_read_sub(struct burn_source *source,
|
|
||||||
unsigned char *buffer,
|
|
||||||
int size)
|
|
||||||
{
|
|
||||||
struct burn_source_fd *fs = source->data;
|
|
||||||
|
|
||||||
return read_full_buffer(fs->subfd, buffer, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void fd_free_data(struct burn_source *source)
|
|
||||||
{
|
|
||||||
struct burn_source_fd *fs = source->data;
|
|
||||||
|
|
||||||
close(fs->datafd);
|
|
||||||
if (source->read_sub)
|
|
||||||
close(fs->subfd);
|
|
||||||
free(fs);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
struct burn_source_fd *fs;
|
struct burn_source_file *fs;
|
||||||
struct burn_source *src;
|
struct burn_source *src;
|
||||||
|
|
||||||
if (datafd == -1)
|
if (datafd == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
fs = malloc(sizeof(struct burn_source_fd));
|
fs = malloc(sizeof(struct burn_source_file));
|
||||||
fs->datafd = datafd;
|
fs->datafd = datafd;
|
||||||
fs->subfd = subfd;
|
fs->subfd = subfd;
|
||||||
fs->fixed_size = size;
|
fs->fixed_size = size;
|
||||||
|
|
||||||
src = burn_source_new();
|
src = burn_source_new();
|
||||||
src->read = fd_read;
|
src->read = file_read;
|
||||||
if(subfd != -1)
|
if(subfd != -1)
|
||||||
src->read = fd_read_sub;
|
src->read = file_read_sub;
|
||||||
src->get_size = fd_get_size;
|
src->get_size = file_size;
|
||||||
src->free_data = fd_free_data;
|
src->set_size = file_set_size;
|
||||||
|
src->free_data = file_free;
|
||||||
src->data = fs;
|
src->data = fs;
|
||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
|
@ -4,19 +4,14 @@
|
|||||||
#define BURN__FILE_H
|
#define BURN__FILE_H
|
||||||
|
|
||||||
struct burn_source_file
|
struct burn_source_file
|
||||||
{
|
|
||||||
int datafd;
|
|
||||||
int subfd;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* ------ provisory location for the new source subclass fd --------- */
|
|
||||||
|
|
||||||
struct burn_source_fd
|
|
||||||
{
|
{
|
||||||
int datafd;
|
int datafd;
|
||||||
int subfd;
|
int subfd;
|
||||||
off_t fixed_size;
|
off_t fixed_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70126 : burn_source_file obsoleted burn_source_fd */
|
||||||
|
|
||||||
|
|
||||||
#endif /* LIBBURN__FILE_H */
|
#endif /* LIBBURN__FILE_H */
|
||||||
|
@ -50,6 +50,10 @@ static char abort_message_prefix[81] = {"libburn : "};
|
|||||||
static pid_t abort_control_pid= 0;
|
static pid_t abort_control_pid= 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70223 : wether implemented untested profiles are supported */
|
||||||
|
int burn_support_untested_profiles = 0;
|
||||||
|
|
||||||
|
|
||||||
/* ts A60925 : ticket 74 */
|
/* ts A60925 : ticket 74 */
|
||||||
/** Create the messenger object for libburn. */
|
/** Create the messenger object for libburn. */
|
||||||
int burn_msgs_initialize(void)
|
int burn_msgs_initialize(void)
|
||||||
@ -73,6 +77,7 @@ int burn_initialize(void)
|
|||||||
|
|
||||||
if (burn_running)
|
if (burn_running)
|
||||||
return 1;
|
return 1;
|
||||||
|
burn_support_untested_profiles = 0;
|
||||||
ret = burn_msgs_initialize();
|
ret = burn_msgs_initialize();
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
@ -274,3 +279,10 @@ void burn_set_signal_handling(void *handle, burn_abort_handler_t handler,
|
|||||||
Cleanup_set_handlers(handle, (Cleanup_app_handler_T) handler, mode|4);
|
Cleanup_set_handlers(handle, (Cleanup_app_handler_T) handler, mode|4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70223 : API */
|
||||||
|
void burn_allow_untested_profiles(int yes)
|
||||||
|
{
|
||||||
|
burn_support_untested_profiles = !!yes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -107,22 +107,40 @@ struct burn_write_opts;
|
|||||||
enum burn_write_types
|
enum burn_write_types
|
||||||
{
|
{
|
||||||
/** Packet writing.
|
/** Packet writing.
|
||||||
currently unsupported
|
currently unsupported, (for DVD Incremental Streaming use TAO)
|
||||||
*/
|
*/
|
||||||
BURN_WRITE_PACKET,
|
BURN_WRITE_PACKET,
|
||||||
/** Track At Once recording.
|
|
||||||
|
/** With CD: Track At Once recording
|
||||||
2s gaps between tracks, no fonky lead-ins
|
2s gaps between tracks, no fonky lead-ins
|
||||||
|
|
||||||
|
With sequential DVD-R[W]: Incremental Streaming
|
||||||
|
With DVD-RAM/+RW: Random Writeable (used sequentially)
|
||||||
|
With overwriteable DVD-RW: Rigid Restricted Overwrite
|
||||||
*/
|
*/
|
||||||
BURN_WRITE_TAO,
|
BURN_WRITE_TAO,
|
||||||
/** Session At Once.
|
|
||||||
block type MUST be BURN_BLOCK_SAO
|
/** With CD: Session At Once
|
||||||
|
Block type MUST be BURN_BLOCK_SAO
|
||||||
|
ts A70122: Currently not capable of mixing data and audio tracks.
|
||||||
|
|
||||||
|
With sequential DVD-R[W]: Disc-at-once, DAO
|
||||||
|
Single session, single track, fixed size mandatory, (-dvd-compat)
|
||||||
*/
|
*/
|
||||||
BURN_WRITE_SAO,
|
BURN_WRITE_SAO,
|
||||||
/** Raw disc at once recording.
|
|
||||||
|
/** With CD: Raw disc at once recording.
|
||||||
all subcodes must be provided by lib or user
|
all subcodes must be provided by lib or user
|
||||||
only raw block types are supported
|
only raw block types are supported
|
||||||
*/
|
*/
|
||||||
BURN_WRITE_RAW
|
BURN_WRITE_RAW,
|
||||||
|
|
||||||
|
/** In replies this indicates that not any writing will work.
|
||||||
|
As parameter for inquiries it indicates that no particular write
|
||||||
|
mode shall is specified.
|
||||||
|
Do not use for setting a write mode for burning. It won't work.
|
||||||
|
*/
|
||||||
|
BURN_WRITE_NONE
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Data format to send to the drive */
|
/** Data format to send to the drive */
|
||||||
@ -237,9 +255,18 @@ enum burn_drive_status
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/** 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
|
||||||
lead-in area of a disc. The documentation here is very terse.
|
lead-in area of a disc. The documentation here is very terse.
|
||||||
See a document such as mmc3 for proper information.
|
See a document such as mmc3 for proper information.
|
||||||
|
|
||||||
|
CAUTION : This structure is prone to future extension !
|
||||||
|
|
||||||
|
Do not restrict your application to unsigned char with any counter like
|
||||||
|
"session", "point", "pmin", ...
|
||||||
|
Do not rely on the current size of a burn_toc_entry.
|
||||||
|
|
||||||
|
ts A70201 : DVD extension, see below
|
||||||
*/
|
*/
|
||||||
struct burn_toc_entry
|
struct burn_toc_entry
|
||||||
{
|
{
|
||||||
@ -263,6 +290,23 @@ struct burn_toc_entry
|
|||||||
unsigned char psec;
|
unsigned char psec;
|
||||||
/** Track start time frames for normal tracks */
|
/** Track start time frames for normal tracks */
|
||||||
unsigned char pframe;
|
unsigned char pframe;
|
||||||
|
|
||||||
|
/* Indicates wether extension data are valid and eventually override
|
||||||
|
older elements in this structure:
|
||||||
|
bit0= DVD extension is valid
|
||||||
|
*/
|
||||||
|
unsigned char extensions_valid;
|
||||||
|
|
||||||
|
/* ts A70201 : DVD extension.
|
||||||
|
If invalid the members are guaranteed to be 0. */
|
||||||
|
/* Tracks and session numbers are 16 bit. Here are the high bytes. */
|
||||||
|
unsigned char session_msb;
|
||||||
|
unsigned char point_msb;
|
||||||
|
/* pmin, psec, and pframe may be too small if DVD extension is valid */
|
||||||
|
int start_lba;
|
||||||
|
/* min, sec, and frame may be too small if DVD extension is valid */
|
||||||
|
int track_blocks;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -286,6 +330,9 @@ struct burn_source {
|
|||||||
/** Get the size of the source's data */
|
/** Get the size of the source's data */
|
||||||
off_t (*get_size)(struct burn_source *);
|
off_t (*get_size)(struct burn_source *);
|
||||||
|
|
||||||
|
/** Set the size of the source's data */
|
||||||
|
int (*set_size)(struct burn_source *source, off_t size);
|
||||||
|
|
||||||
/** Clean up the source specific data */
|
/** Clean up the source specific data */
|
||||||
void (*free_data)(struct burn_source *);
|
void (*free_data)(struct burn_source *);
|
||||||
|
|
||||||
@ -542,6 +589,19 @@ void burn_set_verbosity(int level);
|
|||||||
void burn_preset_device_open(int exclusive, int blocking, int abort_on_busy);
|
void burn_preset_device_open(int exclusive, int blocking, int abort_on_busy);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70223 */
|
||||||
|
/** Allows the use of media types which are implemented in libburn but not yet
|
||||||
|
tested. The list of those untested profiles is subject to change.
|
||||||
|
Currently it contains: 0x15 "DVD-R/DL Sequential".
|
||||||
|
If you really test such media, then please report the outcome on
|
||||||
|
libburn-hackers@pykix.org
|
||||||
|
If ever then this call should be done soon after burn_initialize() before
|
||||||
|
any drive scanning.
|
||||||
|
@param yes 1=allow all implemented profiles, 0=only tested media (default)
|
||||||
|
*/
|
||||||
|
void burn_allow_untested_profiles(int yes);
|
||||||
|
|
||||||
|
|
||||||
/* ts A60823 */
|
/* ts A60823 */
|
||||||
/** Aquire a drive with known persistent address.This is the sysadmin friendly
|
/** Aquire a drive with known persistent address.This is the sysadmin friendly
|
||||||
way to open one drive and to leave all others untouched. It bundles
|
way to open one drive and to leave all others untouched. It bundles
|
||||||
@ -627,7 +687,9 @@ int burn_drive_scan(struct burn_drive_info *drive_infos[],
|
|||||||
int burn_drive_info_forget(struct burn_drive_info *drive_info, int force);
|
int burn_drive_info_forget(struct burn_drive_info *drive_info, int force);
|
||||||
|
|
||||||
|
|
||||||
/** Free a burn_drive_info array returned by burn_drive_scan
|
/** When no longer needed, free a whole burn_drive_info array which was
|
||||||
|
returned by burn_drive_scan().
|
||||||
|
For freeing single drive array elements use burn_drive_info_forget().
|
||||||
*/
|
*/
|
||||||
void burn_drive_info_free(struct burn_drive_info drive_infos[]);
|
void burn_drive_info_free(struct burn_drive_info drive_infos[]);
|
||||||
|
|
||||||
@ -781,11 +843,42 @@ int burn_drive_get_start_end_lba(struct burn_drive *drive,
|
|||||||
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
|
int burn_disc_track_lba_nwa(struct burn_drive *d, struct burn_write_opts *o,
|
||||||
int trackno, int *lba, int *nwa);
|
int trackno, int *lba, int *nwa);
|
||||||
|
|
||||||
|
/* ts A70131 */
|
||||||
|
/** Read start lba of the first track in the last complete session.
|
||||||
|
This is the first parameter of mkisofs option -C. The second parameter
|
||||||
|
is nwa as obtained by burn_disc_track_lba_nwa() with trackno 0.
|
||||||
|
@param d The drive to query.
|
||||||
|
@param start_lba returns the start address of that track
|
||||||
|
@return <= 0 : failure, 1 = ok
|
||||||
|
*/
|
||||||
|
int burn_disc_get_msc1(struct burn_drive *d, int *start_lba);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70213 */
|
||||||
|
/** Return the best possible estimation of the currently available capacity of
|
||||||
|
the media. This might depend on particular write option settings. For
|
||||||
|
inquiring the space with such a set of options, the drive has to be
|
||||||
|
grabbed and BURN_DRIVE_IDLE. If not, then one will only get a canned value
|
||||||
|
from the most recent automatic inquiry (e.g. during last drive grabbing).
|
||||||
|
An eventual start address from burn_write_opts_set_start_byte() will be
|
||||||
|
subtracted from the obtained capacity estimation. Negative results get
|
||||||
|
defaulted to 0.
|
||||||
|
@param d The drive to query.
|
||||||
|
@param o If not NULL: write parameters to be set on drive before query
|
||||||
|
@return number of most probably available free bytes
|
||||||
|
*/
|
||||||
|
off_t burn_disc_available_space(struct burn_drive *d,
|
||||||
|
struct burn_write_opts *o);
|
||||||
|
|
||||||
|
|
||||||
/* ts A61202 */
|
/* ts A61202 */
|
||||||
/** Tells the MMC Profile identifier of the loaded media. The drive must be
|
/** Tells the MMC Profile identifier of the loaded media. The drive must be
|
||||||
grabbed in order to get a non-zero result.
|
grabbed in order to get a non-zero result.
|
||||||
libburn currently writes only to profiles 0x09 "CD-R", 0x0a "CD-RW",
|
libburn currently writes only to profiles 0x09 "CD-R", 0x0a "CD-RW",
|
||||||
0x12 "DVD-RAM", 0x13 "DVD-RW restricted overwrite" or 0x1a "DVD+RW".
|
0x11 "DVD-R", 0x12 "DVD-RAM", 0x13 "DVD-RW restricted overwrite",
|
||||||
|
0x14 "DVD-RW Sequential Recording" or 0x1a "DVD+RW".
|
||||||
|
If enabled by burn_allow_untested_profiles() it also writes to profile
|
||||||
|
0x15 "DVD-R/DL Sequential Recording".
|
||||||
@param d The drive where the media is inserted.
|
@param d The drive where the media is inserted.
|
||||||
@param pno Profile Number as of mmc5r03c.pdf, table 89
|
@param pno Profile Number as of mmc5r03c.pdf, table 89
|
||||||
@param name Profile Name (e.g "CD-RW", unknown profiles have empty name)
|
@param name Profile Name (e.g "CD-RW", unknown profiles have empty name)
|
||||||
@ -838,6 +931,7 @@ void burn_read_opts_free(struct burn_read_opts *opts);
|
|||||||
@param drive The drive with which to erase a disc.
|
@param drive The drive with which to erase a disc.
|
||||||
@param fast Nonzero to do a fast erase, where only the disc's headers are
|
@param fast Nonzero to do a fast erase, where only the disc's headers are
|
||||||
erased; zero to erase the entire disc.
|
erased; zero to erase the entire disc.
|
||||||
|
With DVD-RW, fast blanking yields media capable only of DAO.
|
||||||
*/
|
*/
|
||||||
void burn_disc_erase(struct burn_drive *drive, int fast);
|
void burn_disc_erase(struct burn_drive *drive, int fast);
|
||||||
|
|
||||||
@ -922,9 +1016,38 @@ int burn_disc_get_format_descr(struct burn_drive *drive, int index,
|
|||||||
*/
|
*/
|
||||||
void burn_disc_read(struct burn_drive *drive, const struct burn_read_opts *o);
|
void burn_disc_read(struct burn_drive *drive, const struct burn_read_opts *o);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70222 */
|
||||||
|
/** The length of a rejection reasons string for burn_precheck_write() and
|
||||||
|
burn_write_opts_auto_write_type() .
|
||||||
|
*/
|
||||||
|
#define BURN_REASONS_LEN 4096
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70219 */
|
||||||
|
/** Examines a completed setup for burn_disc_write() wether it is permissible
|
||||||
|
with drive and media. This function is called by burn_disc_write() but
|
||||||
|
an application might be interested in this check in advance.
|
||||||
|
@param o The options for the writing operation.
|
||||||
|
@param disc The descrition of the disc to be created
|
||||||
|
@param reasons Eventually returns a list of rejection reason statements
|
||||||
|
@param silent 1= do not issue error messages , 0= report problems
|
||||||
|
@return 1 ok, -1= no recordable media detected, 0= other failure
|
||||||
|
*/
|
||||||
|
int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
|
||||||
|
char reasons[BURN_REASONS_LEN], int silent);
|
||||||
|
|
||||||
|
/* <<< enabling switch for internal usage and trust in this function */
|
||||||
|
#define Libburn_precheck_write_ruleS 1
|
||||||
|
|
||||||
|
|
||||||
/** Write a disc in the drive. The drive must be grabbed successfully before
|
/** Write a disc in the drive. The drive must be grabbed successfully before
|
||||||
calling this function. Always ensure that the drive reports a status of
|
calling this function. Always ensure that the drive reports a status of
|
||||||
BURN_DISC_BLANK before calling this function.
|
BURN_DISC_BLANK ot BURN_DISC_APPENDABLE before calling this function.
|
||||||
|
Note: write_type BURN_WRITE_SAO is currently not capable of writing a mix
|
||||||
|
of data and audio tracks. You must use BURN_WRITE_TAO for such sessions.
|
||||||
|
To be set by burn_write_opts_set_write_type().
|
||||||
@param o The options for the writing operation.
|
@param o The options for the writing operation.
|
||||||
@param disc The struct burn_disc * that described the disc to be created
|
@param disc The struct burn_disc * that described the disc to be created
|
||||||
*/
|
*/
|
||||||
@ -980,7 +1103,7 @@ int burn_msf_to_lba(int m, int s, int f);
|
|||||||
*/
|
*/
|
||||||
void burn_lba_to_msf(int lba, int *m, int *s, int *f);
|
void burn_lba_to_msf(int lba, int *m, int *s, int *f);
|
||||||
|
|
||||||
/** Create a new disc (for DAO recording)*/
|
/** Create a new disc */
|
||||||
struct burn_disc *burn_disc_create(void);
|
struct burn_disc *burn_disc_create(void);
|
||||||
|
|
||||||
/** Delete disc and decrease the reference count on all its sessions
|
/** Delete disc and decrease the reference count on all its sessions
|
||||||
@ -988,9 +1111,7 @@ struct burn_disc *burn_disc_create(void);
|
|||||||
*/
|
*/
|
||||||
void burn_disc_free(struct burn_disc *d);
|
void burn_disc_free(struct burn_disc *d);
|
||||||
|
|
||||||
/** Create a new session (For SAO at once recording, or to be added to a
|
/** Create a new session */
|
||||||
disc for DAO)
|
|
||||||
*/
|
|
||||||
struct burn_session *burn_session_create(void);
|
struct burn_session *burn_session_create(void);
|
||||||
|
|
||||||
/** Free a session (and decrease reference count on all tracks inside)
|
/** Free a session (and decrease reference count on all tracks inside)
|
||||||
@ -1101,6 +1222,20 @@ struct burn_disc *burn_drive_get_disc(struct burn_drive *d);
|
|||||||
enum burn_source_status burn_track_set_source(struct burn_track *t,
|
enum burn_source_status burn_track_set_source(struct burn_track *t,
|
||||||
struct burn_source *s);
|
struct burn_source *s);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70218 */
|
||||||
|
/** Set a default track size to be used only if the track turns out to be of
|
||||||
|
unpredictable length and if the effective write type demands a fixed size.
|
||||||
|
This can be useful to enable write types CD SAO or DVD DAO together with
|
||||||
|
a track source like stdin. If the track source delivers fewer bytes than
|
||||||
|
announced then the track will be padded up with zeros.
|
||||||
|
@param t The track to change
|
||||||
|
@param size The size to set
|
||||||
|
@return 0=failure 1=sucess
|
||||||
|
*/
|
||||||
|
int burn_track_set_default_size(struct burn_track *t, off_t size);
|
||||||
|
|
||||||
|
|
||||||
/** Free a burn_source (decrease its refcount and maybe free it)
|
/** Free a burn_source (decrease its refcount and maybe free it)
|
||||||
@param s Source to free
|
@param s Source to free
|
||||||
*/
|
*/
|
||||||
@ -1120,6 +1255,7 @@ 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
|
>>> NOTE: Not reliable with tracks of undefined length
|
||||||
*/
|
*/
|
||||||
@ -1145,7 +1281,9 @@ void burn_structure_print_disc(struct burn_disc *d);
|
|||||||
void burn_structure_print_session(struct burn_session *s);
|
void burn_structure_print_session(struct burn_session *s);
|
||||||
void burn_structure_print_track(struct burn_track *t);
|
void burn_structure_print_track(struct burn_track *t);
|
||||||
|
|
||||||
/** Sets the write type for the write_opts struct
|
/** Sets the write type for the write_opts struct.
|
||||||
|
Note: write_type BURN_WRITE_SAO is currently not capable of writing a mix
|
||||||
|
of data and audio tracks. You must use BURN_WRITE_TAO for such sessions.
|
||||||
@param opts The write opts to change
|
@param opts The write opts to change
|
||||||
@param write_type The write type to use
|
@param write_type The write type to use
|
||||||
@param block_type The block type to use
|
@param block_type The block type to use
|
||||||
@ -1155,6 +1293,26 @@ int burn_write_opts_set_write_type(struct burn_write_opts *opts,
|
|||||||
enum burn_write_types write_type,
|
enum burn_write_types write_type,
|
||||||
int block_type);
|
int block_type);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70207 */
|
||||||
|
/** As an alternative to burn_write_opts_set_write_type() this function tries
|
||||||
|
to find a suitable write type and block type for a given write job
|
||||||
|
described by opts and disc. To be used after all other setups have been
|
||||||
|
made, i.e. immediately before burn_disc_write().
|
||||||
|
@param opts The nearly complete write opts to change
|
||||||
|
@param disc The already composed session and track model
|
||||||
|
@param reasons This text string collects reasons for decision resp. failure
|
||||||
|
@param flag Bitfield for control purposes:
|
||||||
|
bit0= do not choose type but check the one that is already set
|
||||||
|
bit1= do not issue error messages via burn_msgs queue
|
||||||
|
(is automatically set with bit0)
|
||||||
|
@return Chosen write type. BURN_WRITE_NONE on failure.
|
||||||
|
*/
|
||||||
|
enum burn_write_types burn_write_opts_auto_write_type(
|
||||||
|
struct burn_write_opts *opts, struct burn_disc *disc,
|
||||||
|
char reasons[BURN_REASONS_LEN], int flag);
|
||||||
|
|
||||||
|
|
||||||
/** Supplies toc entries for writing - not normally required for cd mastering
|
/** Supplies toc entries for writing - not normally required for cd mastering
|
||||||
@param opts The write opts to change
|
@param opts The write opts to change
|
||||||
@param count The number of entries
|
@param count The number of entries
|
||||||
@ -1208,17 +1366,39 @@ void burn_write_opts_set_multi(struct burn_write_opts *opts, int multi);
|
|||||||
|
|
||||||
/* ts A61222 */
|
/* ts A61222 */
|
||||||
/** Sets a start address for writing to media and write modes which allow to
|
/** Sets a start address for writing to media and write modes which allow to
|
||||||
choose this address at all (DVD+RW, DVD-RAM, DVD-RW only for now). The
|
choose this address at all (DVD+RW, DVD-RAM, formatted DVD-RW only for
|
||||||
address is given in bytes. If it is not -1 then a write run will fail if
|
now). The address is given in bytes. If it is not -1 then a write run
|
||||||
choice of start address is not supported or if the block alignment of the
|
will fail if choice of start address is not supported or if the block
|
||||||
address is not suitable for media and write mode. (Alignment to 32 kB
|
alignment of the address is not suitable for media and write mode.
|
||||||
blocks is advised with DVD media.)
|
(Alignment to 32 kB blocks is advised with DVD media.)
|
||||||
@param opts The write opts to change
|
@param opts The write opts to change
|
||||||
@param value The address in bytes (-1 = start at default address)
|
@param value The address in bytes (-1 = start at default address)
|
||||||
*/
|
*/
|
||||||
void burn_write_opts_set_start_byte(struct burn_write_opts *opts, off_t value);
|
void burn_write_opts_set_start_byte(struct burn_write_opts *opts, off_t value);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70213 */
|
||||||
|
/** Caution: still immature and likely to change. Problems arose with
|
||||||
|
sequential DVD-RW on one drive.
|
||||||
|
|
||||||
|
Controls wether the whole available space of the media shall be filled up
|
||||||
|
by the last track of the last session.
|
||||||
|
@param opts The write opts to change
|
||||||
|
@param fill_up_media If 1 : fill up by last track, if 0 = do not fill up
|
||||||
|
*/
|
||||||
|
void burn_write_opts_set_fillup(struct burn_write_opts *opts,
|
||||||
|
int fill_up_media);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70303 */
|
||||||
|
/** Eventually makes libburn ignore the failure of some conformance checks:
|
||||||
|
- the check wether CD write+block type is supported by the drive
|
||||||
|
@param opts The write opts to change
|
||||||
|
@param use_force 1=ignore above checks, 0=refuse work on failed check
|
||||||
|
*/
|
||||||
|
void burn_write_opts_set_force(struct burn_write_opts *opts, int use_force);
|
||||||
|
|
||||||
|
|
||||||
/** Sets whether to read in raw mode or not
|
/** Sets whether to read in raw mode or not
|
||||||
@param opts The read opts to change
|
@param opts The read opts to change
|
||||||
@param raw_mode If non-zero, reading will be done in raw mode, so that everything in the data tracks on the
|
@param raw_mode If non-zero, reading will be done in raw mode, so that everything in the data tracks on the
|
||||||
@ -1324,6 +1504,109 @@ int burn_drive_get_speedlist(struct burn_drive *d,
|
|||||||
int burn_drive_free_speedlist(struct burn_speed_descriptor **speed_list);
|
int burn_drive_free_speedlist(struct burn_speed_descriptor **speed_list);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70203 */
|
||||||
|
/** The reply structure for burn_disc_get_multi_caps()
|
||||||
|
*/
|
||||||
|
struct burn_multi_caps {
|
||||||
|
|
||||||
|
/* Multi-session capability allows to keep the media appendable after
|
||||||
|
writing a session. It also guarantees that the drive will be able
|
||||||
|
to predict and use the appropriate Next Writeable Address to place
|
||||||
|
the next session on the media without overwriting the existing ones.
|
||||||
|
It does not guarantee that the selected write type is able to do
|
||||||
|
an appending session after the next session. (E.g. CD SAO is capable
|
||||||
|
of multi-session by keeping a disc appendable. But .might_do_sao
|
||||||
|
will be 0 afterwards, when checking the appendable media.)
|
||||||
|
1= media may be kept appendable by burn_write_opts_set_multi(o,1)
|
||||||
|
0= media will not be appendable
|
||||||
|
*/
|
||||||
|
int multi_session;
|
||||||
|
|
||||||
|
/* Multi-track capability allows to write more than one track source
|
||||||
|
during a single session. The written tracks can later be found in
|
||||||
|
libburn's TOC model with their start addresses and sizes.
|
||||||
|
1= multiple tracks per session are allowed
|
||||||
|
0= only one track per session allowed
|
||||||
|
*/
|
||||||
|
int multi_track;
|
||||||
|
|
||||||
|
/* Start-address capability allows to set a non-zero address with
|
||||||
|
burn_write_opts_set_start_byte(). Eventually this has to respect
|
||||||
|
.start_alignment and .start_range_low, .start_range_high in this
|
||||||
|
structure.
|
||||||
|
1= non-zero start address is allowed
|
||||||
|
0= only start address 0 is allowed (to depict the drive's own idea
|
||||||
|
about the appropriate write start)
|
||||||
|
*/
|
||||||
|
int start_adr;
|
||||||
|
|
||||||
|
/** The alignment for start addresses.
|
||||||
|
( start_address % start_alignment ) must be 0.
|
||||||
|
*/
|
||||||
|
off_t start_alignment;
|
||||||
|
|
||||||
|
/** The lowest permissible start address.
|
||||||
|
*/
|
||||||
|
off_t start_range_low;
|
||||||
|
|
||||||
|
/** The highest addressable start address.
|
||||||
|
*/
|
||||||
|
off_t start_range_high;
|
||||||
|
|
||||||
|
/** Potential availability of write modes
|
||||||
|
4= needs no size prediction, not to be chosen automatically
|
||||||
|
3= needs size prediction, not to be chosen automatically
|
||||||
|
2= available, no size prediction necessary
|
||||||
|
1= available, needs exact size prediction
|
||||||
|
0= not available
|
||||||
|
With CD media (profiles 0x09 and 0x0a) check also the elements
|
||||||
|
*_block_types of the according write mode.
|
||||||
|
*/
|
||||||
|
int might_do_tao;
|
||||||
|
int might_do_sao;
|
||||||
|
int might_do_raw;
|
||||||
|
|
||||||
|
/** Generally advised write mode.
|
||||||
|
Not necessarily the one chosen by burn_write_opts_auto_write_type()
|
||||||
|
because the burn_disc structure might impose particular demands.
|
||||||
|
*/
|
||||||
|
enum burn_write_types advised_write_mode;
|
||||||
|
|
||||||
|
/** Write mode as given by parameter wt of burn_disc_get_multi_caps().
|
||||||
|
*/
|
||||||
|
enum burn_write_types selected_write_mode;
|
||||||
|
|
||||||
|
/** Profile number which was current when the reply was generated */
|
||||||
|
int current_profile;
|
||||||
|
|
||||||
|
/** Wether the current profile indicates CD media. 1=yes, 0=no */
|
||||||
|
int current_is_cd_profile;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Allocates a struct burn_multi_caps (see above) and fills it with values
|
||||||
|
which are appropriate for the drive and the loaded media. The drive
|
||||||
|
must be grabbed for this call. The returned structure has to be disposed
|
||||||
|
via burn_disc_free_multi_caps() when no longer needed.
|
||||||
|
@param d The drive to inquire
|
||||||
|
@param wt With BURN_WRITE_NONE the best capabilities of all write modes
|
||||||
|
get returned. If set to a write mode like BURN_WRITE_SAO the
|
||||||
|
capabilities with that particular mode are returned and the
|
||||||
|
return value is 0 if the desired mode is not possible.
|
||||||
|
@param caps returns the info structure
|
||||||
|
@param flag Bitfield for control purposes (unused yet, submit 0)
|
||||||
|
@return < 0 : error , 0 : writing seems impossible , 1 : writing possible
|
||||||
|
*/
|
||||||
|
int burn_disc_get_multi_caps(struct burn_drive *d, enum burn_write_types wt,
|
||||||
|
struct burn_multi_caps **caps, int flag);
|
||||||
|
|
||||||
|
/** Removes from memory a multi session info structure which was returned by
|
||||||
|
burn_disc_get_multi_caps(). The pointer *caps gets set to NULL.
|
||||||
|
@param caps the info structure to dispose (note: pointer to pointer)
|
||||||
|
@return 0 : *caps was already NULL, 1 : memory object was disposed
|
||||||
|
*/
|
||||||
|
int burn_disc_free_multi_caps(struct burn_multi_caps **caps);
|
||||||
|
|
||||||
|
|
||||||
/** Gets a copy of the toc_entry structure associated with a track
|
/** Gets a copy of the toc_entry structure associated with a track
|
||||||
@param t Track to get the entry from
|
@param t Track to get the entry from
|
||||||
@param entry Struct for the library to fill out
|
@param entry Struct for the library to fill out
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
|
|
||||||
/* libdax_msgs
|
/* libdax_msgs
|
||||||
Message handling facility of libdax.
|
Message handling facility of libdax.
|
||||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
Copyright (C) 2006-2007 Thomas Schmitt <scdbackup@gmx.net>,
|
||||||
|
provided under GPL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -347,9 +348,23 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
|
|||||||
0x00020127 (NOTE,HIGH) = Write start address is ...
|
0x00020127 (NOTE,HIGH) = Write start address is ...
|
||||||
0x00020128 (FATAL,HIGH) = Unsupported inquiry_type with mmc_get_performance
|
0x00020128 (FATAL,HIGH) = Unsupported inquiry_type with mmc_get_performance
|
||||||
0x00020129 (SORRY,HIGH) = Will not format media type
|
0x00020129 (SORRY,HIGH) = Will not format media type
|
||||||
|
0x0002012a (FATAL,HIGH) = Cannot inquire write mode capabilities
|
||||||
|
0x0002012b (FATAL,HIGH) = Drive offers no suitable write mode with this job
|
||||||
|
0x0002012c (SORRY,HIGH) = Too many logical tracks recorded
|
||||||
|
0x0002012d (FATAL,HIGH) = Exceeding range of permissible write addresses
|
||||||
|
0x0002012e (NOTE,HIGH) = Activated track default size
|
||||||
|
0x0002012f (SORRY,HIGH) = SAO is restricted to single fixed size session
|
||||||
0x00020130 (SORRY,HIGH) = Drive and media state unsuitable for blanking
|
0x00020130 (SORRY,HIGH) = Drive and media state unsuitable for blanking
|
||||||
0x00020131 (SORRY,HIGH) = No suitable formatting type offered by drive
|
0x00020131 (SORRY,HIGH) = No suitable formatting type offered by drive
|
||||||
|
0x00020132 (SORRY,HIGH) = Selected format is not suitable for libburn
|
||||||
|
0x00020133 (SORRY,HIGH) = Cannot mix data and audio in SAO mode
|
||||||
|
0x00020134 (NOTE,HIGH) = Defaulted TAO to DAO
|
||||||
|
0x00020135 (SORRY,HIGH) = Cannot perform TAO, job unsuitable for DAO
|
||||||
|
0x00020136 (SORRY,HIGH) = DAO burning restricted to single fixed size track
|
||||||
|
0x00020137 (HINT,HIGH) = TAO would be possible
|
||||||
|
0x00020138 (FATAL,HIGH) = Cannot reserve track
|
||||||
|
0x00020139 (SORRY,HIGH) = Write job parameters are unsuitable
|
||||||
|
0x0002013a (FATAL,HIGH) = No suitable media detected
|
||||||
|
|
||||||
libdax_audioxtr:
|
libdax_audioxtr:
|
||||||
0x00020200 (SORRY,HIGH) = Cannot open audio source file
|
0x00020200 (SORRY,HIGH) = Cannot open audio source file
|
||||||
|
828
libburn/mmc.c
828
libburn/mmc.c
File diff suppressed because it is too large
Load Diff
@ -69,4 +69,7 @@ int mmc_compose_mode_page_5(struct burn_drive *d,
|
|||||||
unsigned char *pd);
|
unsigned char *pd);
|
||||||
|
|
||||||
|
|
||||||
|
/* mmc5r03c.pdf 4.3.4.4.1 d) "The maximum number of RZones is 2 302." */
|
||||||
|
#define BURN_MMC_FAKE_TOC_MAX_SIZE 2302
|
||||||
|
|
||||||
#endif /*__MMC*/
|
#endif /*__MMC*/
|
||||||
|
@ -21,6 +21,10 @@ struct burn_source *burn_null_source_new(void)
|
|||||||
src->read_sub = NULL;
|
src->read_sub = NULL;
|
||||||
|
|
||||||
src->get_size = 0;
|
src->get_size = 0;
|
||||||
|
|
||||||
|
/* ts A70126 */
|
||||||
|
src->set_size = NULL;
|
||||||
|
|
||||||
src->free_data = NULL;
|
src->free_data = NULL;
|
||||||
src->data = NULL;
|
src->data = NULL;
|
||||||
return src;
|
return src;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#include "libburn.h"
|
#include "libburn.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
#include "drive.h"
|
||||||
#include "transport.h"
|
#include "transport.h"
|
||||||
|
|
||||||
/* ts A61007 */
|
/* ts A61007 */
|
||||||
@ -35,6 +36,8 @@ struct burn_write_opts *burn_write_opts_new(struct burn_drive *drive)
|
|||||||
opts->obs = -1;
|
opts->obs = -1;
|
||||||
opts->obs_pad = 0;
|
opts->obs_pad = 0;
|
||||||
opts->start_byte = -1;
|
opts->start_byte = -1;
|
||||||
|
opts->fill_up_media = 0;
|
||||||
|
opts->force_is_set = 0;
|
||||||
opts->has_mediacatalog = 0;
|
opts->has_mediacatalog = 0;
|
||||||
opts->format = BURN_CDROM;
|
opts->format = BURN_CDROM;
|
||||||
opts->multi = 0;
|
opts->multi = 0;
|
||||||
@ -170,6 +173,191 @@ void burn_write_opts_set_start_byte(struct burn_write_opts *opts, off_t value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70207 API */
|
||||||
|
/** @param flag Bitfield for control purposes:
|
||||||
|
bit0= do not choose type but check the one that is already set
|
||||||
|
bit1= do not issue error messages via burn_msgs queue
|
||||||
|
*/
|
||||||
|
enum burn_write_types burn_write_opts_auto_write_type(
|
||||||
|
struct burn_write_opts *opts, struct burn_disc *disc,
|
||||||
|
char reasons[BURN_REASONS_LEN], int flag)
|
||||||
|
{
|
||||||
|
struct burn_multi_caps *caps = NULL;
|
||||||
|
struct burn_drive *d = opts->drive;
|
||||||
|
struct burn_disc_mode_demands demands;
|
||||||
|
enum burn_write_types wt;
|
||||||
|
int ret, would_do_sao = 0;
|
||||||
|
char *reason_pt;
|
||||||
|
|
||||||
|
reasons[0] = 0;
|
||||||
|
|
||||||
|
if (d->status != BURN_DISC_BLANK &&
|
||||||
|
d->status != BURN_DISC_APPENDABLE){
|
||||||
|
if (d->status == BURN_DISC_FULL)
|
||||||
|
strcat(reasons, "MEDIA: closed or not recordable, ");
|
||||||
|
else
|
||||||
|
strcat(reasons,"MEDIA: no writeable media detected, ");
|
||||||
|
if (!(flag & 3))
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x0002013a,
|
||||||
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"No suitable media detected", 0, 0);
|
||||||
|
return BURN_WRITE_NONE;
|
||||||
|
}
|
||||||
|
ret = burn_disc_get_write_mode_demands(disc, opts, &demands,
|
||||||
|
!!opts->fill_up_media);
|
||||||
|
if (ret <= 0) {
|
||||||
|
strcat(reasons, "cannot recognize job demands, ");
|
||||||
|
{wt = BURN_WRITE_NONE; goto ex;}
|
||||||
|
}
|
||||||
|
if (demands.exotic_track && !d->current_is_cd_profile) {
|
||||||
|
if (demands.audio)
|
||||||
|
strcat(reasons, "audio track prohibited by non-CD, ");
|
||||||
|
else
|
||||||
|
strcat(reasons, "exotic track prohibited by non-CD, ");
|
||||||
|
{wt = BURN_WRITE_NONE; goto ex;}
|
||||||
|
}
|
||||||
|
if ((flag & 1) && opts->write_type != BURN_WRITE_SAO)
|
||||||
|
goto try_tao;
|
||||||
|
reason_pt = reasons + strlen(reasons);
|
||||||
|
strcat(reasons, "SAO: ");
|
||||||
|
if (d->status != BURN_DISC_BLANK) {
|
||||||
|
strcat(reasons, "write type SAO works only on blank media, ");
|
||||||
|
goto try_tao;
|
||||||
|
}
|
||||||
|
burn_disc_free_multi_caps(&caps);
|
||||||
|
ret = burn_disc_get_multi_caps(d, BURN_WRITE_SAO, &caps, 0);
|
||||||
|
if (ret < 0) {
|
||||||
|
no_caps:;
|
||||||
|
strcat(reasons, "cannot inquire write mode capabilities, ");
|
||||||
|
{wt = BURN_WRITE_NONE; goto ex;}
|
||||||
|
} else if (ret == 0) {
|
||||||
|
strcat(reasons, "no SAO offered by drive and media, ");
|
||||||
|
goto no_sao;
|
||||||
|
}
|
||||||
|
if ((opts->multi || demands.multi_session) &&
|
||||||
|
!caps->multi_session)
|
||||||
|
strcat(reasons, "multi session capability lacking, ");
|
||||||
|
if (demands.will_append)
|
||||||
|
strcat(reasons, "appended session capability lacking, ");
|
||||||
|
if (demands.multi_track && !caps->multi_track)
|
||||||
|
strcat(reasons, "multi track capability lacking, ");
|
||||||
|
if (demands.unknown_track_size == 1 &&
|
||||||
|
(caps->might_do_sao == 1 || caps->might_do_sao == 3))
|
||||||
|
strcat(reasons, "track size unpredictable, ");
|
||||||
|
if (demands.mixed_mode)
|
||||||
|
strcat(reasons, "tracks of different modes mixed, ");
|
||||||
|
if (demands.exotic_track && !d->current_is_cd_profile)
|
||||||
|
strcat(reasons, "non-data track on non-cd, ");
|
||||||
|
else if (d->current_is_cd_profile)
|
||||||
|
if ((d->block_types[BURN_WRITE_TAO] & demands.block_types) !=
|
||||||
|
demands.block_types)
|
||||||
|
strcat(reasons, "drive dislikes block type, ");
|
||||||
|
if (d->current_is_cd_profile && opts->fill_up_media)
|
||||||
|
strcat(reasons, "cd sao cannot do media fill up yet, ");
|
||||||
|
if (strcmp(reason_pt, "SAO: ") != 0)
|
||||||
|
goto no_sao;
|
||||||
|
would_do_sao = 1;
|
||||||
|
if (demands.unknown_track_size == 2 && (!(flag & 1)) &&
|
||||||
|
(caps->might_do_sao == 1 || caps->might_do_sao == 3)) {
|
||||||
|
strcat(reasons, "would have to use default track sizes, ");
|
||||||
|
goto no_sao;
|
||||||
|
} else if (caps->might_do_sao >= 3 && !(flag & 1))
|
||||||
|
goto try_tao;
|
||||||
|
do_sao:;
|
||||||
|
if (!(flag & 1))
|
||||||
|
burn_write_opts_set_write_type(
|
||||||
|
opts, BURN_WRITE_SAO, BURN_BLOCK_SAO);
|
||||||
|
{wt = BURN_WRITE_SAO; goto ex;}
|
||||||
|
no_sao:;
|
||||||
|
try_tao:;
|
||||||
|
if ((flag & 1) && opts->write_type != BURN_WRITE_TAO)
|
||||||
|
goto try_raw;
|
||||||
|
reason_pt = reasons + strlen(reasons);
|
||||||
|
strcat(reasons, "TAO: ");
|
||||||
|
burn_disc_free_multi_caps(&caps);
|
||||||
|
ret = burn_disc_get_multi_caps(d, BURN_WRITE_TAO, &caps, 0);
|
||||||
|
if (ret < 0)
|
||||||
|
goto no_caps;
|
||||||
|
if (ret == 0) {
|
||||||
|
strcat(reasons, "no TAO offered by drive and media, ");
|
||||||
|
goto no_tao;
|
||||||
|
}
|
||||||
|
if ((opts->multi || demands.multi_session) && !caps->multi_session)
|
||||||
|
strcat(reasons, "multi session capability lacking, ");
|
||||||
|
if (demands.multi_track && !caps->multi_track)
|
||||||
|
strcat(reasons, "multi track capability lacking, ");
|
||||||
|
if (demands.exotic_track && !d->current_is_cd_profile)
|
||||||
|
strcat(reasons, "non-data track on non-cd, ");
|
||||||
|
if (d->current_is_cd_profile && !opts->force_is_set)
|
||||||
|
if ((d->block_types[BURN_WRITE_TAO] & demands.block_types) !=
|
||||||
|
demands.block_types)
|
||||||
|
strcat(reasons, "drive dislikes block type, ");
|
||||||
|
if (strcmp(reason_pt, "TAO: ") != 0)
|
||||||
|
goto no_tao;
|
||||||
|
/* ( TAO data/audio block size will be handled automatically ) */
|
||||||
|
if (!(flag & 1))
|
||||||
|
burn_write_opts_set_write_type(
|
||||||
|
opts, BURN_WRITE_TAO, BURN_BLOCK_MODE1);
|
||||||
|
{wt = BURN_WRITE_TAO; goto ex;}
|
||||||
|
no_tao:;
|
||||||
|
if (would_do_sao && !(flag & 1))
|
||||||
|
goto do_sao;
|
||||||
|
if (!d->current_is_cd_profile)
|
||||||
|
goto no_write_mode;
|
||||||
|
try_raw:;
|
||||||
|
if ((flag & 1) && opts->write_type != BURN_WRITE_RAW)
|
||||||
|
goto no_write_mode;
|
||||||
|
|
||||||
|
if (!(flag & 1)) /* For now: no automatic raw write modes */
|
||||||
|
goto no_write_mode;
|
||||||
|
|
||||||
|
reason_pt = reasons + strlen(reasons);
|
||||||
|
strcat(reasons, "RAW: ");
|
||||||
|
if (!d->current_is_cd_profile)
|
||||||
|
strcat(reasons, "write type RAW prohibited by non-cd, ");
|
||||||
|
else if (d->status != BURN_DISC_BLANK)
|
||||||
|
strcat(reasons, "write type RAW works only on blank media, ");
|
||||||
|
else if ((d->block_types[BURN_WRITE_TAO] & demands.block_types) !=
|
||||||
|
demands.block_types)
|
||||||
|
strcat(reasons, "drive dislikes block type, ");
|
||||||
|
if (strcmp(reason_pt, "RAW: ") != 0)
|
||||||
|
goto no_write_mode;
|
||||||
|
|
||||||
|
/* For now: no setting of raw write modes */
|
||||||
|
|
||||||
|
{wt = BURN_WRITE_RAW; goto ex;}
|
||||||
|
|
||||||
|
no_write_mode:;
|
||||||
|
wt = BURN_WRITE_NONE;
|
||||||
|
ex:;
|
||||||
|
burn_disc_free_multi_caps(&caps);
|
||||||
|
if (wt == BURN_WRITE_NONE && !(flag & 3)) {
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x0002012b,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"Drive offers no suitable write mode with this job",
|
||||||
|
0, 0);
|
||||||
|
}
|
||||||
|
return wt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70213 : new API function */
|
||||||
|
void burn_write_opts_set_fillup(struct burn_write_opts *opts,int fill_up_media)
|
||||||
|
{
|
||||||
|
opts->fill_up_media = !!fill_up_media;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70303: API */
|
||||||
|
void burn_write_opts_set_force(struct burn_write_opts *opts, int use_force)
|
||||||
|
{
|
||||||
|
opts->force_is_set = !!use_force;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void burn_read_opts_set_raw(struct burn_read_opts *opts, int raw)
|
void burn_read_opts_set_raw(struct burn_read_opts *opts, int raw)
|
||||||
{
|
{
|
||||||
opts->raw = raw;
|
opts->raw = raw;
|
||||||
|
@ -41,6 +41,14 @@ struct burn_write_opts
|
|||||||
/* ts A61222 : Start address for media which allow a choice */
|
/* ts A61222 : Start address for media which allow a choice */
|
||||||
off_t start_byte;
|
off_t start_byte;
|
||||||
|
|
||||||
|
/* ts A70213 : Wether to fill up the available space on media */
|
||||||
|
int fill_up_media;
|
||||||
|
|
||||||
|
/* ts A70303 : Wether to override conformance checks:
|
||||||
|
- the check wether CD write+block type is supported by the drive
|
||||||
|
*/
|
||||||
|
int force_is_set;
|
||||||
|
|
||||||
/** A disc can have a media catalog number */
|
/** A disc can have a media catalog number */
|
||||||
int has_mediacatalog;
|
int has_mediacatalog;
|
||||||
unsigned char mediacatalog[13];
|
unsigned char mediacatalog[13];
|
||||||
|
@ -7,10 +7,6 @@
|
|||||||
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
Copyright (C) 2006 Thomas Schmitt <scdbackup@gmx.net>, provided under GPL
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef BURN_OS_H_INCLUDED
|
|
||||||
#define BURN_OS_H_INCLUDED 1
|
|
||||||
|
|
||||||
|
|
||||||
/** List of all signals which shall be caught by signal handlers and trigger
|
/** List of all signals which shall be caught by signal handlers and trigger
|
||||||
a graceful abort of libburn. (See man 7 signal.)
|
a graceful abort of libburn. (See man 7 signal.)
|
||||||
*/
|
*/
|
||||||
@ -53,13 +49,8 @@ SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
|
|||||||
can work in BSD and sg_enumerate() can use it.
|
can work in BSD and sg_enumerate() can use it.
|
||||||
*/
|
*/
|
||||||
#define BURN_OS_DEFINE_DRIVE_ENUMERATOR_T \
|
#define BURN_OS_DEFINE_DRIVE_ENUMERATOR_T \
|
||||||
struct burn_drive_enumeration_state { \
|
struct burn_drive_enumeration_state; \
|
||||||
union ccb ccb; \
|
typedef struct burn_drive_enumeration_state *burn_drive_enumerator_t;
|
||||||
int bufsize, fd; \
|
|
||||||
unsigned int i; \
|
|
||||||
int skip_device; \
|
|
||||||
}; \
|
|
||||||
typedef struct burn_drive_enumeration_state burn_drive_enumerator_t;
|
|
||||||
|
|
||||||
|
|
||||||
/* The list of operating system dependent elements in struct burn_drive.
|
/* The list of operating system dependent elements in struct burn_drive.
|
||||||
@ -68,6 +59,3 @@ typedef struct burn_drive_enumeration_state burn_drive_enumerator_t;
|
|||||||
#define BURN_OS_TRANSPORT_DRIVE_ELEMENTS \
|
#define BURN_OS_TRANSPORT_DRIVE_ELEMENTS \
|
||||||
struct cam_device* cam;
|
struct cam_device* cam;
|
||||||
|
|
||||||
|
|
||||||
#endif /* ! BURN_OS_H_INCLUDED */
|
|
||||||
|
|
||||||
|
@ -1,19 +1,5 @@
|
|||||||
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Revives old enumerate_common(). New version delegates much work
|
|
||||||
to methods in drive, mmc, spc, and sbc .
|
|
||||||
*/
|
|
||||||
#define Scsi_freebsd_make_own_enumeratE 1
|
|
||||||
|
|
||||||
|
|
||||||
/* Revives old scsi_enumerate_drives(). New version delegates most work to
|
|
||||||
sg_give_next_adr().
|
|
||||||
*/
|
|
||||||
#define Scsi_freebsd_old_scsi_enumeratE 1
|
|
||||||
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -45,6 +31,13 @@
|
|||||||
#include "libdax_msgs.h"
|
#include "libdax_msgs.h"
|
||||||
extern struct libdax_msgs *libdax_messenger;
|
extern struct libdax_msgs *libdax_messenger;
|
||||||
|
|
||||||
|
struct burn_drive_enumeration_state {
|
||||||
|
int fd;
|
||||||
|
union ccb ccb;
|
||||||
|
unsigned int i;
|
||||||
|
int skip_device;
|
||||||
|
};
|
||||||
|
|
||||||
static void enumerate_common(char *fname, int bus_no, int host_no,
|
static void enumerate_common(char *fname, int bus_no, int host_no,
|
||||||
int channel_no, int target_no, int lun_no);
|
int channel_no, int target_no, int lun_no);
|
||||||
|
|
||||||
@ -57,33 +50,20 @@ int burn_drive_is_banned(char *device_address);
|
|||||||
int mmc_function_spy(char * text);
|
int mmc_function_spy(char * text);
|
||||||
|
|
||||||
|
|
||||||
#ifdef Scsi_freebsd_old_scsi_enumeratE
|
|
||||||
|
|
||||||
int sg_give_next_adr(burn_drive_enumerator_t *idx,
|
|
||||||
char adr[], int adr_size, int initialize)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int sg_is_enumerable_adr(char* adr)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
|
|
||||||
int *target_no, int *lun_no)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* Scsi_freebsd_old_scsi_enumeratE */
|
|
||||||
|
|
||||||
/* ts A61021 : Moved most code from scsi_enumerate_drives under
|
/* ts A61021 : Moved most code from scsi_enumerate_drives under
|
||||||
sg_give_next_adr() */
|
sg_give_next_adr() */
|
||||||
/* Some helper functions for scsi_give_next_adr() */
|
/* Some helper functions for scsi_give_next_adr() */
|
||||||
|
|
||||||
static int sg_init_enumerator(burn_drive_enumerator_t *idx)
|
static int sg_init_enumerator(burn_drive_enumerator_t *idx_)
|
||||||
{
|
{
|
||||||
|
struct burn_drive_enumeration_state *idx;
|
||||||
|
int bufsize;
|
||||||
|
|
||||||
|
idx = malloc(sizeof(*idx));
|
||||||
|
if (idx == NULL) {
|
||||||
|
warnx("can't malloc memory for enumerator");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
idx->skip_device = 0;
|
idx->skip_device = 0;
|
||||||
|
|
||||||
if ((idx->fd = open(XPT_DEVICE, O_RDWR)) == -1) {
|
if ((idx->fd = open(XPT_DEVICE, O_RDWR)) == -1) {
|
||||||
@ -98,12 +78,13 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx)
|
|||||||
idx->ccb.ccb_h.target_lun = CAM_LUN_WILDCARD;
|
idx->ccb.ccb_h.target_lun = CAM_LUN_WILDCARD;
|
||||||
|
|
||||||
idx->ccb.ccb_h.func_code = XPT_DEV_MATCH;
|
idx->ccb.ccb_h.func_code = XPT_DEV_MATCH;
|
||||||
idx->bufsize = sizeof(struct dev_match_result) * 100;
|
bufsize = sizeof(struct dev_match_result) * 100;
|
||||||
idx->ccb.cdm.match_buf_len = idx->bufsize;
|
idx->ccb.cdm.match_buf_len = bufsize;
|
||||||
idx->ccb.cdm.matches = (struct dev_match_result *)malloc(idx->bufsize);
|
idx->ccb.cdm.matches = (struct dev_match_result *)malloc(bufsize);
|
||||||
if (idx->ccb.cdm.matches == NULL) {
|
if (idx->ccb.cdm.matches == NULL) {
|
||||||
warnx("can't malloc memory for matches");
|
warnx("can't malloc memory for matches");
|
||||||
close(idx->fd);
|
close(idx->fd);
|
||||||
|
free(idx);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
idx->ccb.cdm.num_matches = 0;
|
idx->ccb.cdm.num_matches = 0;
|
||||||
@ -116,12 +97,28 @@ static int sg_init_enumerator(burn_drive_enumerator_t *idx)
|
|||||||
idx->ccb.cdm.num_patterns = 0;
|
idx->ccb.cdm.num_patterns = 0;
|
||||||
idx->ccb.cdm.pattern_buf_len = 0;
|
idx->ccb.cdm.pattern_buf_len = 0;
|
||||||
|
|
||||||
|
*idx_ = idx;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sg_destroy_enumerator(burn_drive_enumerator_t *idx_)
|
||||||
static int sg_next_enumeration_buffer(burn_drive_enumerator_t *idx)
|
|
||||||
{
|
{
|
||||||
|
struct burn_drive_enumeration_state *idx = *idx_;
|
||||||
|
|
||||||
|
if(idx->fd != -1)
|
||||||
|
close(idx->fd);
|
||||||
|
|
||||||
|
free(idx->ccb.cdm.matches);
|
||||||
|
free(idx);
|
||||||
|
|
||||||
|
*idx_ = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sg_next_enumeration_buffer(burn_drive_enumerator_t *idx_)
|
||||||
|
{
|
||||||
|
struct burn_drive_enumeration_state *idx = *idx_;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We do the ioctl multiple times if necessary, in case there are
|
* We do the ioctl multiple times if necessary, in case there are
|
||||||
* more than 100 nodes in the EDT.
|
* more than 100 nodes in the EDT.
|
||||||
@ -152,44 +149,40 @@ static int sg_next_enumeration_buffer(burn_drive_enumerator_t *idx)
|
|||||||
@return 1 = reply is a valid address , 0 = no further address available
|
@return 1 = reply is a valid address , 0 = no further address available
|
||||||
-1 = severe error (e.g. adr_size too small)
|
-1 = severe error (e.g. adr_size too small)
|
||||||
*/
|
*/
|
||||||
int sg_give_next_adr(burn_drive_enumerator_t *idx,
|
int sg_give_next_adr(burn_drive_enumerator_t *idx_,
|
||||||
char adr[], int adr_size, int initialize)
|
char adr[], int adr_size, int initialize)
|
||||||
{
|
{
|
||||||
|
struct burn_drive_enumeration_state *idx;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (initialize == 1) {
|
if (initialize == 1) {
|
||||||
ret = sg_init_enumerator(idx);
|
ret = sg_init_enumerator(idx_);
|
||||||
if (ret<=0)
|
if (ret<=0)
|
||||||
return ret;
|
return ret;
|
||||||
} else if (initialize == -1) {
|
} else if (initialize == -1) {
|
||||||
if(idx->fd != -1)
|
sg_destroy_enumerator(idx_);
|
||||||
close(idx->fd);
|
|
||||||
idx->fd = -1;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
idx = *idx_;
|
||||||
|
|
||||||
try_item:; /* This spaghetti loop keeps the number of tabs small */
|
do {
|
||||||
|
if (idx->i >= idx->ccb.cdm.num_matches) {
|
||||||
/* Loop content from old scsi_enumerate_drives() */
|
ret = sg_next_enumeration_buffer(idx_);
|
||||||
|
|
||||||
while (idx->i >= idx->ccb.cdm.num_matches) {
|
|
||||||
ret = sg_next_enumeration_buffer(idx);
|
|
||||||
if (ret<=0)
|
if (ret<=0)
|
||||||
return -1;
|
return -1;
|
||||||
if (!((idx->ccb.ccb_h.status == CAM_REQ_CMP)
|
|
||||||
&& (idx->ccb.cdm.status == CAM_DEV_MATCH_MORE)) )
|
|
||||||
return 0;
|
|
||||||
idx->i = 0;
|
idx->i = 0;
|
||||||
}
|
} else
|
||||||
|
(idx->i)++;
|
||||||
|
|
||||||
|
while (idx->i < idx->ccb.cdm.num_matches) {
|
||||||
switch (idx->ccb.cdm.matches[idx->i].type) {
|
switch (idx->ccb.cdm.matches[idx->i].type) {
|
||||||
case DEV_MATCH_BUS:
|
case DEV_MATCH_BUS:
|
||||||
break;
|
break;
|
||||||
case DEV_MATCH_DEVICE: {
|
case DEV_MATCH_DEVICE: {
|
||||||
struct device_match_result* result;
|
struct device_match_result* result;
|
||||||
|
|
||||||
result = &(idx->ccb.cdm.matches[i].result.device_result);
|
result = &(idx->ccb.cdm.matches[idx->i].result.device_result);
|
||||||
if (result->flags & DEV_RESULT_UNCONFIGURED)
|
if (result->flags & DEV_RESULT_UNCONFIGURED)
|
||||||
idx->skip_device = 1;
|
idx->skip_device = 1;
|
||||||
else
|
else
|
||||||
@ -198,17 +191,15 @@ try_item:; /* This spaghetti loop keeps the number of tabs small */
|
|||||||
}
|
}
|
||||||
case DEV_MATCH_PERIPH: {
|
case DEV_MATCH_PERIPH: {
|
||||||
struct periph_match_result* result;
|
struct periph_match_result* result;
|
||||||
char buf[64];
|
|
||||||
|
|
||||||
result = &(idx->ccb.cdm.matches[i].result.periph_result);
|
result = &(idx->ccb.cdm.matches[idx->i].result.periph_result);
|
||||||
if (idx->skip_device ||
|
if (idx->skip_device ||
|
||||||
strcmp(result->periph_name, "pass") == 0)
|
strcmp(result->periph_name, "pass") == 0)
|
||||||
break;
|
break;
|
||||||
snprintf(buf, sizeof (buf), "/dev/%s%d",
|
ret = snprintf(adr, adr_size, "/dev/%s%d",
|
||||||
result->periph_name, result->unit_number);
|
result->periph_name, result->unit_number);
|
||||||
if(adr_size <= strlen(buf)
|
if(ret >= adr_size)
|
||||||
return -1;
|
return -1;
|
||||||
strcpy(adr, buf);
|
|
||||||
|
|
||||||
/* Found next enumerable address */
|
/* Found next enumerable address */
|
||||||
return 1;
|
return 1;
|
||||||
@ -218,29 +209,34 @@ try_item:; /* This spaghetti loop keeps the number of tabs small */
|
|||||||
/* printf(stderr, "unknown match type\n"); */
|
/* printf(stderr, "unknown match type\n"); */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
(idx->i)++;
|
(idx->i)++;
|
||||||
goto try_item; /* Regular function exit is return 1 above */
|
}
|
||||||
|
} while ((idx->ccb.ccb_h.status == CAM_REQ_CMP)
|
||||||
|
&& (idx->ccb.cdm.status == CAM_DEV_MATCH_MORE));
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int sg_is_enumerable_adr(char* adr)
|
int sg_is_enumerable_adr(char* adr)
|
||||||
{
|
{
|
||||||
burn_drive_enumerator_t idx;
|
burn_drive_enumerator_t idx;
|
||||||
int initialize = 1;
|
int ret;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
|
ret = sg_init_enumerator(&idx);
|
||||||
|
if (ret <= 0)
|
||||||
|
return 0;
|
||||||
while(1) {
|
while(1) {
|
||||||
ret = sg_give_next_adr(&idx, buf, sizeof(buf), initialize);
|
ret = sg_give_next_adr(&idx, buf, sizeof(buf), 0);
|
||||||
initialize = 0;
|
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
break;
|
break;
|
||||||
if (strcmp(adr, buf) == 0) {
|
if (strcmp(adr, buf) == 0) {
|
||||||
sg_give_next_adr(&idx, buf, sizeof(buf), -1);
|
sg_destroy_enumerator(&idx);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sg_give_next_adr(&idx, buf, sizeof(buf), -1);
|
sg_destroy_enumerator(&idx);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,32 +248,32 @@ int sg_obtain_scsi_adr(char *path, int *bus_no, int *host_no, int *channel_no,
|
|||||||
int *target_no, int *lun_no)
|
int *target_no, int *lun_no)
|
||||||
{
|
{
|
||||||
burn_drive_enumerator_t idx;
|
burn_drive_enumerator_t idx;
|
||||||
int initialize = 1;
|
int ret;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
struct periph_match_result* result;
|
struct periph_match_result* result;
|
||||||
|
|
||||||
|
ret = sg_init_enumerator(&idx);
|
||||||
|
if (ret <= 0)
|
||||||
|
return 0;
|
||||||
while(1) {
|
while(1) {
|
||||||
ret = sg_give_next_adr(&idx, buf, sizeof(buf), initialize);
|
ret = sg_give_next_adr(&idx, buf, sizeof(buf), 0);
|
||||||
initialize = 0;
|
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
break;
|
break;
|
||||||
if (strcmp(adr, buf) != 0)
|
if (strcmp(path, buf) == 0) {
|
||||||
continue;
|
result = &(idx->ccb.cdm.matches[idx->i].result.periph_result);
|
||||||
result = &(idx->ccb.cdm.matches[i].result.periph_result);
|
|
||||||
*bus_no = result->path_id;
|
*bus_no = result->path_id;
|
||||||
*host_no = result->path_id;
|
*host_no = result->path_id;
|
||||||
*channel_no = 0;
|
*channel_no = 0;
|
||||||
*target_no = result->target_id
|
*target_no = result->target_id;
|
||||||
*lun_no = result->target_lun;
|
*lun_no = result->target_lun;
|
||||||
sg_give_next_adr(&idx, buf, sizeof(buf), -1);
|
sg_destroy_enumerator(&idx);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
sg_give_next_adr(&idx, buf, sizeof(buf), -1);
|
}
|
||||||
|
sg_destroy_enumerator(&idx);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* ! Scsi_freebsd_old_scsi_enumeratE */
|
|
||||||
|
|
||||||
|
|
||||||
int sg_close_drive(struct burn_drive * d)
|
int sg_close_drive(struct burn_drive * d)
|
||||||
{
|
{
|
||||||
@ -295,125 +291,28 @@ int sg_drive_is_open(struct burn_drive * d)
|
|||||||
|
|
||||||
int scsi_enumerate_drives(void)
|
int scsi_enumerate_drives(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
#ifdef Scsi_freebsd_old_scsi_enumeratE
|
|
||||||
|
|
||||||
union ccb ccb;
|
|
||||||
int bufsize, fd;
|
|
||||||
unsigned int i;
|
|
||||||
int skip_device = 0;
|
|
||||||
|
|
||||||
if ((fd = open(XPT_DEVICE, O_RDWR)) == -1) {
|
|
||||||
warn("couldn't open %s", XPT_DEVICE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bzero(&ccb, sizeof(union ccb));
|
|
||||||
|
|
||||||
ccb.ccb_h.path_id = CAM_XPT_PATH_ID;
|
|
||||||
ccb.ccb_h.target_id = CAM_TARGET_WILDCARD;
|
|
||||||
ccb.ccb_h.target_lun = CAM_LUN_WILDCARD;
|
|
||||||
|
|
||||||
ccb.ccb_h.func_code = XPT_DEV_MATCH;
|
|
||||||
bufsize = sizeof(struct dev_match_result) * 100;
|
|
||||||
ccb.cdm.match_buf_len = bufsize;
|
|
||||||
ccb.cdm.matches = (struct dev_match_result *)malloc(bufsize);
|
|
||||||
if (ccb.cdm.matches == NULL) {
|
|
||||||
warnx("can't malloc memory for matches");
|
|
||||||
close(fd);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ccb.cdm.num_matches = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We fetch all nodes, since we display most of them in the default
|
|
||||||
* case, and all in the verbose case.
|
|
||||||
*/
|
|
||||||
ccb.cdm.num_patterns = 0;
|
|
||||||
ccb.cdm.pattern_buf_len = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We do the ioctl multiple times if necessary, in case there are
|
|
||||||
* more than 100 nodes in the EDT.
|
|
||||||
*/
|
|
||||||
do {
|
|
||||||
if (ioctl(fd, CAMIOCOMMAND, &ccb) == -1) {
|
|
||||||
warn("error sending CAMIOCOMMAND ioctl");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((ccb.ccb_h.status != CAM_REQ_CMP)
|
|
||||||
|| ((ccb.cdm.status != CAM_DEV_MATCH_LAST)
|
|
||||||
&& (ccb.cdm.status != CAM_DEV_MATCH_MORE))) {
|
|
||||||
warnx("got CAM error %#x, CDM error %d\n",
|
|
||||||
ccb.ccb_h.status, ccb.cdm.status);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < ccb.cdm.num_matches; i++) {
|
|
||||||
switch (ccb.cdm.matches[i].type) {
|
|
||||||
case DEV_MATCH_BUS:
|
|
||||||
break;
|
|
||||||
case DEV_MATCH_DEVICE: {
|
|
||||||
struct device_match_result* result;
|
|
||||||
|
|
||||||
result = &ccb.cdm.matches[i].result.device_result;
|
|
||||||
|
|
||||||
if (result->flags & DEV_RESULT_UNCONFIGURED)
|
|
||||||
skip_device = 1;
|
|
||||||
else
|
|
||||||
skip_device = 0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case DEV_MATCH_PERIPH: {
|
|
||||||
struct periph_match_result* result;
|
|
||||||
char buf[64];
|
|
||||||
|
|
||||||
result = &ccb.cdm.matches[i].result.periph_result;
|
|
||||||
if (skip_device || strcmp(result->periph_name, "pass") == 0)
|
|
||||||
break;
|
|
||||||
snprintf(buf, sizeof (buf), "/dev/%s%d", result->periph_name, result->unit_number);
|
|
||||||
/* ts A51221 */
|
|
||||||
if (burn_drive_is_banned(buf))
|
|
||||||
break;
|
|
||||||
|
|
||||||
enumerate_common(buf, result->path_id, result->path_id, 0,
|
|
||||||
result->target_id, result->target_lun);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
fprintf(stdout, "unknown match type\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} while ((ccb.ccb_h.status == CAM_REQ_CMP)
|
|
||||||
&& (ccb.cdm.status == CAM_DEV_MATCH_MORE));
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
#else /* Scsi_freebsd_old_scsi_enumeratE */
|
|
||||||
|
|
||||||
burn_drive_enumerator_t idx;
|
burn_drive_enumerator_t idx;
|
||||||
int initialize = 1;
|
int ret;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
struct periph_match_result* result;
|
||||||
|
|
||||||
|
ret = sg_init_enumerator(&idx);
|
||||||
|
if (ret <= 0)
|
||||||
|
return 0;
|
||||||
while(1) {
|
while(1) {
|
||||||
ret = sg_give_next_adr(&idx, buf, sizeof(buf), initialize);
|
ret = sg_give_next_adr(&idx, buf, sizeof(buf), 0);
|
||||||
initialize = 0;
|
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
break;
|
break;
|
||||||
if (burn_drive_is_banned(buf))
|
if (burn_drive_is_banned(buf))
|
||||||
continue;
|
continue;
|
||||||
enumerate_common(buf, idx.result->path_id, idx.result->path_id,
|
result = &idx->ccb.cdm.matches[idx->i].result.periph_result;
|
||||||
0, idx.result->target_id,
|
enumerate_common(buf, result->path_id, result->path_id,
|
||||||
idx.result->target_lun);
|
0, result->target_id,
|
||||||
|
result->target_lun);
|
||||||
}
|
}
|
||||||
sg_give_next_adr(&idx, buf, sizeof(buf), -1);
|
sg_destroy_enumerator(&idx);
|
||||||
|
|
||||||
#endif /* ! Scsi_freebsd_old_scsi_enumeratE */
|
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -551,7 +450,10 @@ int sg_grab(struct burn_drive *d)
|
|||||||
|
|
||||||
mmc_function_spy("sg_grab");
|
mmc_function_spy("sg_grab");
|
||||||
|
|
||||||
assert(d->cam == NULL);
|
if (burn_drive_is_open(d)) {
|
||||||
|
d->released = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
cam = cam_open_device(d->devname, O_RDWR);
|
cam = cam_open_device(d->devname, O_RDWR);
|
||||||
if (cam == NULL) {
|
if (cam == NULL) {
|
||||||
@ -591,6 +493,7 @@ int sg_release(struct burn_drive *d)
|
|||||||
mmc_function_spy("sg_release ----------- closing.");
|
mmc_function_spy("sg_release ----------- closing.");
|
||||||
|
|
||||||
sg_close_drive(d);
|
sg_close_drive(d);
|
||||||
|
d->released = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,7 +318,7 @@ void spc_sense_write_params(struct burn_drive *d)
|
|||||||
{
|
{
|
||||||
struct buffer buf;
|
struct buffer buf;
|
||||||
struct scsi_mode_data *m;
|
struct scsi_mode_data *m;
|
||||||
int size;
|
int size, dummy;
|
||||||
unsigned char *page;
|
unsigned char *page;
|
||||||
struct command c;
|
struct command c;
|
||||||
|
|
||||||
@ -343,26 +343,35 @@ void spc_sense_write_params(struct burn_drive *d)
|
|||||||
m->write_page_length = page[1];
|
m->write_page_length = page[1];
|
||||||
m->write_page_valid = 1;
|
m->write_page_valid = 1;
|
||||||
mmc_read_disc_info(d);
|
mmc_read_disc_info(d);
|
||||||
|
|
||||||
|
/* ts A70212 : try to setup d->media_capacity_remaining */
|
||||||
|
if (d->current_profile == 0x1a || d->current_profile == 0x13 ||
|
||||||
|
d->current_profile == 0x12)
|
||||||
|
d->read_format_capacities(d, -1);
|
||||||
|
else if (d->status == BURN_DISC_BLANK ||
|
||||||
|
(d->current_is_cd_profile && d->status == BURN_DISC_APPENDABLE)) {
|
||||||
|
d->get_nwa(d, -1, &dummy, &dummy);
|
||||||
}
|
}
|
||||||
|
/* others are hopefully up to date from mmc_read_disc_info() */
|
||||||
|
|
||||||
|
/*
|
||||||
|
fprintf(stderr, "LIBBURN_DEBUG: media_capacity_remaining = %.f\n",
|
||||||
|
(double) d->media_capacity_remaining);
|
||||||
|
*/
|
||||||
|
|
||||||
/* ts A61229 */
|
}
|
||||||
#define Libburn_mmc_compose_mode_page_5 1
|
|
||||||
|
|
||||||
|
|
||||||
/* remark ts A61104 :
|
/* remark ts A61104 :
|
||||||
Although command MODE SELECT is SPC, the content of the
|
Although command MODE SELECT is SPC, the content of the
|
||||||
Write Parameters Mode Page (05h) is MMC (Table 108 in MMC-1).
|
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.
|
Thus the filling of the mode page is done by mmc_compose_mode_page_5().
|
||||||
*/
|
*/
|
||||||
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)
|
||||||
{
|
{
|
||||||
struct buffer buf;
|
struct buffer buf;
|
||||||
struct command c;
|
struct command c;
|
||||||
#ifndef Libburn_mmc_compose_mode_page_5
|
|
||||||
int bufe, sim;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ts A61007 : All current callers are safe. */
|
/* ts A61007 : All current callers are safe. */
|
||||||
/* a ssert(o->drive == d); */
|
/* a ssert(o->drive == d); */
|
||||||
@ -391,40 +400,10 @@ void spc_select_write_params(struct burn_drive *d,
|
|||||||
burn_print(12, "using write page length %d (valid %d)\n",
|
burn_print(12, "using write page length %d (valid %d)\n",
|
||||||
d->mdata->write_page_length, d->mdata->write_page_valid);
|
d->mdata->write_page_length, d->mdata->write_page_valid);
|
||||||
|
|
||||||
#ifdef Libburn_mmc_compose_mode_page_5
|
|
||||||
|
|
||||||
/* ts A61229 */
|
/* ts A61229 */
|
||||||
if (mmc_compose_mode_page_5(d, o, c.page->data + 8) <= 0)
|
if (mmc_compose_mode_page_5(d, o, c.page->data + 8) <= 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
c.page->data[8] = 5;
|
|
||||||
c.page->data[9] = d->mdata->write_page_length;
|
|
||||||
|
|
||||||
bufe = o->underrun_proof;
|
|
||||||
sim = o->simulate;
|
|
||||||
c.page->data[10] = (bufe << 6)
|
|
||||||
+ (sim << 4)
|
|
||||||
+ o->write_type;
|
|
||||||
|
|
||||||
/* ts A61106 : MMC-1 table 110 : multi==0 or multi==3 */
|
|
||||||
c.page->data[11] = ((3 * !!o->multi) << 6) | o->control;
|
|
||||||
|
|
||||||
c.page->data[12] = spc_block_type(o->block_type);
|
|
||||||
|
|
||||||
/* ts A61104 */
|
|
||||||
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[23] = 150; /* audio pause length */
|
|
||||||
|
|
||||||
/*XXX need session format! */
|
|
||||||
|
|
||||||
#endif /* ! Libburn_mmc_compose_mode_page_5 */
|
|
||||||
|
|
||||||
c.dir = TO_DRIVE;
|
c.dir = TO_DRIVE;
|
||||||
d->issue_command(d, &c);
|
d->issue_command(d, &c);
|
||||||
}
|
}
|
||||||
@ -434,16 +413,9 @@ void spc_getcaps(struct burn_drive *d)
|
|||||||
spc_inquiry(d);
|
spc_inquiry(d);
|
||||||
spc_sense_caps(d);
|
spc_sense_caps(d);
|
||||||
spc_sense_error_params(d);
|
spc_sense_error_params(d);
|
||||||
|
|
||||||
/* <<< for debugging. >>> ??? to be fixely included here ?
|
|
||||||
mmc_read_format_capacities(d, -1);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
only called when a blank is present, so we set type to blank
|
|
||||||
(on the last pass)
|
|
||||||
|
|
||||||
don't check totally stupid modes (raw/raw0)
|
don't check totally stupid modes (raw/raw0)
|
||||||
some drives say they're ok, and they're not.
|
some drives say they're ok, and they're not.
|
||||||
*/
|
*/
|
||||||
@ -453,12 +425,24 @@ void spc_probe_write_modes(struct burn_drive *d)
|
|||||||
struct buffer buf;
|
struct buffer buf;
|
||||||
int try_write_type = 1;
|
int try_write_type = 1;
|
||||||
int try_block_type = 0;
|
int try_block_type = 0;
|
||||||
int key, asc, ascq;
|
int key, asc, ascq, useable_write_type = -1, useable_block_type = -1;
|
||||||
|
int last_try = 0;
|
||||||
struct command c;
|
struct command c;
|
||||||
|
|
||||||
while (try_write_type != 4) {
|
/* ts A70213 : added pseudo try_write_type 4 to set a suitable mode */
|
||||||
|
while (try_write_type != 5) {
|
||||||
burn_print(9, "trying %d, %d\n", try_write_type,
|
burn_print(9, "trying %d, %d\n", try_write_type,
|
||||||
try_block_type);
|
try_block_type);
|
||||||
|
|
||||||
|
/* ts A70213 */
|
||||||
|
if (try_write_type == 4) {
|
||||||
|
/* Pseudo write type NONE . Set a useable write mode */
|
||||||
|
if (useable_write_type == -1)
|
||||||
|
break;
|
||||||
|
try_write_type = useable_write_type;
|
||||||
|
try_block_type = useable_block_type;
|
||||||
|
last_try= 1;
|
||||||
|
}
|
||||||
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);
|
||||||
@ -483,6 +467,9 @@ void spc_probe_write_modes(struct burn_drive *d)
|
|||||||
d->issue_command(d, &c);
|
d->issue_command(d, &c);
|
||||||
d->silent_on_scsi_error = 0;
|
d->silent_on_scsi_error = 0;
|
||||||
|
|
||||||
|
if (last_try)
|
||||||
|
break;
|
||||||
|
|
||||||
key = c.sense[2];
|
key = c.sense[2];
|
||||||
asc = c.sense[12];
|
asc = c.sense[12];
|
||||||
ascq = c.sense[13];
|
ascq = c.sense[13];
|
||||||
@ -498,6 +485,15 @@ void spc_probe_write_modes(struct burn_drive *d)
|
|||||||
else
|
else
|
||||||
d->block_types[try_write_type] |=
|
d->block_types[try_write_type] |=
|
||||||
1 << try_block_type;
|
1 << try_block_type;
|
||||||
|
|
||||||
|
/* ts A70213 */
|
||||||
|
if ((useable_write_type < 0 && try_write_type > 0) ||
|
||||||
|
(try_write_type == 1 && try_block_type == 8)) {
|
||||||
|
/* Packet is not supported yet.
|
||||||
|
Prefer TAO MODE_1. */
|
||||||
|
useable_write_type = try_write_type;
|
||||||
|
useable_block_type = try_block_type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
switch (try_block_type) {
|
switch (try_block_type) {
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -113,6 +113,12 @@ struct burn_track *burn_track_create(void)
|
|||||||
t->mode = BURN_MODE1;
|
t->mode = BURN_MODE1;
|
||||||
t->isrc.has_isrc = 0;
|
t->isrc.has_isrc = 0;
|
||||||
t->pad = 1;
|
t->pad = 1;
|
||||||
|
|
||||||
|
/* ts A70213 */
|
||||||
|
t->fill_up_media = 0;
|
||||||
|
/* ts A70218 */
|
||||||
|
t->default_size = 0;
|
||||||
|
|
||||||
t->entry = NULL;
|
t->entry = NULL;
|
||||||
t->source = NULL;
|
t->source = NULL;
|
||||||
t->eos = 0;
|
t->eos = 0;
|
||||||
@ -317,7 +323,8 @@ void burn_track_clear_isrc(struct burn_track *t)
|
|||||||
|
|
||||||
int burn_track_get_sectors(struct burn_track *t)
|
int burn_track_get_sectors(struct burn_track *t)
|
||||||
{
|
{
|
||||||
int size;
|
/* ts A70125 : was int */
|
||||||
|
off_t size;
|
||||||
int sectors, seclen;
|
int sectors, seclen;
|
||||||
|
|
||||||
seclen = burn_sector_length(t->mode);
|
seclen = burn_sector_length(t->mode);
|
||||||
@ -329,12 +336,88 @@ int burn_track_get_sectors(struct burn_track *t)
|
|||||||
return sectors;
|
return sectors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70125 */
|
||||||
|
int burn_track_set_sectors(struct burn_track *t, int sectors)
|
||||||
|
{
|
||||||
|
off_t size, seclen;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
seclen = burn_sector_length(t->mode);
|
||||||
|
size = seclen * (off_t) sectors - (off_t) t->offset - (off_t) t->tail;
|
||||||
|
if (size < 0)
|
||||||
|
return 0;
|
||||||
|
ret = t->source->set_size(t->source, size);
|
||||||
|
t->open_ended = (t->source->get_size(t->source) <= 0);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70218 */
|
||||||
|
int burn_track_set_size(struct burn_track *t, off_t size)
|
||||||
|
{
|
||||||
|
t->open_ended = (size <= 0);
|
||||||
|
return t->source->set_size(t->source, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70213 */
|
||||||
|
int burn_track_set_fillup(struct burn_track *t, int fill_up_media)
|
||||||
|
{
|
||||||
|
t->fill_up_media = fill_up_media;
|
||||||
|
if (fill_up_media)
|
||||||
|
t->open_ended = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70213 */
|
||||||
|
/**
|
||||||
|
@param flag bit0= force new size even if existing track size is larger
|
||||||
|
*/
|
||||||
|
int burn_track_apply_fillup(struct burn_track *t, off_t max_size, int flag)
|
||||||
|
{
|
||||||
|
int max_sectors, ret = 2;
|
||||||
|
char msg[160];
|
||||||
|
|
||||||
|
if (t->fill_up_media <= 0)
|
||||||
|
return 2;
|
||||||
|
max_sectors = max_size / 2048;
|
||||||
|
if (burn_track_get_sectors(t) < max_sectors || (flag & 1)) {
|
||||||
|
sprintf(msg, "Setting total track size to %ds (payload %ds)\n",
|
||||||
|
max_sectors, (int) (t->source->get_size(t->source)/2048));
|
||||||
|
libdax_msgs_submit(libdax_messenger, -1, 0x00000002,
|
||||||
|
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
||||||
|
msg, 0, 0);
|
||||||
|
ret = burn_track_set_sectors(t, max_sectors);
|
||||||
|
t->open_ended = 0;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ts A61031 */
|
/* ts A61031 */
|
||||||
int burn_track_is_open_ended(struct burn_track *t)
|
int burn_track_is_open_ended(struct burn_track *t)
|
||||||
{
|
{
|
||||||
return !!t->open_ended;
|
return !!t->open_ended;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70218 : API */
|
||||||
|
int burn_track_set_default_size(struct burn_track *t, off_t size)
|
||||||
|
{
|
||||||
|
t->default_size = size;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70218 */
|
||||||
|
off_t burn_track_get_default_size(struct burn_track *t)
|
||||||
|
{
|
||||||
|
return t->default_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ts A61101 : API function */
|
/* ts A61101 : API function */
|
||||||
int burn_track_get_counters(struct burn_track *t,
|
int burn_track_get_counters(struct burn_track *t,
|
||||||
off_t *read_bytes, off_t *written_bytes)
|
off_t *read_bytes, off_t *written_bytes)
|
||||||
|
@ -27,6 +27,13 @@ struct burn_track
|
|||||||
int tailcount;
|
int tailcount;
|
||||||
/** 1 means Pad with zeros, 0 means start reading the next track */
|
/** 1 means Pad with zeros, 0 means start reading the next track */
|
||||||
int pad;
|
int pad;
|
||||||
|
|
||||||
|
/* ts A70213 : wether to expand this track to full available media */
|
||||||
|
int fill_up_media;
|
||||||
|
|
||||||
|
/* ts A70218 : a track size to use if it is mandarory to have some */
|
||||||
|
off_t default_size;
|
||||||
|
|
||||||
/** Data source */
|
/** Data source */
|
||||||
struct burn_source *source;
|
struct burn_source *source;
|
||||||
/** End of Source flag */
|
/** End of Source flag */
|
||||||
@ -88,5 +95,18 @@ int burn_track_get_shortage(struct burn_track *t);
|
|||||||
int burn_track_is_open_ended(struct burn_track *t);
|
int burn_track_is_open_ended(struct burn_track *t);
|
||||||
int burn_track_is_data_done(struct burn_track *t);
|
int burn_track_is_data_done(struct burn_track *t);
|
||||||
|
|
||||||
|
/* ts A70125 : sets overall sectors of a track: offset+payload+padding */
|
||||||
|
int burn_track_set_sectors(struct burn_track *t, int sectors);
|
||||||
|
|
||||||
|
/* ts A70218 : sets the payload size alone */
|
||||||
|
int burn_track_set_size(struct burn_track *t, off_t size);
|
||||||
|
|
||||||
|
/* ts A70213 */
|
||||||
|
int burn_track_set_fillup(struct burn_track *t, int fill_up_media);
|
||||||
|
int burn_track_apply_fillup(struct burn_track *t, off_t max_size, int flag);
|
||||||
|
|
||||||
|
/* ts A70218 */
|
||||||
|
off_t burn_track_get_default_size(struct burn_track *t);
|
||||||
|
|
||||||
|
|
||||||
#endif /* BURN__STRUCTURE_H */
|
#endif /* BURN__STRUCTURE_H */
|
||||||
|
@ -129,6 +129,9 @@ struct burn_drive
|
|||||||
int lun;
|
int lun;
|
||||||
char *devname;
|
char *devname;
|
||||||
|
|
||||||
|
/* ts A70302: mmc5r03c.pdf 5.3.2 Physical Interface Standard */
|
||||||
|
int phys_if_std; /* 1=SCSI, 2=ATAPI, 3,4,6=FireWire, 7=SATA, 8=USB */
|
||||||
|
char phys_if_name[80]; /* MMC-5 5.3.2 table 91 , e.g. "SCSI Family" */
|
||||||
|
|
||||||
/* see os.h for name of particular os-*.h where this is defined */
|
/* see os.h for name of particular os-*.h where this is defined */
|
||||||
BURN_OS_TRANSPORT_DRIVE_ELEMENTS
|
BURN_OS_TRANSPORT_DRIVE_ELEMENTS
|
||||||
@ -152,11 +155,29 @@ struct burn_drive
|
|||||||
int current_is_cd_profile;
|
int current_is_cd_profile;
|
||||||
int current_is_supported_profile;
|
int current_is_supported_profile;
|
||||||
|
|
||||||
|
/* ts A70128 : MMC-to-MMC feature info from 46h for DVD-RW.
|
||||||
|
Quite internal. Regard as opaque :)
|
||||||
|
*/
|
||||||
|
/* 1 = incremental recording available, 0 = not available */
|
||||||
|
int current_has_feat21h;
|
||||||
|
|
||||||
|
/* Link Size item number 0 from feature 0021h descriptor */
|
||||||
|
int current_feat21h_link_size;
|
||||||
|
|
||||||
|
/* Flags from feature 002Fh feature descriptor mmc5r03c.pdf 5.3.25 :
|
||||||
|
bit1= DVD-RW supported
|
||||||
|
bit2= Test Write available
|
||||||
|
bit3= DVD-R DL supported
|
||||||
|
bit6= Buffer Under-run Free recording available (page 05h BUFE)
|
||||||
|
Value -1 indicates that no 002Fh was current in the features list.
|
||||||
|
*/
|
||||||
|
int current_feat2fh_byte4;
|
||||||
|
|
||||||
/* ts A70114 : wether a DVD-RW media holds an incomplete session
|
/* ts A70114 : wether a DVD-RW media holds an incomplete session
|
||||||
(which could need closing after write) */
|
(which could need closing after write) */
|
||||||
int dvd_minus_rw_incomplete;
|
int needs_close_session;
|
||||||
|
|
||||||
/* ts A61218 from 46h GET CONFIGURATION */
|
/* ts A61218 from 51h READ DISC INFORMATION */
|
||||||
int bg_format_status; /* 0=needs format start, 1=needs format restart*/
|
int bg_format_status; /* 0=needs format start, 1=needs format restart*/
|
||||||
|
|
||||||
/* ts A70108 from 23h READ FORMAT CAPACITY mmc5r03c.pdf 6.24 */
|
/* ts A70108 from 23h READ FORMAT CAPACITY mmc5r03c.pdf 6.24 */
|
||||||
@ -181,6 +202,23 @@ struct burn_drive
|
|||||||
int rlba; /* relative lba in section */
|
int rlba; /* relative lba in section */
|
||||||
int start_lba;
|
int start_lba;
|
||||||
int end_lba;
|
int end_lba;
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70131 : from 51h READ DISC INFORMATION Number of Sessions (-1)*/
|
||||||
|
int complete_sessions;
|
||||||
|
/* ts A70129 :
|
||||||
|
from 51h READ DISC INFORMATION Last Track Number in Last Session */
|
||||||
|
int last_track_no;
|
||||||
|
/* ts A70212 : from various sources : free space on media (in bytes)
|
||||||
|
With CD this might change after particular write
|
||||||
|
parameters have been set and nwa has been inquired.
|
||||||
|
(e.g. by d->send_write_parameters() ; d->get_nwa()).
|
||||||
|
*/
|
||||||
|
off_t media_capacity_remaining;
|
||||||
|
/* ts A70215 : if > 0 : first lba on media that is too high for write*/
|
||||||
|
int media_lba_limit;
|
||||||
|
|
||||||
|
|
||||||
int toc_temp;
|
int toc_temp;
|
||||||
struct burn_disc *disc; /* disc structure */
|
struct burn_disc *disc; /* disc structure */
|
||||||
int block_types[4];
|
int block_types[4];
|
||||||
@ -224,10 +262,19 @@ struct burn_drive
|
|||||||
void (*send_write_parameters) (struct burn_drive *,
|
void (*send_write_parameters) (struct burn_drive *,
|
||||||
const struct burn_write_opts *);
|
const struct burn_write_opts *);
|
||||||
void (*send_cue_sheet) (struct burn_drive *, struct cue_sheet *);
|
void (*send_cue_sheet) (struct burn_drive *, struct cue_sheet *);
|
||||||
|
|
||||||
|
/* ts A70205 : Announce size of a DVD-R[W] DAO session. */
|
||||||
|
int (*reserve_track) (struct burn_drive *d, off_t size);
|
||||||
|
|
||||||
void (*sync_cache) (struct burn_drive *);
|
void (*sync_cache) (struct burn_drive *);
|
||||||
int (*get_erase_progress) (struct burn_drive *);
|
int (*get_erase_progress) (struct burn_drive *);
|
||||||
int (*get_nwa) (struct burn_drive *, int trackno, int *lba, int *nwa);
|
int (*get_nwa) (struct burn_drive *, int trackno, int *lba, int *nwa);
|
||||||
|
|
||||||
|
/* ts A70131 : obtain (possibly fake) TOC number and start lba of
|
||||||
|
first track in last complete session */
|
||||||
|
int (*read_multi_session_c1)(struct burn_drive *d,
|
||||||
|
int *trackno, int *start);
|
||||||
|
|
||||||
/* ts A61009 : removed d in favor of o->drive */
|
/* ts A61009 : removed d in favor of o->drive */
|
||||||
/* void (*close_disc) (struct burn_drive * d,
|
/* void (*close_disc) (struct burn_drive * d,
|
||||||
struct burn_write_opts * o);
|
struct burn_write_opts * o);
|
||||||
|
693
libburn/write.c
693
libburn/write.c
@ -37,6 +37,7 @@
|
|||||||
#include "sg.h"
|
#include "sg.h"
|
||||||
#include "write.h"
|
#include "write.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
#include "structure.h"
|
||||||
|
|
||||||
#include "libdax_msgs.h"
|
#include "libdax_msgs.h"
|
||||||
extern struct libdax_msgs *libdax_messenger;
|
extern struct libdax_msgs *libdax_messenger;
|
||||||
@ -195,7 +196,10 @@ int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
/* MMC-1 mentions track number 0xFF for "the incomplete track",
|
/* MMC-1 mentions track number 0xFF for "the incomplete track",
|
||||||
MMC-3 does not. I tried both. 0xFF was in effect when other
|
MMC-3 does not. I tried both. 0xFF was in effect when other
|
||||||
bugs finally gave up and made way for readable tracks. */
|
bugs finally gave up and made way for readable tracks. */
|
||||||
d->close_track_session(o->drive, 0, 0xff); /* tnum+1); */
|
/* ts A70129
|
||||||
|
Probably the right value for appendables is d->last_track_no
|
||||||
|
*/
|
||||||
|
d->close_track_session(o->drive, 0, 0xff);
|
||||||
|
|
||||||
/* ts A61102 */
|
/* ts A61102 */
|
||||||
d->busy = BURN_DRIVE_WRITING;
|
d->busy = BURN_DRIVE_WRITING;
|
||||||
@ -298,7 +302,7 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
struct burn_session *session,
|
struct burn_session *session,
|
||||||
int nwa)
|
int nwa)
|
||||||
{
|
{
|
||||||
int i, m, s, f, form, pform, runtime = -150, ret;
|
int i, m, s, f, form, pform, runtime = -150, ret, track_length;
|
||||||
unsigned char ctladr;
|
unsigned char ctladr;
|
||||||
struct burn_drive *d;
|
struct burn_drive *d;
|
||||||
struct burn_toc_entry *e;
|
struct burn_toc_entry *e;
|
||||||
@ -386,10 +390,22 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
e[2].control = e[1].control;
|
e[2].control = e[1].control;
|
||||||
e[2].adr = 1;
|
e[2].adr = 1;
|
||||||
|
|
||||||
|
/* ts A70121 : The pause before the first track is not a Pre-gap.
|
||||||
|
To count it as part 2 of a Pre-gap is a dirty hack. It also seems
|
||||||
|
to have caused confusion in dealing with part 1 of an eventual
|
||||||
|
real Pre-gap. mmc5r03c.pdf 6.33.3.2, 6.33.3.18 .
|
||||||
|
*/
|
||||||
tar[0]->pregap2 = 1;
|
tar[0]->pregap2 = 1;
|
||||||
|
|
||||||
pform = form;
|
pform = form;
|
||||||
for (i = 0; i < ntr; i++) {
|
for (i = 0; i < ntr; i++) {
|
||||||
type_to_form(tar[i]->mode, &ctladr, &form);
|
type_to_form(tar[i]->mode, &ctladr, &form);
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70121 : This seems to be thw wrong test. Correct would
|
||||||
|
be to compare tar[]->mode or bit2 of ctladr.
|
||||||
|
*/
|
||||||
|
|
||||||
if (pform != form) {
|
if (pform != form) {
|
||||||
|
|
||||||
ret = add_cue(sheet, ctladr | 1, i + 1, 0, form, 0,
|
ret = add_cue(sheet, ctladr | 1, i + 1, 0, form, 0,
|
||||||
@ -405,6 +421,21 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
/ / if (!(form & BURN_AUDIO))
|
/ / if (!(form & BURN_AUDIO))
|
||||||
/ / tar[i]->pregap1 = 1;
|
/ / tar[i]->pregap1 = 1;
|
||||||
*/
|
*/
|
||||||
|
/* ts A70121 : it is unclear why (form & BURN_AUDIO) should prevent pregap1.
|
||||||
|
I believe, correct would be:
|
||||||
|
runtime += 75;
|
||||||
|
tar[i]->pregap1 = 1;
|
||||||
|
|
||||||
|
The test for pform != form is wrong anyway.
|
||||||
|
|
||||||
|
Next one has to care for Post-gap: table 555 in mmc5r03c.pdf does not
|
||||||
|
show any although 6.33.3.19 would prescribe some.
|
||||||
|
|
||||||
|
Nobody seems to have ever tested this situation, up to now.
|
||||||
|
It is banned for now in burn_disc_write().
|
||||||
|
Warning have been placed in libburn.h .
|
||||||
|
*/
|
||||||
|
|
||||||
tar[i]->pregap2 = 1;
|
tar[i]->pregap2 = 1;
|
||||||
}
|
}
|
||||||
/* XXX HERE IS WHERE WE DO INDICES IN THE CUE SHEET */
|
/* XXX HERE IS WHERE WE DO INDICES IN THE CUE SHEET */
|
||||||
@ -424,7 +455,20 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
|
|||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
||||||
runtime += burn_track_get_sectors(tar[i]);
|
/* ts A70125 :
|
||||||
|
Still not understanding the sense behind linking tracks,
|
||||||
|
i decided to at least enforce the MMC specs' minimum
|
||||||
|
track length.
|
||||||
|
*/
|
||||||
|
track_length = burn_track_get_sectors(tar[i]);
|
||||||
|
if (track_length < 300 && !burn_track_is_open_ended(tar[i])) {
|
||||||
|
track_length = 300;
|
||||||
|
if (!tar[i]->pad)
|
||||||
|
tar[i]->pad = 1;
|
||||||
|
burn_track_set_sectors(tar[i], track_length);
|
||||||
|
}
|
||||||
|
runtime += track_length;
|
||||||
|
|
||||||
/* if we're padding, we'll clear any current shortage.
|
/* if we're padding, we'll clear any current shortage.
|
||||||
if we're not, we'll slip toc entries by a sector every time our
|
if we're not, we'll slip toc entries by a sector every time our
|
||||||
shortage is more than a sector
|
shortage is more than a sector
|
||||||
@ -626,12 +670,27 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
d->rlba += 150;
|
d->rlba += 150;
|
||||||
|
|
||||||
if (t->pregap1) {
|
if (t->pregap1) {
|
||||||
struct burn_track *pt = s->track[tnum - 1];
|
|
||||||
|
struct burn_track *pt;
|
||||||
|
/* ts A70121 : Removed pseudo suicidal initializer
|
||||||
|
= s->track[tnum - 1];
|
||||||
|
*/
|
||||||
|
|
||||||
if (tnum == 0) {
|
if (tnum == 0) {
|
||||||
|
|
||||||
|
/* ts A70121 : This is not possible because
|
||||||
|
track 1 cannot have a pregap at all.
|
||||||
|
MMC-5 6.33.3.2 precribes a mandatory pause
|
||||||
|
prior to any track 1. Pre-gap is prescribed
|
||||||
|
for mode changes like audio-to-data.
|
||||||
|
To set burn_track.pregap1 for track 1 is
|
||||||
|
kindof a dirty hack.
|
||||||
|
*/
|
||||||
|
|
||||||
printf("first track should not have a pregap1\n");
|
printf("first track should not have a pregap1\n");
|
||||||
pt = t;
|
pt = t;
|
||||||
}
|
} else
|
||||||
|
pt = s->track[tnum - 1]; /* ts A70121 */
|
||||||
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))
|
||||||
@ -648,14 +707,21 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
|
|
||||||
/* ts A61103 */
|
/* ts A61103 */
|
||||||
ret = d->get_nwa(d, -1, &lba, &nwa);
|
ret = d->get_nwa(d, -1, &lba, &nwa);
|
||||||
|
|
||||||
|
/* ts A70213: CD-TAO: eventually expand size of track to max */
|
||||||
|
burn_track_apply_fillup(t, d->media_capacity_remaining, 0);
|
||||||
|
|
||||||
|
/* <<< */
|
||||||
sprintf(msg,
|
sprintf(msg,
|
||||||
"pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d\n",
|
"TAO pre-track %2.2d : get_nwa(%d)=%d, d=%d , demand=%.f , cap=%.f\n",
|
||||||
tnum+1, nwa, ret, d->nwa);
|
tnum+1, nwa, ret, d->nwa, (double) burn_track_get_sectors(t) * 2048.0,
|
||||||
|
(double) d->media_capacity_remaining);
|
||||||
libdax_msgs_submit(libdax_messenger, d->global_index, 0x000002,
|
libdax_msgs_submit(libdax_messenger, d->global_index, 0x000002,
|
||||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
||||||
msg, 0, 0);
|
msg, 0, 0);
|
||||||
if (nwa > d->nwa)
|
if (nwa > d->nwa)
|
||||||
d->nwa = nwa;
|
d->nwa = nwa;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* user data */
|
/* user data */
|
||||||
@ -754,7 +820,9 @@ ex:;
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ts A61009 */
|
/* ts A61009 */
|
||||||
int burn_disc_write_is_ok(struct burn_write_opts *o, struct burn_disc *disc)
|
/* @param flag bit1 = do not libdax_msgs_submit() */
|
||||||
|
int burn_disc_write_is_ok(struct burn_write_opts *o, struct burn_disc *disc,
|
||||||
|
int flag)
|
||||||
{
|
{
|
||||||
int i, t;
|
int i, t;
|
||||||
char msg[80];
|
char msg[80];
|
||||||
@ -768,6 +836,7 @@ int burn_disc_write_is_ok(struct burn_write_opts *o, struct burn_disc *disc)
|
|||||||
bad_track_mode_found:;
|
bad_track_mode_found:;
|
||||||
sprintf(msg, "Unsuitable track mode 0x%x in track %d of session %d",
|
sprintf(msg, "Unsuitable track mode 0x%x in track %d of session %d",
|
||||||
disc->session[i]->track[t]->mode, i+1, t+1);
|
disc->session[i]->track[t]->mode, i+1, t+1);
|
||||||
|
if (!(flag & 2))
|
||||||
libdax_msgs_submit(libdax_messenger, -1, 0x0002010a,
|
libdax_msgs_submit(libdax_messenger, -1, 0x0002010a,
|
||||||
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
msg, 0, 0);
|
msg, 0, 0);
|
||||||
@ -780,6 +849,8 @@ int burn_disc_init_write_status(struct burn_write_opts *o,
|
|||||||
struct burn_disc *disc)
|
struct burn_disc *disc)
|
||||||
{
|
{
|
||||||
struct burn_drive *d = o->drive;
|
struct burn_drive *d = o->drive;
|
||||||
|
struct burn_track *t = NULL;
|
||||||
|
int sx, tx;
|
||||||
|
|
||||||
d->cancel = 0;
|
d->cancel = 0;
|
||||||
|
|
||||||
@ -804,13 +875,233 @@ int burn_disc_init_write_status(struct burn_write_opts *o,
|
|||||||
d->progress.buffered_bytes = 0;
|
d->progress.buffered_bytes = 0;
|
||||||
d->progress.buffer_min_fill = 0xffffffff;
|
d->progress.buffer_min_fill = 0xffffffff;
|
||||||
|
|
||||||
|
/* Set eventual media fill up for last track only */
|
||||||
|
for (sx = 0; sx < disc->sessions; sx++)
|
||||||
|
for (tx = 0 ; tx < disc->session[sx]->tracks; tx++) {
|
||||||
|
t = disc->session[sx]->track[tx];
|
||||||
|
burn_track_set_fillup(t, 0);
|
||||||
|
}
|
||||||
|
if (o->fill_up_media && t != NULL)
|
||||||
|
burn_track_set_fillup(t, 1);
|
||||||
|
|
||||||
d->busy = BURN_DRIVE_WRITING;
|
d->busy = BURN_DRIVE_WRITING;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ts A61218 */
|
/* ts A70219 : API */
|
||||||
|
int burn_precheck_write(struct burn_write_opts *o, struct burn_disc *disc,
|
||||||
|
char reasons[BURN_REASONS_LEN], int silent)
|
||||||
|
{
|
||||||
|
enum burn_write_types wt;
|
||||||
|
struct burn_drive *d = o->drive;
|
||||||
|
char msg[160], *reason_pt;
|
||||||
|
int no_media = 0;
|
||||||
|
|
||||||
|
reason_pt= reasons;
|
||||||
|
reasons[0] = 0;
|
||||||
|
|
||||||
|
/* check write mode against write job */
|
||||||
|
wt = burn_write_opts_auto_write_type(o, disc, reasons, 1);
|
||||||
|
if (wt == BURN_WRITE_NONE) {
|
||||||
|
if (strncmp(reasons, "MEDIA: ", 7)==0)
|
||||||
|
no_media = 1;
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(reasons, "%s: ", d->current_profile_text);
|
||||||
|
reason_pt= reasons + strlen(reasons);
|
||||||
|
if (d->status == BURN_DISC_UNSUITABLE)
|
||||||
|
goto unsuitable_profile;
|
||||||
|
if (d->current_profile == 0x09 || d->current_profile == 0x0a) {
|
||||||
|
if (!burn_disc_write_is_ok(o, disc, (!!silent) << 1))
|
||||||
|
strcat(reasons, "unsuitable track mode found, ");
|
||||||
|
if (o->start_byte >= 0)
|
||||||
|
strcat(reasons, "write start address not supported, ");
|
||||||
|
} else if (d->current_profile == 0x1a || d->current_profile == 0x12) {
|
||||||
|
/* DVD+RW , DVD-RAM */
|
||||||
|
if (o->start_byte >= 0 && (o->start_byte % 2048))
|
||||||
|
strcat(reasons,
|
||||||
|
"write start address not properly aligned to 2048, ");
|
||||||
|
} else if (d->current_profile == 0x13) {
|
||||||
|
/* DVD-RW Restricted Overwrite */
|
||||||
|
if (o->start_byte >= 0 && (o->start_byte % 32768))
|
||||||
|
strcat(reasons,
|
||||||
|
"write start address not properly aligned to 32k, ");
|
||||||
|
} else if (d->current_profile == 0x11 || d->current_profile == 0x14 ||
|
||||||
|
d->current_profile == 0x15 ||
|
||||||
|
d->current_profile == 0x1b || d->current_profile == 0x2b ) {
|
||||||
|
/* DVD-R* Sequential , DVD+R[/DL] */
|
||||||
|
if (o->start_byte >= 0)
|
||||||
|
strcat(reasons, "write start address not supported, ");
|
||||||
|
} else {
|
||||||
|
unsuitable_profile:;
|
||||||
|
sprintf(msg, "Unsuitable media detected. Profile %4.4Xh %s",
|
||||||
|
d->current_profile, d->current_profile_text);
|
||||||
|
if (!silent)
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x0002011e,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
msg, 0, 0);
|
||||||
|
strcat(reasons, "no suitable media profile detected, ");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
ex:;
|
||||||
|
if (reason_pt[0]) {
|
||||||
|
if (no_media) {
|
||||||
|
if (!silent)
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x0002013a,
|
||||||
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"No suitable media detected", 0, 0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!silent)
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x00020139,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"Write job parameters are unsuitable", 0, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70129 : learned much from dvd+rw-tools-7.0/growisofs_mmc.cpp */
|
||||||
|
int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o,
|
||||||
|
struct burn_session *s, int tnum)
|
||||||
|
{
|
||||||
|
struct burn_drive *d = o->drive;
|
||||||
|
char msg[160];
|
||||||
|
int ret, lba, nwa;
|
||||||
|
off_t size;
|
||||||
|
|
||||||
|
d->send_write_parameters(d, o);
|
||||||
|
ret = d->get_nwa(d, -1, &lba, &nwa);
|
||||||
|
sprintf(msg,
|
||||||
|
"DVD pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d",
|
||||||
|
tnum+1, nwa, ret, 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;
|
||||||
|
/* ts A70214 : eventually adjust already expanded size of track */
|
||||||
|
burn_track_apply_fillup(s->track[tnum], d->media_capacity_remaining,1);
|
||||||
|
|
||||||
|
if (o->write_type == BURN_WRITE_SAO) { /* DAO */
|
||||||
|
/* Round track size up to 32 KiB and reserve track */
|
||||||
|
size = ((off_t) burn_track_get_sectors(s->track[tnum]))
|
||||||
|
* (off_t) 2048;
|
||||||
|
size = (size + (off_t) 0x7fff) & ~((off_t) 0x7fff);
|
||||||
|
ret = d->reserve_track(d, size);
|
||||||
|
if (ret <= 0) {
|
||||||
|
sprintf(msg, "Cannot reserve track of %.f bytes",
|
||||||
|
(double) size);
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x00020138,
|
||||||
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
msg, 0, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70226 */
|
||||||
|
int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
|
||||||
|
struct burn_session *s, int tnum)
|
||||||
|
{
|
||||||
|
struct burn_drive *d = o->drive;
|
||||||
|
char msg[160];
|
||||||
|
int ret, lba, nwa;
|
||||||
|
off_t size;
|
||||||
|
|
||||||
|
ret = d->get_nwa(d, -1, &lba, &nwa);
|
||||||
|
sprintf(msg,
|
||||||
|
"DVD+R pre-track %2.2d : get_nwa(%d), ret= %d , d->nwa= %d",
|
||||||
|
tnum+1, nwa, ret, 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;
|
||||||
|
/* ts A70214 : eventually adjust already expanded size of track */
|
||||||
|
burn_track_apply_fillup(s->track[tnum], d->media_capacity_remaining,1);
|
||||||
|
|
||||||
|
if (o->write_type == BURN_WRITE_SAO &&
|
||||||
|
! burn_track_is_open_ended(s->track[tnum])) {
|
||||||
|
/* Round track size up to 32 KiB and reserve track */
|
||||||
|
size = ((off_t) burn_track_get_sectors(s->track[tnum]))
|
||||||
|
* (off_t) 2048;
|
||||||
|
size = (size + (off_t) 0x7fff) & ~((off_t) 0x7fff);
|
||||||
|
ret = d->reserve_track(d, size);
|
||||||
|
if (ret <= 0) {
|
||||||
|
sprintf(msg, "Cannot reserve track of %.f bytes",
|
||||||
|
(double) size);
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x00020138,
|
||||||
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
msg, 0, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70129 */
|
||||||
|
int burn_disc_close_track_dvd_minus_r(struct burn_write_opts *o,
|
||||||
|
struct burn_session *s, int tnum)
|
||||||
|
{
|
||||||
|
struct burn_drive *d = o->drive;
|
||||||
|
char msg[80];
|
||||||
|
|
||||||
|
/* only with Incremental writing */
|
||||||
|
if (o->write_type != BURN_WRITE_TAO)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
sprintf(msg, "Closing track %2.2d (absolute track number %d)",
|
||||||
|
tnum + 1, d->last_track_no);
|
||||||
|
libdax_msgs_submit(libdax_messenger, o->drive->global_index,0x00020119,
|
||||||
|
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg,0,0);
|
||||||
|
|
||||||
|
d->busy = BURN_DRIVE_CLOSING_SESSION;
|
||||||
|
/* Ignoring tnum here and hoping that d->last_track_no is correct */
|
||||||
|
d->close_track_session(d, 0, d->last_track_no); /* CLOSE TRACK, 001b */
|
||||||
|
d->busy = BURN_DRIVE_WRITING;
|
||||||
|
d->last_track_no++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70226 */
|
||||||
|
int burn_disc_close_track_dvd_plus_r(struct burn_write_opts *o,
|
||||||
|
struct burn_session *s, int tnum)
|
||||||
|
{
|
||||||
|
struct burn_drive *d = o->drive;
|
||||||
|
char msg[80];
|
||||||
|
|
||||||
|
sprintf(msg,
|
||||||
|
"Closing track %2.2d (absolute track and session number %d)",
|
||||||
|
tnum + 1, d->last_track_no);
|
||||||
|
libdax_msgs_submit(libdax_messenger, o->drive->global_index,0x00020119,
|
||||||
|
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH, msg,0,0);
|
||||||
|
|
||||||
|
d->busy = BURN_DRIVE_CLOSING_SESSION;
|
||||||
|
d->close_track_session(d, 0, d->last_track_no); /* CLOSE TRACK, 001b */
|
||||||
|
|
||||||
|
/* Each session becomes a single logical track. So to distinguish them,
|
||||||
|
it is mandatory to close the session together with each track. */
|
||||||
|
d->close_track_session(d, 1, 0); /* CLOSE SESSION, 010b */
|
||||||
|
|
||||||
|
d->busy = BURN_DRIVE_WRITING;
|
||||||
|
d->last_track_no++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A61218 - A70129 */
|
||||||
int burn_dvd_write_track(struct burn_write_opts *o,
|
int burn_dvd_write_track(struct burn_write_opts *o,
|
||||||
struct burn_session *s, int tnum)
|
struct burn_session *s, int tnum)
|
||||||
{
|
{
|
||||||
@ -818,12 +1109,42 @@ int burn_dvd_write_track(struct burn_write_opts *o,
|
|||||||
struct burn_drive *d = o->drive;
|
struct burn_drive *d = o->drive;
|
||||||
struct buffer *out = d->buffer;
|
struct buffer *out = d->buffer;
|
||||||
int sectors;
|
int sectors;
|
||||||
int i, open_ended = 0, ret= 0;
|
int i, open_ended = 0, ret= 0, is_flushed = 0;
|
||||||
|
|
||||||
|
/* ts A70213 : eventually expand size of track to max */
|
||||||
|
burn_track_apply_fillup(t, d->media_capacity_remaining, 0);
|
||||||
|
|
||||||
|
if (d->current_profile == 0x11 || d->current_profile == 0x14 ||
|
||||||
|
d->current_profile == 0x15) {
|
||||||
|
/* DVD-R, DVD-RW Sequential, DVD-R/DL Sequential */
|
||||||
|
ret = burn_disc_open_track_dvd_minus_r(o, s, tnum);
|
||||||
|
if (ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b) {
|
||||||
|
/* DVD+R , DVD+R/DL */
|
||||||
|
ret = burn_disc_open_track_dvd_plus_r(o, s, tnum);
|
||||||
|
if (ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
|
|
||||||
sectors = burn_track_get_sectors(t);
|
sectors = burn_track_get_sectors(t);
|
||||||
open_ended = burn_track_is_open_ended(t);
|
open_ended = burn_track_is_open_ended(t);
|
||||||
|
/* <<< */
|
||||||
|
{
|
||||||
|
char msg[160];
|
||||||
|
|
||||||
/* >>> any type specific track preparations */;
|
sprintf(msg,
|
||||||
|
"DVD pre-track %2.2d : demand=%.f%s, cap=%.f\n",
|
||||||
|
tnum+1, (double) sectors * 2048.0,
|
||||||
|
(open_ended ? " (open ended)" : ""),
|
||||||
|
(double) d->media_capacity_remaining);
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index, 0x000002,
|
||||||
|
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
||||||
|
msg, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* >>> ts A70215 : what about offset padding ? */
|
||||||
|
|
||||||
burn_disc_init_track_status(o, s, tnum, sectors);
|
burn_disc_init_track_status(o, s, tnum, sectors);
|
||||||
for (i = 0; open_ended || i < sectors; i++) {
|
for (i = 0; open_ended || i < sectors; i++) {
|
||||||
@ -846,7 +1167,9 @@ int burn_dvd_write_track(struct burn_write_opts *o,
|
|||||||
d->progress.sector++;
|
d->progress.sector++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Pad up buffer to next full 32 kB */
|
/* >>> ts A70215 : what about tail padding ? */
|
||||||
|
|
||||||
|
/* Pad up buffer to next full o->obs (usually 32 kB) */
|
||||||
if (o->obs_pad && out->bytes > 0 && out->bytes < o->obs) {
|
if (o->obs_pad && out->bytes > 0 && out->bytes < o->obs) {
|
||||||
memset(out->data + out->bytes, 0, o->obs - out->bytes);
|
memset(out->data + out->bytes, 0, o->obs - out->bytes);
|
||||||
out->sectors += (o->obs - out->bytes) / 2048;
|
out->sectors += (o->obs - out->bytes) / 2048;
|
||||||
@ -855,14 +1178,25 @@ int burn_dvd_write_track(struct burn_write_opts *o,
|
|||||||
ret = burn_write_flush(o, t);
|
ret = burn_write_flush(o, t);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
goto ex;
|
goto ex;
|
||||||
|
is_flushed = 1;
|
||||||
|
|
||||||
/* >>> any other normal track finalizing */;
|
/* Eventually finalize track */
|
||||||
|
if (d->current_profile == 0x11 || d->current_profile == 0x14 ||
|
||||||
|
d->current_profile == 0x15) {
|
||||||
|
/* DVD-R, DVD-RW Sequential, DVD-R/DL Sequential */
|
||||||
|
ret = burn_disc_close_track_dvd_minus_r(o, s, tnum);
|
||||||
|
if (ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b) {
|
||||||
|
/* DVD+R , DVD+R/DL */
|
||||||
|
ret = burn_disc_close_track_dvd_plus_r(o, s, tnum);
|
||||||
|
if (ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
ret = 1;
|
ret = 1;
|
||||||
ex:;
|
ex:;
|
||||||
if (ret<=0) {
|
if (!is_flushed)
|
||||||
d->sync_cache(d); /* burn_write_flush() was not called */
|
d->sync_cache(d); /* burn_write_flush() was not called */
|
||||||
}
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -906,6 +1240,32 @@ int burn_disc_close_session_dvd_minus_rw(struct burn_write_opts *o,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70129 : for profile 0x11 DVD-R, 0x14 DVD-RW Seq, 0x15 DVD-R/DL Seq */
|
||||||
|
int burn_disc_close_session_dvd_minus_r(struct burn_write_opts *o,
|
||||||
|
struct burn_session *s)
|
||||||
|
{
|
||||||
|
struct burn_drive *d = o->drive;
|
||||||
|
|
||||||
|
/* only for Incremental writing */
|
||||||
|
if (o->write_type != BURN_WRITE_TAO)
|
||||||
|
return 2;
|
||||||
|
|
||||||
|
#ifdef Libburn_dvd_r_dl_multi_no_close_sessioN
|
||||||
|
if (d->current_profile == 0x15 && o->multi)
|
||||||
|
return 2;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
libdax_msgs_submit(libdax_messenger, o->drive->global_index,0x00020119,
|
||||||
|
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"Closing session", 0, 0);
|
||||||
|
|
||||||
|
d->busy = BURN_DRIVE_CLOSING_SESSION;
|
||||||
|
d->close_track_session(d, 1, 0); /* CLOSE SESSION, 010b */
|
||||||
|
d->busy = BURN_DRIVE_WRITING;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ts A61218 */
|
/* ts A61218 */
|
||||||
int burn_dvd_write_session(struct burn_write_opts *o,
|
int burn_dvd_write_session(struct burn_write_opts *o,
|
||||||
struct burn_session *s)
|
struct burn_session *s)
|
||||||
@ -913,26 +1273,38 @@ int burn_dvd_write_session(struct burn_write_opts *o,
|
|||||||
int i,ret;
|
int i,ret;
|
||||||
struct burn_drive *d = o->drive;
|
struct burn_drive *d = o->drive;
|
||||||
|
|
||||||
|
/* >>> open_session ? */
|
||||||
|
|
||||||
for (i = 0; i < s->tracks; i++) {
|
for (i = 0; i < s->tracks; i++) {
|
||||||
ret = burn_dvd_write_track(o, s, i);
|
ret = burn_dvd_write_track(o, s, i);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (d->current_profile == 0x1a) {
|
if (d->current_profile == 0x11 || d->current_profile == 0x14 ||
|
||||||
/* DVD+RW */
|
d->current_profile == 0x15) {
|
||||||
ret = burn_disc_close_session_dvd_plus_rw(o, s);
|
/* DVD-R , DVD-RW Sequential, DVD-R/DL Sequential */
|
||||||
|
ret = burn_disc_close_session_dvd_minus_r(o, s);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
} else if (d->current_profile == 0x12) {
|
||||||
|
/* DVD-RAM */
|
||||||
|
/* ??? any finalization needed ? */;
|
||||||
} else if (d->current_profile == 0x13) {
|
} else if (d->current_profile == 0x13) {
|
||||||
/* DVD-RW restricted overwrite */
|
/* DVD-RW restricted overwrite */
|
||||||
if (d->dvd_minus_rw_incomplete) {
|
if (d->needs_close_session) {
|
||||||
ret = burn_disc_close_session_dvd_minus_rw(o, s);
|
ret = burn_disc_close_session_dvd_minus_rw(o, s);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
} else if (d->current_profile == 0x12) {
|
} else if (d->current_profile == 0x1a) {
|
||||||
/* DVD-RAM */
|
/* DVD+RW */
|
||||||
/* ??? any finalization needed ? */;
|
if (d->needs_close_session) {
|
||||||
|
ret = burn_disc_close_session_dvd_plus_rw(o, s);
|
||||||
|
if (ret <= 0)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b) {
|
||||||
|
/* DVD+R , DVD+R/DL do each track as an own session */;
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -953,6 +1325,7 @@ int burn_disc_setup_dvd_plus_rw(struct burn_write_opts *o,
|
|||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
d->busy = BURN_DRIVE_WRITING;
|
d->busy = BURN_DRIVE_WRITING;
|
||||||
|
d->needs_close_session = 1;
|
||||||
}
|
}
|
||||||
d->nwa = 0;
|
d->nwa = 0;
|
||||||
if (o->start_byte >= 0) {
|
if (o->start_byte >= 0) {
|
||||||
@ -994,7 +1367,6 @@ int burn_disc_setup_dvd_minus_rw(struct burn_write_opts *o,
|
|||||||
d->nwa *= 16; /* convert to 2048 block units */
|
d->nwa *= 16; /* convert to 2048 block units */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d->current_profile == 0x13) { /* DVD-RW restricted overwrite */
|
|
||||||
|
|
||||||
/* ??? mmc5r03c.pdf 7.5.2 :
|
/* ??? mmc5r03c.pdf 7.5.2 :
|
||||||
"For DVD-RW media ... If a medium is in Restricted overwrite
|
"For DVD-RW media ... If a medium is in Restricted overwrite
|
||||||
@ -1019,17 +1391,8 @@ int burn_disc_setup_dvd_minus_rw(struct burn_write_opts *o,
|
|||||||
(d->nwa > 0) << 3);
|
(d->nwa > 0) << 3);
|
||||||
if (ret <= 0)
|
if (ret <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
d->busy = BURN_DRIVE_WRITING;
|
|
||||||
|
|
||||||
} else {
|
d->busy = BURN_DRIVE_WRITING;
|
||||||
sprintf(msg, "Unsuitable media detected. Profile %4.4Xh %s",
|
|
||||||
d->current_profile, d->current_profile_text);
|
|
||||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
|
||||||
0x0002011e,
|
|
||||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
|
||||||
msg, 0,0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* >>> perform OPC if needed */;
|
/* >>> perform OPC if needed */;
|
||||||
|
|
||||||
@ -1039,14 +1402,68 @@ int burn_disc_setup_dvd_minus_rw(struct burn_write_opts *o,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ts A61218 */
|
/* ts A70129 : for DVD-R[W] Sequential Recoding */
|
||||||
|
int burn_disc_setup_dvd_minus_r(struct burn_write_opts *o,
|
||||||
|
struct burn_disc *disc)
|
||||||
|
{
|
||||||
|
struct burn_drive *d = o->drive;
|
||||||
|
|
||||||
|
/* most setup is in burn_disc_setup_track_dvd_minus_r() */;
|
||||||
|
|
||||||
|
d->nwa = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70226 : for DVD+R , DVD+R/DL */
|
||||||
|
int burn_disc_setup_dvd_plus_r(struct burn_write_opts *o,
|
||||||
|
struct burn_disc *disc)
|
||||||
|
{
|
||||||
|
struct burn_drive *d = o->drive;
|
||||||
|
|
||||||
|
/* most setup is in burn_disc_setup_track_dvd_plus_r() */;
|
||||||
|
|
||||||
|
d->nwa = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A70229 */
|
||||||
|
int burn_disc_finalize_dvd_plus_r(struct burn_write_opts *o)
|
||||||
|
{
|
||||||
|
struct burn_drive *d = o->drive;
|
||||||
|
|
||||||
|
/* <<< FOR NOW: avoid finalizing media */
|
||||||
|
return 3;
|
||||||
|
|
||||||
|
if (o->multi)
|
||||||
|
return 2;
|
||||||
|
d->busy = BURN_DRIVE_CLOSING_SESSION;
|
||||||
|
/* CLOSE SESSION, 101b, Finalize with minimal radius */
|
||||||
|
d->close_track_session(d, 2, 1); /* (2<<1)|1 = 5 */
|
||||||
|
d->busy = BURN_DRIVE_WRITING;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ts A61218 - A70129 */
|
||||||
int burn_dvd_write_sync(struct burn_write_opts *o,
|
int burn_dvd_write_sync(struct burn_write_opts *o,
|
||||||
struct burn_disc *disc)
|
struct burn_disc *disc)
|
||||||
{
|
{
|
||||||
int i, ret, sx, tx, mode, exotic_track = 0;
|
int i, ret, o_end;
|
||||||
|
off_t default_size = 0;
|
||||||
struct burn_drive *d = o->drive;
|
struct burn_drive *d = o->drive;
|
||||||
|
struct burn_track *t;
|
||||||
char msg[160];
|
char msg[160];
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
int exotic_track = 0, dao_is_ok, sx, tx, mode;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
d->needs_close_session = 0;
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
for (sx = 0; sx < disc->sessions; sx++)
|
for (sx = 0; sx < disc->sessions; sx++)
|
||||||
for (tx = 0 ; tx < disc->session[sx]->tracks; tx++) {
|
for (tx = 0 ; tx < disc->session[sx]->tracks; tx++) {
|
||||||
mode = disc->session[sx]->track[tx]->mode;
|
mode = disc->session[sx]->track[tx]->mode;
|
||||||
@ -1062,6 +1479,7 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||||||
goto early_failure;
|
goto early_failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
if (d->current_profile == 0x1a || d->current_profile == 0x13 ||
|
if (d->current_profile == 0x1a || d->current_profile == 0x13 ||
|
||||||
d->current_profile == 0x12) {
|
d->current_profile == 0x12) {
|
||||||
/* DVD+RW , DVD-RW Restricted Overwrite , DVD-RAM */
|
/* DVD+RW , DVD-RW Restricted Overwrite , DVD-RAM */
|
||||||
@ -1077,8 +1495,13 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||||||
goto early_failure;
|
goto early_failure;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
if (d->current_profile == 0x1a || d->current_profile == 0x12) {
|
if (d->current_profile == 0x1a || d->current_profile == 0x12) {
|
||||||
/* DVD+RW , DVD-RAM */
|
/* DVD+RW , DVD-RAM */
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
if (o->start_byte >= 0 && (o->start_byte % 2048)) {
|
if (o->start_byte >= 0 && (o->start_byte % 2048)) {
|
||||||
sprintf(msg,
|
sprintf(msg,
|
||||||
"Write start address not properly aligned to 2048");
|
"Write start address not properly aligned to 2048");
|
||||||
@ -1088,6 +1511,8 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||||||
msg, 0, 0);
|
msg, 0, 0);
|
||||||
goto early_failure;
|
goto early_failure;
|
||||||
}
|
}
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
if (d->current_profile == 0x1a)
|
if (d->current_profile == 0x1a)
|
||||||
ret = burn_disc_setup_dvd_plus_rw(o, disc);
|
ret = burn_disc_setup_dvd_plus_rw(o, disc);
|
||||||
@ -1102,7 +1527,11 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||||||
}
|
}
|
||||||
o->obs_pad = 0; /* no filling-up of track's last 32k buffer */
|
o->obs_pad = 0; /* no filling-up of track's last 32k buffer */
|
||||||
|
|
||||||
} else if (d->current_profile == 0x13) { /* DVD-RW Rest. Overwrite */
|
} else if (d->current_profile == 0x13) {
|
||||||
|
/* DVD-RW Restricted Overwrite */
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
if (o->start_byte >= 0 && (o->start_byte % 32768)) {
|
if (o->start_byte >= 0 && (o->start_byte % 32768)) {
|
||||||
sprintf(msg,
|
sprintf(msg,
|
||||||
"Write start address not properly aligned to 32K");
|
"Write start address not properly aligned to 32K");
|
||||||
@ -1112,6 +1541,8 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||||||
msg, 0, 0);
|
msg, 0, 0);
|
||||||
goto early_failure;
|
goto early_failure;
|
||||||
}
|
}
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
ret = burn_disc_setup_dvd_minus_rw(o, disc);
|
ret = burn_disc_setup_dvd_minus_rw(o, disc);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
sprintf(msg,
|
sprintf(msg,
|
||||||
@ -1123,9 +1554,134 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||||||
goto early_failure;
|
goto early_failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ??? is this necessary ? */
|
/* _Rigid_ Restricted Overwrite demands this */
|
||||||
o->obs_pad = 1; /* fill-up track's last 32k buffer */
|
o->obs_pad = 1; /* fill-up track's last 32k buffer */
|
||||||
|
|
||||||
|
} else if (d->current_profile == 0x11 || d->current_profile == 0x14 ||
|
||||||
|
d->current_profile == 0x15) {
|
||||||
|
/* DVD-R , DVD-RW Sequential , DVD-R/DL Sequential */
|
||||||
|
t = disc->session[0]->track[0];
|
||||||
|
o_end = ( burn_track_is_open_ended(t) && !o->fill_up_media );
|
||||||
|
default_size = burn_track_get_default_size(t);
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
dao_is_ok =
|
||||||
|
(disc->sessions == 1 &&
|
||||||
|
disc->session[0]->tracks == 1 &&
|
||||||
|
(default_size > 0 || !o_end) &&
|
||||||
|
(!o->multi) && d->status == BURN_DISC_BLANK
|
||||||
|
);
|
||||||
|
if (o->write_type == BURN_WRITE_TAO &&
|
||||||
|
!d->current_has_feat21h) {
|
||||||
|
|
||||||
|
/* <<< ??? keep this automatic write type change ? */
|
||||||
|
if (dao_is_ok) {
|
||||||
|
o->write_type = BURN_WRITE_SAO;
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x00020134,
|
||||||
|
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"Defaulted TAO to DAO (lack of feature 21h)",
|
||||||
|
0, 0);
|
||||||
|
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
|
} else {
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x00020135,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"Cannot perform TAO (lack of feature 21h), job unsuitable for DAO",
|
||||||
|
0, 0);
|
||||||
|
goto early_failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (o->write_type == BURN_WRITE_SAO && !dao_is_ok) {
|
||||||
|
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x00020136,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"DAO burning is restricted to a single fixed size track and no multi-session",
|
||||||
|
0, 0);
|
||||||
|
|
||||||
|
/* <<< ??? keep this automatic advise ? */
|
||||||
|
if (d->current_has_feat21h)
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x00020137,
|
||||||
|
LIBDAX_MSGS_SEV_HINT,
|
||||||
|
LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"TAO would be possible and could do the job",
|
||||||
|
0, 0);
|
||||||
|
|
||||||
|
goto early_failure;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
|
if (o->start_byte >= 0) {
|
||||||
|
sprintf(msg, "Write start address not supported");
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x00020124,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
msg, 0, 0);
|
||||||
|
goto early_failure;
|
||||||
|
}
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
|
if (o->write_type == BURN_WRITE_SAO && o_end) {
|
||||||
|
sprintf(msg, "Activated track default size %.f",
|
||||||
|
(double) default_size);
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x0002012e,
|
||||||
|
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
msg, 0, 0);
|
||||||
|
burn_track_set_size(t, default_size);
|
||||||
|
}
|
||||||
|
ret = burn_disc_setup_dvd_minus_r(o, disc);
|
||||||
|
if (ret <= 0) {
|
||||||
|
sprintf(msg,
|
||||||
|
"Write preparation setup failed for DVD-R[W]");
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x00020121,
|
||||||
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
msg, 0, 0);
|
||||||
|
goto early_failure;
|
||||||
|
}
|
||||||
|
/* ??? padding needed ??? cowardly doing it for now */
|
||||||
|
o->obs_pad = 1; /* fill-up track's last 32k buffer */
|
||||||
|
|
||||||
|
} else if (d->current_profile == 0x1b || d->current_profile == 0x2b) {
|
||||||
|
/* DVD+R , DVD+R/DL */
|
||||||
|
t = disc->session[0]->track[0];
|
||||||
|
o_end = ( burn_track_is_open_ended(t) && !o->fill_up_media );
|
||||||
|
default_size = burn_track_get_default_size(t);
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
/* >>> oldfashioned checks hopefully never re-enabled */
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
|
if (o->write_type == BURN_WRITE_SAO && o_end) {
|
||||||
|
sprintf(msg, "Activated track default size %.f",
|
||||||
|
(double) default_size);
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x0002012e,
|
||||||
|
LIBDAX_MSGS_SEV_NOTE, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
msg, 0, 0);
|
||||||
|
burn_track_set_size(t, default_size);
|
||||||
|
}
|
||||||
|
ret = burn_disc_setup_dvd_plus_r(o, disc);
|
||||||
|
if (ret <= 0) {
|
||||||
|
sprintf(msg,
|
||||||
|
"Write preparation setup failed for DVD+R");
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x00020121,
|
||||||
|
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
msg, 0, 0);
|
||||||
|
goto early_failure;
|
||||||
|
}
|
||||||
|
/* ??? padding needed ??? cowardly doing it for now */
|
||||||
|
o->obs_pad = 1; /* fill-up track's last 32k buffer */
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
} else {
|
} else {
|
||||||
sprintf(msg, "Unsuitable media detected. Profile %4.4Xh %s",
|
sprintf(msg, "Unsuitable media detected. Profile %4.4Xh %s",
|
||||||
d->current_profile, d->current_profile_text);
|
d->current_profile, d->current_profile_text);
|
||||||
@ -1134,6 +1690,8 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||||||
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
msg, 0, 0);
|
msg, 0, 0);
|
||||||
goto early_failure;
|
goto early_failure;
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
}
|
}
|
||||||
o->obs = 32*1024; /* buffer flush trigger for sector.c:get_sector() */
|
o->obs = 32*1024; /* buffer flush trigger for sector.c:get_sector() */
|
||||||
|
|
||||||
@ -1152,8 +1710,11 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
|
|||||||
d->progress.sectors = 0;
|
d->progress.sectors = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* >>> eventual normal finalization measures */
|
if (d->current_profile == 0x1b || d->current_profile == 0x2b) {
|
||||||
|
ret = burn_disc_finalize_dvd_plus_r(o);
|
||||||
|
if (ret <= 0)
|
||||||
|
goto ex;
|
||||||
|
}
|
||||||
ret = 1;
|
ret = 1;
|
||||||
ex:;
|
ex:;
|
||||||
|
|
||||||
@ -1175,8 +1736,9 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
|
|||||||
struct cue_sheet *sheet;
|
struct cue_sheet *sheet;
|
||||||
struct burn_drive *d = o->drive;
|
struct burn_drive *d = o->drive;
|
||||||
struct buffer buf;
|
struct buffer buf;
|
||||||
struct burn_track *lt;
|
struct burn_track *lt, *t;
|
||||||
int first = 1, i, ret, lba, nwa = 0;
|
int first = 1, i, ret, lba, nwa = 0;
|
||||||
|
off_t default_size;
|
||||||
char msg[80];
|
char msg[80];
|
||||||
|
|
||||||
/* ts A60924 : libburn/message.c gets obsoleted
|
/* ts A60924 : libburn/message.c gets obsoleted
|
||||||
@ -1199,6 +1761,8 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
if (o->start_byte >= 0) {
|
if (o->start_byte >= 0) {
|
||||||
sprintf(msg, "Write start address not supported");
|
sprintf(msg, "Write start address not supported");
|
||||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
@ -1207,6 +1771,46 @@ void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc)
|
|||||||
msg, 0, 0);
|
msg, 0, 0);
|
||||||
goto fail_wo_sync;
|
goto fail_wo_sync;
|
||||||
}
|
}
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
|
/* ts A70218 */
|
||||||
|
if (o->write_type == BURN_WRITE_SAO) {
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
/* <<< covered by burn_precheck_write() "appended session" */
|
||||||
|
if (disc->sessions > 1) {
|
||||||
|
sao_restriction_violated:;
|
||||||
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
|
0x0002012f,
|
||||||
|
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
|
||||||
|
"SAO is restricted to a single session with fixed track sizes",
|
||||||
|
0, 0);
|
||||||
|
goto fail_wo_sync;
|
||||||
|
}
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
|
for (i = 0 ; i < disc->session[0]->tracks; i++) {
|
||||||
|
t = disc->session[0]->track[i];
|
||||||
|
if (burn_track_is_open_ended(t)) {
|
||||||
|
default_size = burn_track_get_default_size(t);
|
||||||
|
|
||||||
|
#ifndef Libburn_precheck_write_ruleS
|
||||||
|
/* <<< covered by burn_precheck_write() */
|
||||||
|
if (default_size <= 0)
|
||||||
|
goto sao_restriction_violated;
|
||||||
|
#endif /* ! Libburn_precheck_write_ruleS */
|
||||||
|
|
||||||
|
sprintf(msg,
|
||||||
|
"Activated track default size %.f",
|
||||||
|
(double) default_size);
|
||||||
|
libdax_msgs_submit(libdax_messenger,
|
||||||
|
d->global_index, 0x0002012e,
|
||||||
|
LIBDAX_MSGS_SEV_NOTE,
|
||||||
|
LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);
|
||||||
|
burn_track_set_size(t, default_size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
burn_print(1, "sync write of %d CD sessions\n", disc->sessions);
|
burn_print(1, "sync write of %d CD sessions\n", disc->sessions);
|
||||||
|
|
||||||
@ -1224,11 +1828,16 @@ return crap. so we send the command, then ignore the result.
|
|||||||
d->send_write_parameters(d, o);
|
d->send_write_parameters(d, o);
|
||||||
|
|
||||||
ret = d->get_nwa(d, -1, &lba, &nwa);
|
ret = d->get_nwa(d, -1, &lba, &nwa);
|
||||||
sprintf(msg, "Inquired nwa: %d (ret=%d)", nwa, ret);
|
sprintf(msg,
|
||||||
|
"SAO|RAW: Inquired nwa: %d , ret= %d , cap=%.f\n",
|
||||||
|
nwa, ret, (double) d->media_capacity_remaining);
|
||||||
libdax_msgs_submit(libdax_messenger, d->global_index,
|
libdax_msgs_submit(libdax_messenger, d->global_index,
|
||||||
0x00000002,
|
0x00000002,
|
||||||
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
LIBDAX_MSGS_SEV_DEBUG, LIBDAX_MSGS_PRIO_ZERO,
|
||||||
msg,0, 0);
|
msg,0, 0);
|
||||||
|
|
||||||
|
/* >>> ts A70212 : CD-DAO/SAO : eventually expand size of last track to maximum */;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < disc->sessions; i++) {
|
for (i = 0; i < disc->sessions; i++) {
|
||||||
|
@ -15,7 +15,8 @@ int burn_sector_length(int trackmode);
|
|||||||
int burn_subcode_length(int trackmode);
|
int burn_subcode_length(int trackmode);
|
||||||
|
|
||||||
/* ts A61009 */
|
/* ts A61009 */
|
||||||
int burn_disc_write_is_ok(struct burn_write_opts *o, struct burn_disc *disc);
|
int burn_disc_write_is_ok(struct burn_write_opts *o, struct burn_disc *disc,
|
||||||
|
int flag);
|
||||||
|
|
||||||
void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc);
|
void burn_disc_write_sync(struct burn_write_opts *o, struct burn_disc *disc);
|
||||||
int burn_write_leadin(struct burn_write_opts *o,
|
int burn_write_leadin(struct burn_write_opts *o,
|
||||||
@ -32,4 +33,16 @@ int burn_write_close_track(struct burn_write_opts *o, struct burn_session *s,
|
|||||||
int tnum);
|
int tnum);
|
||||||
int burn_write_close_session(struct burn_write_opts *o,struct burn_session *s);
|
int burn_write_close_session(struct burn_write_opts *o,struct burn_session *s);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* mmc5r03c.pdf 6.3.3.3.3: DVD-R DL: Close Function 010b: Close Session
|
||||||
|
"When the recording mode is Incremental Recording,
|
||||||
|
the disc is single session."
|
||||||
|
Enable this macro to get away from growisofs which uses Close Session
|
||||||
|
but also states "// DVD-R DL Seq has no notion of multi-session".
|
||||||
|
|
||||||
|
#define Libburn_dvd_r_dl_multi_no_close_sessioN 1
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
#endif /* BURN__WRITE_H */
|
#endif /* BURN__WRITE_H */
|
||||||
|
@ -8,8 +8,9 @@
|
|||||||
|
|
||||||
libburner is a minimal demo application for the library libburn as provided
|
libburner is a minimal demo application for the library libburn as provided
|
||||||
on http://libburnia.pykix.org . It can list the available devices, can
|
on http://libburnia.pykix.org . It can list the available devices, can
|
||||||
blank a CD-RW, can format a DVD-RW, and can burn to CD-R, CD-RW, DVD+RW,
|
blank a CD-RW or DVD-RW, can format a DVD-RW, and can burn to CD-R, CD-RW,
|
||||||
DVD-RAM or DVD-RW.
|
DVD+RW, DVD-RAM or DVD-RW. Not supported yet: DVD+R [DL].
|
||||||
|
|
||||||
It's main purpose, nevertheless, is to show you how to use libburn and also
|
It's main purpose, nevertheless, is to show you how to use libburn and also
|
||||||
to serve the libburnia team as reference application. libburner.c does indeed
|
to serve the libburnia team as reference application. libburner.c does indeed
|
||||||
define the standard way how above three gestures can be implemented and
|
define the standard way how above three gestures can be implemented and
|
||||||
@ -261,19 +262,21 @@ 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 p;
|
||||||
int percent = 1;
|
double percent = 1.0;
|
||||||
|
|
||||||
disc_state = burn_disc_get_status(drive);
|
disc_state = burn_disc_get_status(drive);
|
||||||
printf(
|
printf(
|
||||||
"Drive media status: %d (see libburn/libburn.h BURN_DISC_*)\n",
|
"Drive media status: %d (see libburn/libburn.h BURN_DISC_*)\n",
|
||||||
disc_state);
|
disc_state);
|
||||||
if (disc_state == BURN_DISC_BLANK) {
|
if (current_profile == 0x13) {
|
||||||
|
; /* formatted DVD-RW will get blanked to sequential state */
|
||||||
|
} else if (disc_state == BURN_DISC_BLANK) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"IDLE: Blank media detected. Will leave it untouched\n");
|
"IDLE: Blank media detected. Will leave it untouched\n");
|
||||||
return 2;
|
return 2;
|
||||||
} else if (disc_state == BURN_DISC_FULL ||
|
} else if (disc_state == BURN_DISC_FULL ||
|
||||||
disc_state == BURN_DISC_APPENDABLE) {
|
disc_state == BURN_DISC_APPENDABLE) {
|
||||||
; /* this is what libburn is willing to blank */
|
; /* this is what libburner is willing to blank */
|
||||||
} else if (disc_state == BURN_DISC_EMPTY) {
|
} else if (disc_state == BURN_DISC_EMPTY) {
|
||||||
fprintf(stderr,"FATAL: No media detected in drive\n");
|
fprintf(stderr,"FATAL: No media detected in drive\n");
|
||||||
return 0;
|
return 0;
|
||||||
@ -295,7 +298,7 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
|
|||||||
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
|
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
|
||||||
percent = 1.0 + ((double) p.sector+1.0)
|
percent = 1.0 + ((double) p.sector+1.0)
|
||||||
/ ((double) p.sectors) * 98.0;
|
/ ((double) p.sectors) * 98.0;
|
||||||
printf("Blanking ( %d%% done )\n", percent);
|
printf("Blanking ( %.1f%% done )\n", percent);
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
printf("Done\n");
|
printf("Done\n");
|
||||||
@ -303,15 +306,16 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Persistently changes DVD-RW profile 0014h "Sequential Recording"
|
/** Persistently changes DVD-RW profile 0014h "Sequential Recording" to
|
||||||
to profile 0013h "Restricted Overwrite" which is usable with libburner.
|
profile 0013h "Restricted Overwrite" which needs no blanking for re-use
|
||||||
|
but is not capable of multi-session.
|
||||||
|
|
||||||
Expect a behavior similar to blanking with unusual noises from the drive.
|
Expect a behavior similar to blanking with unusual noises from the drive.
|
||||||
*/
|
*/
|
||||||
int libburner_format_row(struct burn_drive *drive)
|
int libburner_format_row(struct burn_drive *drive)
|
||||||
{
|
{
|
||||||
struct burn_progress p;
|
struct burn_progress p;
|
||||||
int percent = 1;
|
double percent = 1.0;
|
||||||
|
|
||||||
if (current_profile == 0x13) {
|
if (current_profile == 0x13) {
|
||||||
fprintf(stderr, "IDLE: DVD-RW media is already formatted\n");
|
fprintf(stderr, "IDLE: DVD-RW media is already formatted\n");
|
||||||
@ -328,7 +332,7 @@ int libburner_format_row(struct burn_drive *drive)
|
|||||||
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
|
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
|
||||||
percent = 1.0 + ((double) p.sector+1.0)
|
percent = 1.0 + ((double) p.sector+1.0)
|
||||||
/ ((double) p.sectors) * 98.0;
|
/ ((double) p.sectors) * 98.0;
|
||||||
printf("Formatting ( %d%% done )\n", percent);
|
printf("Formatting ( %.1f%% done )\n", percent);
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
burn_disc_get_profile(drive_list[0].drive, ¤t_profile,
|
burn_disc_get_profile(drive_list[0].drive, ¤t_profile,
|
||||||
@ -351,6 +355,9 @@ int libburner_format_row(struct burn_drive *drive)
|
|||||||
|
|
||||||
In case of external signals expect abort handling of an ongoing burn to
|
In case of external signals expect abort handling of an ongoing burn to
|
||||||
last up to a minute. Wait the normal burning timespan before any kill -9.
|
last up to a minute. Wait the normal burning timespan before any kill -9.
|
||||||
|
|
||||||
|
For simplicity, this function allows memory leaks in case of failure.
|
||||||
|
In apps which do not abort immediately, one should clean up better.
|
||||||
*/
|
*/
|
||||||
int libburner_payload(struct burn_drive *drive,
|
int libburner_payload(struct burn_drive *drive,
|
||||||
char source_adr[][4096], int source_adr_count,
|
char source_adr[][4096], int source_adr_count,
|
||||||
@ -364,9 +371,9 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
struct burn_track *track, *tracklist[99];
|
struct burn_track *track, *tracklist[99];
|
||||||
struct burn_progress progress;
|
struct burn_progress progress;
|
||||||
time_t start_time;
|
time_t start_time;
|
||||||
int last_sector = 0, padding = 0, trackno, write_mode_tao = 0, fd;
|
int last_sector = 0, padding = 0, trackno, unpredicted_size = 0, fd;
|
||||||
off_t fixed_size;
|
off_t fixed_size;
|
||||||
char *adr;
|
char *adr, reasons[BURN_REASONS_LEN];
|
||||||
struct stat stbuf;
|
struct stat stbuf;
|
||||||
|
|
||||||
if (all_tracks_type != BURN_AUDIO) {
|
if (all_tracks_type != BURN_AUDIO) {
|
||||||
@ -395,7 +402,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
fixed_size = stbuf.st_size;
|
fixed_size = stbuf.st_size;
|
||||||
}
|
}
|
||||||
if (fixed_size==0)
|
if (fixed_size==0)
|
||||||
write_mode_tao = 1;
|
unpredicted_size = 1;
|
||||||
data_src = NULL;
|
data_src = NULL;
|
||||||
if (fd>=0)
|
if (fd>=0)
|
||||||
data_src = burn_fd_source_new(fd, -1, fixed_size);
|
data_src = burn_fd_source_new(fd, -1, fixed_size);
|
||||||
@ -419,9 +426,8 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
|
|
||||||
/* Evaluate drive and media */
|
/* Evaluate drive and media */
|
||||||
disc_state = burn_disc_get_status(drive);
|
disc_state = burn_disc_get_status(drive);
|
||||||
if (disc_state == BURN_DISC_APPENDABLE) {
|
if (disc_state != BURN_DISC_BLANK &&
|
||||||
write_mode_tao = 1;
|
disc_state != BURN_DISC_APPENDABLE) {
|
||||||
} else if (disc_state != BURN_DISC_BLANK) {
|
|
||||||
if (disc_state == BURN_DISC_FULL) {
|
if (disc_state == BURN_DISC_FULL) {
|
||||||
fprintf(stderr, "FATAL: Closed media with data detected. Need blank or appendable media.\n");
|
fprintf(stderr, "FATAL: Closed media with data detected. Need blank or appendable media.\n");
|
||||||
if (burn_disc_erasable(drive))
|
if (burn_disc_erasable(drive))
|
||||||
@ -437,18 +443,17 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
burn_options = burn_write_opts_new(drive);
|
burn_options = burn_write_opts_new(drive);
|
||||||
burn_write_opts_set_perform_opc(burn_options, 0);
|
burn_write_opts_set_perform_opc(burn_options, 0);
|
||||||
burn_write_opts_set_multi(burn_options, !!multi);
|
burn_write_opts_set_multi(burn_options, !!multi);
|
||||||
if (write_mode_tao)
|
|
||||||
burn_write_opts_set_write_type(burn_options,
|
|
||||||
BURN_WRITE_TAO, BURN_BLOCK_MODE1);
|
|
||||||
else
|
|
||||||
burn_write_opts_set_write_type(burn_options,
|
|
||||||
BURN_WRITE_SAO, BURN_BLOCK_SAO);
|
|
||||||
if(simulate_burn)
|
if(simulate_burn)
|
||||||
printf("\n*** Will TRY to SIMULATE burning ***\n\n");
|
printf("\n*** Will TRY to SIMULATE burning ***\n\n");
|
||||||
burn_write_opts_set_simulate(burn_options, simulate_burn);
|
burn_write_opts_set_simulate(burn_options, simulate_burn);
|
||||||
burn_structure_print_disc(target_disc);
|
|
||||||
burn_drive_set_speed(drive, 0, 0);
|
burn_drive_set_speed(drive, 0, 0);
|
||||||
burn_write_opts_set_underrun_proof(burn_options, 1);
|
burn_write_opts_set_underrun_proof(burn_options, 1);
|
||||||
|
if (burn_write_opts_auto_write_type(burn_options, target_disc,
|
||||||
|
reasons, 0) == BURN_WRITE_NONE) {
|
||||||
|
fprintf(stderr, "FATAL: Failed to find a suitable write mode with this media.\n");
|
||||||
|
fprintf(stderr, "Reasons given:\n%s\n", reasons);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
printf("Burning starts. With e.g. 4x media expect up to a minute of zero progress.\n");
|
printf("Burning starts. With e.g. 4x media expect up to a minute of zero progress.\n");
|
||||||
start_time = time(0);
|
start_time = time(0);
|
||||||
@ -462,7 +467,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
printf(
|
printf(
|
||||||
"Thank you for being patient since %d seconds.\n",
|
"Thank you for being patient since %d seconds.\n",
|
||||||
(int) (time(0) - start_time));
|
(int) (time(0) - start_time));
|
||||||
else if(write_mode_tao)
|
else if(unpredicted_size)
|
||||||
printf("Track %d : sector %d\n", progress.track+1,
|
printf("Track %d : sector %d\n", progress.track+1,
|
||||||
progress.sector);
|
progress.sector);
|
||||||
else
|
else
|
||||||
@ -498,8 +503,6 @@ static int all_tracks_type = BURN_MODE1;
|
|||||||
|
|
||||||
|
|
||||||
/** Converts command line arguments into above setup parameters.
|
/** Converts command line arguments into above setup parameters.
|
||||||
drive_adr[] must provide at least BURN_DRIVE_ADR_LEN bytes.
|
|
||||||
source_adr[] must provide at least 4096 bytes.
|
|
||||||
*/
|
*/
|
||||||
int libburner_setup(int argc, char **argv)
|
int libburner_setup(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -590,9 +593,11 @@ int libburner_setup(int argc, char **argv)
|
|||||||
printf(" %s --drive /dev/hdc my_image_file\n", argv[0]);
|
printf(" %s --drive /dev/hdc my_image_file\n", argv[0]);
|
||||||
printf("Blank a used CD-RW (is combinable with burning in one run):\n");
|
printf("Blank a used CD-RW (is combinable with burning in one run):\n");
|
||||||
printf(" %s --drive /dev/hdc --blank_fast\n",argv[0]);
|
printf(" %s --drive /dev/hdc --blank_fast\n",argv[0]);
|
||||||
printf("Format a DVD-RW once before first use with libburner:\n");
|
printf("Blank a used DVD-RW (is combinable with burning in one run):\n");
|
||||||
|
printf(" %s --drive /dev/hdc --blank_full\n",argv[0]);
|
||||||
|
printf("Format a DVD-RW to avoid need for blanking before re-use:\n");
|
||||||
printf(" %s --drive /dev/hdc --format_overwrite\n", argv[0]);
|
printf(" %s --drive /dev/hdc --format_overwrite\n", argv[0]);
|
||||||
printf("Burn two audio tracks:\n");
|
printf("Burn two audio tracks (to CD only):\n");
|
||||||
printf(" lame --decode -t /path/to/track1.mp3 track1.cd\n");
|
printf(" lame --decode -t /path/to/track1.mp3 track1.cd\n");
|
||||||
printf(" test/dewav /path/to/track2.wav -o track2.cd\n");
|
printf(" test/dewav /path/to/track2.wav -o track2.cd\n");
|
||||||
printf(" %s --drive /dev/hdc --audio track1.cd track2.cd\n", argv[0]);
|
printf(" %s --drive /dev/hdc --audio track1.cd track2.cd\n", argv[0]);
|
||||||
|
151
test/telltoc.c
151
test/telltoc.c
@ -200,11 +200,11 @@ int telltoc_aquire_by_driveno(int *driveno, int silent_drive)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** This gesture is necessary to get my NEC DVD_RW ND-4570A out of a state
|
/** This gesture is necessary to get my NEC DVD_RW ND-4570A out of a state
|
||||||
of noisy overexcitement after it was inquired for Next Writeable Address.
|
of noisy overexcitement after its tray was loaded and it then was inquired
|
||||||
|
for Next Writeable Address.
|
||||||
The noise then still lasts 20 seconds. Same with cdrecord -toc, btw.
|
The noise then still lasts 20 seconds. Same with cdrecord -toc, btw.
|
||||||
It opens a small gap for losing the drive to another libburn instance.
|
This opens a small gap for losing the drive to another libburn instance.
|
||||||
Not a problem in telltoc. This is done as very last drive operation.
|
Not a problem in telltoc. This is done as very last drive operation.
|
||||||
Eventually the other libburn instance will have the same sanitizing effect.
|
Eventually the other libburn instance will have the same sanitizing effect.
|
||||||
*/
|
*/
|
||||||
@ -226,8 +226,11 @@ int telltoc_media(struct burn_drive *drive)
|
|||||||
{
|
{
|
||||||
int ret, media_found = 0, profile_no = -1;
|
int ret, media_found = 0, profile_no = -1;
|
||||||
double max_speed = 0.0, min_speed = 0.0, speed_conv;
|
double max_speed = 0.0, min_speed = 0.0, speed_conv;
|
||||||
|
off_t available = 0;
|
||||||
enum burn_disc_status s;
|
enum burn_disc_status s;
|
||||||
char profile_name[80], speed_unit[40];
|
char profile_name[80], speed_unit[40];
|
||||||
|
struct burn_multi_caps *caps;
|
||||||
|
struct burn_write_opts *o = NULL;
|
||||||
|
|
||||||
printf("Media current: ");
|
printf("Media current: ");
|
||||||
ret = burn_disc_get_profile(drive, &profile_no, profile_name);
|
ret = burn_disc_get_profile(drive, &profile_no, profile_name);
|
||||||
@ -273,6 +276,65 @@ int telltoc_media(struct burn_drive *drive)
|
|||||||
} else
|
} else
|
||||||
printf("is not recognizable\n");
|
printf("is not recognizable\n");
|
||||||
|
|
||||||
|
ret = burn_disc_get_multi_caps(drive, BURN_WRITE_NONE, &caps, 0);
|
||||||
|
if (ret > 0) {
|
||||||
|
/* Media appears writeable */
|
||||||
|
printf("Write multi : ");
|
||||||
|
printf("%s multi-session , ",
|
||||||
|
caps->multi_session == 1 ? "allows" : "prohibits");
|
||||||
|
if (caps->multi_track)
|
||||||
|
printf("allows multiple tracks\n");
|
||||||
|
else
|
||||||
|
printf("enforces single track\n");
|
||||||
|
printf("Write start : ");
|
||||||
|
if (caps->start_adr == 1)
|
||||||
|
printf(
|
||||||
|
"allows addresses [%.f , %.f]s , alignment=%.fs\n",
|
||||||
|
(double) caps->start_range_low / 2048 ,
|
||||||
|
(double) caps->start_range_high / 2048 ,
|
||||||
|
(double) caps->start_alignment / 2048 );
|
||||||
|
else
|
||||||
|
printf("prohibits write start addressing\n");
|
||||||
|
printf("Write modes : ");
|
||||||
|
if (caps->might_do_tao)
|
||||||
|
printf("TAO%s",
|
||||||
|
caps->advised_write_mode == BURN_WRITE_TAO ?
|
||||||
|
" (advised)" : "");
|
||||||
|
if (caps->might_do_sao)
|
||||||
|
printf("%sSAO%s",
|
||||||
|
caps->might_do_tao ? " , " : "",
|
||||||
|
caps->advised_write_mode == BURN_WRITE_SAO ?
|
||||||
|
" (advised)" : "");
|
||||||
|
if (caps->might_do_raw)
|
||||||
|
printf("%sRAW%s",
|
||||||
|
caps->might_do_tao | caps->might_do_sao ?
|
||||||
|
" , " : "",
|
||||||
|
caps->advised_write_mode == BURN_WRITE_RAW ?
|
||||||
|
" (advised)" : "");
|
||||||
|
printf("\n");
|
||||||
|
o= burn_write_opts_new(drive);
|
||||||
|
if (o != NULL) {
|
||||||
|
burn_write_opts_set_perform_opc(o, 0);
|
||||||
|
if(caps->advised_write_mode == BURN_WRITE_TAO)
|
||||||
|
burn_write_opts_set_write_type(o,
|
||||||
|
BURN_WRITE_TAO, BURN_BLOCK_MODE1);
|
||||||
|
else if (caps->advised_write_mode == BURN_WRITE_SAO)
|
||||||
|
burn_write_opts_set_write_type(o,
|
||||||
|
BURN_WRITE_SAO, BURN_BLOCK_SAO);
|
||||||
|
else {
|
||||||
|
burn_write_opts_free(o);
|
||||||
|
o = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
available = burn_disc_available_space(drive, o);
|
||||||
|
printf("Write space : %.1f MiB (%.fs)\n",
|
||||||
|
((double) available) / 1024.0 / 1024.0,
|
||||||
|
((double) available) / 2048.0);
|
||||||
|
burn_disc_free_multi_caps(&caps);
|
||||||
|
if (o != NULL)
|
||||||
|
burn_write_opts_free(o);
|
||||||
|
}
|
||||||
|
|
||||||
ret = burn_drive_get_write_speed(drive);
|
ret = burn_drive_get_write_speed(drive);
|
||||||
max_speed = ((double ) ret) / speed_conv;
|
max_speed = ((double ) ret) / speed_conv;
|
||||||
ret = burn_drive_get_min_write_speed(drive);
|
ret = burn_drive_get_min_write_speed(drive);
|
||||||
@ -375,7 +437,7 @@ int telltoc_formatlist(struct burn_drive *drive)
|
|||||||
|
|
||||||
int telltoc_toc(struct burn_drive *drive)
|
int telltoc_toc(struct burn_drive *drive)
|
||||||
{
|
{
|
||||||
int num_sessions = 0 , num_tracks = 0 , lba = 0;
|
int num_sessions = 0 , num_tracks = 0 , lba = 0, pmin, psec, pframe;
|
||||||
int track_count = 0;
|
int track_count = 0;
|
||||||
int session_no, track_no;
|
int session_no, track_no;
|
||||||
struct burn_disc *disc= NULL;
|
struct burn_disc *disc= NULL;
|
||||||
@ -397,27 +459,36 @@ int telltoc_toc(struct burn_drive *drive)
|
|||||||
for(track_no= 0; track_no<num_tracks; track_no++) {
|
for(track_no= 0; track_no<num_tracks; track_no++) {
|
||||||
track_count++;
|
track_count++;
|
||||||
burn_track_get_entry(tracks[track_no], &toc_entry);
|
burn_track_get_entry(tracks[track_no], &toc_entry);
|
||||||
lba= burn_msf_to_lba(toc_entry.pmin, toc_entry.psec,
|
if (toc_entry.extensions_valid & 1) {
|
||||||
toc_entry.pframe);
|
/* DVD extension valid */
|
||||||
|
lba = toc_entry.start_lba;
|
||||||
|
burn_lba_to_msf(lba, &pmin, &psec, &pframe);
|
||||||
|
} else {
|
||||||
|
pmin = toc_entry.pmin;
|
||||||
|
psec = toc_entry.psec;
|
||||||
|
pframe = toc_entry.pframe;
|
||||||
|
lba= burn_msf_to_lba(pmin, psec, pframe);
|
||||||
|
}
|
||||||
printf("Media content: session %2d ", session_no+1);
|
printf("Media content: session %2d ", session_no+1);
|
||||||
printf("track %2d %s lba: %9d %2.2u:%2.2u:%2.2u\n",
|
printf("track %2d %s lba: %9d %4.2d:%2.2d:%2.2d\n",
|
||||||
track_count,
|
track_count,
|
||||||
((toc_entry.control&7)<4?"audio":"data "),
|
((toc_entry.control&7)<4?"audio":"data "),
|
||||||
lba,
|
lba, pmin, psec, pframe);
|
||||||
toc_entry.pmin,
|
|
||||||
toc_entry.psec,
|
|
||||||
toc_entry.pframe);
|
|
||||||
}
|
}
|
||||||
burn_session_get_leadout_entry(sessions[session_no],
|
burn_session_get_leadout_entry(sessions[session_no],
|
||||||
&toc_entry);
|
&toc_entry);
|
||||||
lba = burn_msf_to_lba(toc_entry.pmin,
|
if (toc_entry.extensions_valid & 1) {
|
||||||
toc_entry.psec, toc_entry.pframe);
|
lba = toc_entry.start_lba;
|
||||||
|
burn_lba_to_msf(lba, &pmin, &psec, &pframe);
|
||||||
|
} else {
|
||||||
|
pmin = toc_entry.pmin;
|
||||||
|
psec = toc_entry.psec;
|
||||||
|
pframe = toc_entry.pframe;
|
||||||
|
lba= burn_msf_to_lba(pmin, psec, pframe);
|
||||||
|
}
|
||||||
printf("Media content: session %2d ", session_no+1);
|
printf("Media content: session %2d ", session_no+1);
|
||||||
printf("leadout lba: %9d %2.2u:%2.2u:%2.2u\n",
|
printf("leadout lba: %9d %4.2d:%2.2d:%2.2d\n",
|
||||||
lba,
|
lba, pmin, psec, pframe);
|
||||||
toc_entry.pmin,
|
|
||||||
toc_entry.psec,
|
|
||||||
toc_entry.pframe);
|
|
||||||
}
|
}
|
||||||
if (disc!=NULL)
|
if (disc!=NULL)
|
||||||
burn_disc_free(disc);
|
burn_disc_free(disc);
|
||||||
@ -428,13 +499,8 @@ int telltoc_toc(struct burn_drive *drive)
|
|||||||
int telltoc_msinfo(struct burn_drive *drive,
|
int telltoc_msinfo(struct burn_drive *drive,
|
||||||
int msinfo_explicit, int msinfo_alone)
|
int msinfo_explicit, int msinfo_alone)
|
||||||
{
|
{
|
||||||
int num_sessions, session_no, ret, num_tracks;
|
int ret, lba, nwa = -123456789, aux_lba;
|
||||||
int nwa = -123456789, lba = -123456789, aux_lba, lout_lba;
|
|
||||||
enum burn_disc_status s;
|
enum burn_disc_status s;
|
||||||
struct burn_disc *disc= NULL;
|
|
||||||
struct burn_session **sessions;
|
|
||||||
struct burn_track **tracks;
|
|
||||||
struct burn_toc_entry toc_entry;
|
|
||||||
struct burn_write_opts *o= NULL;
|
struct burn_write_opts *o= NULL;
|
||||||
|
|
||||||
s = burn_disc_get_status(drive);
|
s = burn_disc_get_status(drive);
|
||||||
@ -450,34 +516,17 @@ int telltoc_msinfo(struct burn_drive *drive,
|
|||||||
The first number is the sector number of the first sector in
|
The first number is the sector number of the first sector in
|
||||||
the last session of the disk that should be appended to.
|
the last session of the disk that should be appended to.
|
||||||
*/
|
*/
|
||||||
disc = burn_drive_get_disc(drive);
|
ret = burn_disc_get_msc1(drive, &lba);
|
||||||
if (disc==NULL) {
|
if (ret <= 0) {
|
||||||
fprintf(stderr,"SORRY: Cannot obtain info about CD content\n");
|
fprintf(stderr,
|
||||||
return 2;
|
"SORRY: Cannot obtain start address of last session\n");
|
||||||
}
|
|
||||||
sessions = burn_disc_get_sessions(disc, &num_sessions);
|
|
||||||
for (session_no = 0; session_no<num_sessions; session_no++) {
|
|
||||||
tracks = burn_session_get_tracks(sessions[session_no],
|
|
||||||
&num_tracks);
|
|
||||||
if (tracks==NULL || num_tracks<=0)
|
|
||||||
continue;
|
|
||||||
burn_track_get_entry(tracks[0], &toc_entry);
|
|
||||||
lba= burn_msf_to_lba(toc_entry.pmin, toc_entry.psec,
|
|
||||||
toc_entry.pframe);
|
|
||||||
}
|
|
||||||
if(lba==-123456789) {
|
|
||||||
fprintf(stderr,"SORRY: Cannot find any track on media\n");
|
|
||||||
{ ret = 0; goto ex; }
|
{ ret = 0; goto ex; }
|
||||||
}
|
}
|
||||||
/* Prepare a qualified guess as fallback for nwa inquiry */
|
|
||||||
burn_session_get_leadout_entry(sessions[num_sessions-1], &toc_entry);
|
|
||||||
lout_lba= burn_msf_to_lba(toc_entry.pmin,toc_entry.psec,
|
|
||||||
toc_entry.pframe);
|
|
||||||
|
|
||||||
/* man mkisofs , option -C :
|
/* man mkisofs , option -C :
|
||||||
The second number is the starting sector number of the new session.
|
The second number is the starting sector number of the new session.
|
||||||
*/
|
*/
|
||||||
/* Set some write opts to be sent to drive. LG GSA-4082B needs it. */
|
/* Set some roughly suitable write opts to be sent to drive. */
|
||||||
o= burn_write_opts_new(drive);
|
o= burn_write_opts_new(drive);
|
||||||
if(o!=NULL) {
|
if(o!=NULL) {
|
||||||
burn_write_opts_set_perform_opc(o, 0);
|
burn_write_opts_set_perform_opc(o, 0);
|
||||||
@ -489,21 +538,15 @@ int telltoc_msinfo(struct burn_drive *drive,
|
|||||||
telltoc_regrab(drive); /* necessary to calm down my NEC drive */
|
telltoc_regrab(drive); /* necessary to calm down my NEC drive */
|
||||||
if(ret<=0) {
|
if(ret<=0) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"NOTE: Guessing next writeable address from leadout\n");
|
"SORRY: Cannot obtain next writeable address\n");
|
||||||
if(num_sessions>0)
|
{ ret = 0; goto ex; }
|
||||||
nwa= lout_lba+6900;
|
|
||||||
else
|
|
||||||
nwa= lout_lba+11400;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!msinfo_alone)
|
if (!msinfo_alone)
|
||||||
printf("Media msinfo : mkisofs ... -C ");
|
printf("Media msinfo : mkisofs ... -C ");
|
||||||
printf("%d,%d\n",lba,nwa);
|
printf("%d,%d\n",lba,nwa);
|
||||||
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
ex:;
|
ex:;
|
||||||
if (disc!=NULL)
|
|
||||||
burn_disc_free(disc);
|
|
||||||
if (o != NULL)
|
if (o != NULL)
|
||||||
burn_write_opts_free(o);
|
burn_write_opts_free(o);
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user