Compare commits

...

90 Commits
1.2.4 ... 1.3.2

Author SHA1 Message Date
56bbe41a62 Documented changes and release timestamp 2013-08-07 10:25:58 +00:00
c0d00dfc98 Updated cdrskin tarball generator 2013-08-07 10:19:45 +00:00
3a5f14590e Made number transition to 1.3.2 2013-08-07 10:18:28 +00:00
7241d55a12 Branching for libburn release 1.3.2 2013-08-07 09:22:01 +00:00
9afa5379e5 Update of doxygen configuration for version 1.8.4 provided by George Danchev 2013-08-04 20:03:57 +00:00
b08075479e Reacted on advise from Helmut Grohne to avoid confusion of doxygen 2013-08-04 12:45:31 +00:00
2b74f6fa63 Changed default write chunk size for BD to 64 KiB 2013-08-04 10:03:21 +00:00
8f60105c8d Reacted on warnings of Debian build service about doxygen flaws 2013-07-29 09:14:51 +00:00
f8be7e46ab Bug fix: The signal handler aborted on SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU 2013-07-21 17:07:53 +00:00
f9793c54c2 New option --pacifier_with_newline 2013-07-08 15:19:45 +00:00
870b71377d Corrected typo in a comment 2013-07-08 14:56:30 +00:00
8eed2e9558 New mode bit8 with burn_set_signal_handling() to particularly ignore SIGPIPE 2013-07-01 16:00:28 +00:00
abe560a6ec Removed an obsolete note message from cdrskin --devices 2013-06-28 10:43:47 +00:00
2a991bbab3 Making sure in cdrskin that off_t is large enough before starting libburn 2013-06-28 10:42:04 +00:00
b46f7157de Removed inactive test code from telltoc.c 2013-06-24 15:07:45 +00:00
9aaca05499 Updated change log 2013-06-12 10:43:07 +00:00
bd381583de Some polishing of SCSI log time measurement 2013-06-09 16:31:28 +00:00
e2188fb9f7 Prepared for optional use of clock_gettime() 2013-06-09 15:43:02 +00:00
fd8f4d48b8 Improved granularity of SCSI log time measurement and added absolute timestamp 2013-06-09 15:26:32 +00:00
0eb24d293f Mentioned bug fix and pl01 2013-05-31 10:09:00 +00:00
f1ef0a1995 Updated change log 2013-05-30 13:34:32 +00:00
0178c42c20 Bug fix: cdrskin -msinfo on DVD and BD reported old session start == next writable address. Regression introduced by version 1.2.8 (rev 4956). 2013-05-30 13:31:06 +00:00
21511e3fdf Luring K3B into using -xa rather than -xa1 2013-05-26 19:00:13 +00:00
744da88c3c Updated documentation about CD-TEXT 2013-05-23 19:37:08 +00:00
3ab91cb93b Updated change log 2013-05-23 15:55:39 +00:00
19cbdde95f New cdrskin options extract_audio_to= , extract_tracks= , extract_basename= , --extract_dap 2013-05-23 15:48:04 +00:00
167d73e268 New API calls burn_drive_extract_audio(), burn_drive_extract_audio_track() 2013-05-23 15:43:19 +00:00
1887b0b938 Defaulting -sao -multi to -tao -multi if -sao -multi is not possible 2013-05-21 08:18:48 +00:00
0b932e5f7d Updated change log 2013-05-20 14:13:57 +00:00
ecd303149f Closed memory leak introduced by rev 5063 2013-05-20 12:45:48 +00:00
8f500d90df Bug fixes with new API call burn_make_input_sheet_v07t() 2013-05-20 12:45:12 +00:00
644feceb5c Allowed option input_sheet_v07t= to read multiple blocks from same file 2013-05-20 11:01:57 +00:00
eb03488f52 API call burn_session_input_sheet_v07t(): read multiple blocks from same file 2013-05-20 10:48:40 +00:00
a252038113 New options cdtext_to_textfile= and cdtext_to_v07t= 2013-05-19 15:49:05 +00:00
ca3f994dcb New option textfile_to_v07t= 2013-05-19 11:49:24 +00:00
7f8d8a04d0 New API call burn_make_input_sheet_v07t() 2013-05-19 11:47:10 +00:00
2fd5af75eb Updated change log 2013-05-17 18:12:12 +00:00
cf363b27fa Made number transition to 1.3.1 2013-05-17 18:08:48 +00:00
469ab7bf21 Updated cdrskin tarball generator 2013-05-17 18:04:46 +00:00
ac2bfec065 Updated change log 2013-05-10 07:30:48 +00:00
c566ea03cf Added new item to list of error codes 2013-05-10 07:26:11 +00:00
3632e1be4e Bug fix: DVD+R with damaged TOC were reported by -minfo with wrong end address 2013-05-10 06:41:53 +00:00
f18b832a82 Updated change log 2013-04-01 12:56:35 +00:00
1f92419cb4 Bug fix: Formatting of BD-RE used certification regardless of drive capabilities 2013-04-01 12:19:14 +00:00
d6e15a0139 Forgot to increment cdrskin version number 2013-04-01 12:17:05 +00:00
e0db790103 Updated change log 2013-03-18 21:21:35 +00:00
9bc362f59b Made number transition to 1.2.9 2013-03-18 21:09:13 +00:00
44d5f3ce4e Updated cdrskin tarball generator 2013-03-18 08:31:34 +00:00
0f43a39a45 Made number transition to 1.2.8 2013-03-18 08:29:37 +00:00
0a1a085471 Avoiding SYNCHRONIZE CACHE if DVD track preparation has failed 2013-03-12 11:48:07 +00:00
a1fdfe1519 Always considering mode page 2A when looking for min and max speed 2013-03-05 18:55:03 +00:00
bbb6315af0 Always considering mode page 2A when looking for min and max speed 2013-03-05 18:54:19 +00:00
40d83b2314 Updated change log 2013-03-05 12:51:03 +00:00
c82ac0a825 Mentioned --list_speeds in manual page 2013-03-05 12:47:56 +00:00
46b598abd2 New cdrskin option --list_speeds 2013-03-05 12:45:37 +00:00
c7784b79b7 Still correcting the bug fix of rev 4975 2013-03-05 12:42:41 +00:00
f1b3184531 Corrected previous bug fix which caused speed descriptors to appear twice 2013-03-04 23:25:27 +00:00
a18c862e84 Bug fix: On some drives the request for minimum speed yielded maximum speed 2013-03-04 21:13:32 +00:00
c2903ab717 Corrected wrong use of sizeof 2013-02-26 08:01:51 +00:00
04ccaebff7 Updated cdrskin copyright message 2013-01-16 18:12:41 +00:00
2e83dc554b Updated change log 2013-01-16 18:05:44 +00:00
3a17a8a014 Bug fix: All CD tracks were reported with the sizes of the tracks in the first session. Regression introduced with version 1.2.0 (rev 4552). 2013-01-15 10:42:21 +00:00
ffca3e89dd Made use of new API features to handle incomplete sessions 2013-01-12 19:54:59 +00:00
676231c362 New API call burn_disc_get_incomplete_sessions(), new burn_toc_entry.track_status_bits 2013-01-12 19:51:21 +00:00
d76c715df7 Updated change log 2013-01-08 14:56:13 +00:00
9aa47792e0 Updated cdrskin tarball generator 2013-01-08 14:53:46 +00:00
f4cfe9b267 Made number transition to 1.2.7 2013-01-08 14:52:30 +00:00
6f19122672 Small change to burn cookbook about ISO multi-session emulation 2012-12-14 15:33:09 +00:00
057f24d5b9 New API call burn_list_sev_texts() 2012-12-14 14:51:46 +00:00
a843727bc7 Made telltoc ready for reading CD audio 2012-11-30 19:40:37 +00:00
bb409500ed New API call burn_read_audio 2012-11-30 19:34:33 +00:00
1a74a05965 Let mmc_format_unit issue failure message on SCSI error 2012-11-29 11:26:53 +00:00
2df7f3d5d5 Forgot mcc.c with the previous commit 2012-11-29 11:25:54 +00:00
0728d855d5 Beginning to create new API call burn_read_audio 2012-11-29 11:14:33 +00:00
100be5078c Better reaction on non-plausible ATIP info from CD-ROM 2012-11-24 18:14:36 +00:00
5139bf922a Preserving an immature sketch of media quality scanning 2012-11-18 18:47:09 +00:00
a2b4361d69 Preserving an immature sketch of media quality scanning 2012-11-18 18:46:05 +00:00
d216764867 Corrected error handling which was spoiled by rev 4852 2012-10-25 17:35:10 +00:00
4c74cbf7b3 New flag bit4 of burn_read_data() for better handling of TAO end blocks 2012-10-25 12:39:50 +00:00
7ed8619a9e Reporting (still cryptic) details about refusal to blank 2012-10-24 09:58:25 +00:00
fa2508bfd5 Configuration for use of libcdio on cygwin. Thanks Rocky Bernstein. 2012-10-02 13:49:26 +00:00
72ae8e3b5a Updated change log 2012-09-13 08:59:00 +00:00
fa95326bac Bug fix: Speed setting had no effect on BD media. Thanks to Dennis Vshivkov. 2012-09-13 08:57:31 +00:00
eb86e5298a Removed buggy burn_strdup() and burn_strndup(). Thanks to Rich Felker. 2012-08-28 16:20:45 +00:00
4cfa8170ee Small grammatical correction in CD-TEXT documentaion 2012-08-01 06:36:53 +00:00
d885d9a408 Updated change log 2012-07-26 19:48:05 +00:00
6a23213113 New option --no_load 2012-07-26 12:30:06 +00:00
89edfaf875 Updated change log 2012-07-20 16:53:09 +00:00
1297525889 Updated cdrskin tarball generator 2012-07-20 16:51:22 +00:00
5397f85d38 Made number transition to 1.2.5 2012-07-20 16:49:40 +00:00
51 changed files with 5277 additions and 1132 deletions

View File

@ -1,8 +1,60 @@
SVN trunk (to become libburn-1.2.4 or higher)
SVN trunk (to become libburn-1.3.2 or higher)
===============================================================================
- no novelties yet
* Bug fix: cdrskin -msinfo on DVD and BD reported
old session start = next writable address.
Regression introduced by version 1.2.8 (rev 4956).
* Bug fix: The signal handler aborted on SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU
* New API call burn_make_input_sheet_v07t()
* API call burn_session_input_sheet_v07t(): read multiple blocks from same file
* New API calls burn_drive_extract_audio(), burn_drive_extract_audio_track()
* New cdrskin option textfile_to_v07t=
* New cdrskin options cdtext_to_textfile= and cdtext_to_v07t=
* New cdrskin options extract_audio_to= , extract_tracks= , extract_basename= ,
--extract_dap
* New cdrskin option --pacifier_with_newline
* Improved granularity of SCSI log time measurement, now with timestamp
* Optional "make doc" now demands doxygen 1.8.4
libburn-1.3.0.pl01.tar.gz Fri May 31 2013
===============================================================================
* Bug fix: cdrskin -msinfo on DVD and BD reported
old session start = next writable address.
Regression introduced by version 1.2.8.
libburn-1.3.0.tar.gz Fri May 17 2013
===============================================================================
* Bug fix: Full formatting of BD-RE used certification regardless of drive
capabilities
* Bug fix: DVD+R with damaged TOC were reported by -minfo with wrong end
address
libburn-1.2.8.tar.gz Mon Mar 18 2013
===============================================================================
* Bug fix: All CD tracks were reported with the sizes of the tracks in the
first session. Regression introduced with version 1.2.0 (rev 4552).
* Bug fix: On some drives the request for minimum speed yielded maximum speed
* New cdrskin option --list_speeds
* -toc and -minfo now report about tracks in the incomplete session
* New API call burn_disc_get_incomplete_sessions()
* New burn_toc_entry component .track_status_bits
libburn-1.2.6.tar.gz Tue Jan 08 2013
===============================================================================
* Bug fix: Speed setting had no effect on BD media
* New cdrskin option --no_load
* New API call burn_read_audio()
* New API call burn_list_sev_texts()
libburn-1.2.4.tar.gz Fri Jul 20 2012
===============================================================================
* Bug fix: CD SAO sessions with data tracks started by an audio pause
* Bug fix: CD tracks were perceived 2 sectors too short.
Nice with TAO, bad with SAO.
* Bug fix: cdrskin SIGSEGV if track source was added when no drive was available
* New API call burn_write_opts_set_obs_pad(), ./configure --enable-dvd-obs-pad
* New cdrskin option --obs_pad
libburn-1.2.2.tar.gz Mon Apr 02 2012
===============================================================================
* Small internal refinements

View File

@ -118,9 +118,9 @@ test_structest_CPPFLAGS = -Ilibburn
test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
test_structest_SOURCES = test/structest.c
## cdrskin construction site - ts A60816 - B20402
## cdrskin construction site - ts A60816 - B30807
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_2_3
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_3_2
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking

45
README
View File

@ -6,12 +6,12 @@ This all is under GPL.
------------------------------------------------------------------------------
libburnia-project.org
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006-2012 Mario Danic, Thomas Schmitt
Copyright (C) 2006-2013 Mario Danic, Thomas Schmitt
Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com>
and Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
http://files.libburnia-project.org/releases/libburn-1.2.2.tar.gz
http://files.libburnia-project.org/releases/libburn-1.3.2.tar.gz
------------------------------------------------------------------------------
@ -19,10 +19,10 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
From tarball
Obtain libburn-1.2.2.tar.gz, take it to a directory of your choice and do:
Obtain libburn-1.3.2.tar.gz, take it to a directory of your choice and do:
tar xzf libburn-1.2.2.tar.gz
cd libburn-1.2.2
tar xzf libburn-1.3.2.tar.gz
cd libburn-1.3.2
./configure --prefix=/usr
make
@ -77,6 +77,10 @@ configure time by:
--enable-dvd-obs-64k
This may be combined with above --enable-track-src-odirect .
If it is desired that DVD DAO writing and stdio: writing get padded up to
a full write chunk of 32k resp. 64k, then use ./configure option:
--enable-dvd-obs-pad
Alternatively the transport of SCSI commands can be done via libcdio-0.83.
You may install it and re-run libburn's ./configure with option
--enable-libcdio
@ -677,6 +681,37 @@ Project history as far as known to me:
been improved in libisofs. libisoburn and xorriso now make use of these
improvements. Some rarely occuring bugs have been fixed.
- Fri Jul 20 2012 release 1.2.4:
libburn and libisofs got some rarely occuring bugs fixed. libisofs learned
to produce HFS+ metadata and Apple Partition Map. The capabilities of
isohybrid options --efi and --mac have been implemented (GPT and APM).
- Tue Jan 08 2013 release 1.2.6:
Small improvements were made in libburn. Minor bugs were fixed in the
libraries. xorriso improved its capabilities to serve the needs of frontend
programs. A proof of concept for a GUI frontend has been implemented:
xorriso-tcltk
- Mon Mar 18 2013 release 1.2.8:
Some rarely occuring bugs were fixed in libisofs and libburn. libburn's
handling of incomplete sessions has been improved. xorriso's mkisofs
emulation learned to set El Torito section id strings.
- Fri May 17 2013 release 1.3.0:
Several bugs were fixed in the libraries and in xorriso. The recently
introduced new boot preparation capabilities have been tested. New
boot preparation options for GRUB2 were added.
- Fri May 31 2013 patch release libburn-1.3.0.pl01:
cdrskin -msinfo on DVD and BD reported as old session start the same
number as the next writable address.
Regression introduced by version 1.2.8.
- Fri Aug 07 2013 release 1.3.2:
cdrskin has aquired the capability to copy audio tracks to .wav files.
It can extract CD-TEXT in a form that is readable for humans and for
cdrskin itself. Several small bugs were fixed in xorriso. Its capabilities
to serve frontend programs in dialog mode have been improved.
------------------------------------------------------------------------------

View File

@ -4,9 +4,9 @@
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org but also published via:
http://scdbackup.sourceforge.net/cdrskin_eng.html
http://scdbackup.sourceforge.net/cdrskin-1.2.3.tar.gz
http://scdbackup.sourceforge.net/cdrskin-1.3.2.tar.gz
Copyright (C) 2006-2012 Thomas Schmitt, provided under GPL version 2 or later.
Copyright (C) 2006-2013 Thomas Schmitt, provided under GPL version 2 or later.
------------------------------------------------------------------------------
@ -26,10 +26,10 @@ By using this software you agree to the disclaimer at the end of this text
Compilation, First Glimpse, Installation
Obtain cdrskin-1.2.3.tar.gz, take it to a directory of your choice and do:
Obtain cdrskin-1.3.2.tar.gz, take it to a directory of your choice and do:
tar xzf cdrskin-1.2.3.tar.gz
cd cdrskin-1.2.3
tar xzf cdrskin-1.3.2.tar.gz
cd cdrskin-1.3.2
Within that directory execute:
@ -191,6 +191,11 @@ See below "Audio CD" for specifications.
cdrskin -v dev=0,1,0 blank=fast -eject speed=48 -sao \
-audio -swab track0[1-5].cd /path/to/track6.wav
Extract audio tracks and CD-TEXT from CD into directory /home/me/my_cd:
mkdir /home/me/my_cd
cdrskin -v dev=/dev/sr0 extract_audio_to=/home/me/my_cd \
cdtext_to_v07t=/home/me/my_cd/cdtext.v07t
Restrictions
@ -576,7 +581,7 @@ contributions in a due way.
Based on and sub project of:
libburnia-project.org
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006-2012 Mario Danic, Thomas Schmitt
Copyright (C) 2006-2013 Mario Danic, Thomas Schmitt
libburnia-project.org is inspired by and in other components still containing
parts of

View File

@ -38,7 +38,7 @@ original="./libburn_svn_release.tgz"
# My changes are in $changes , mainly in $changes/cdrskin
changes="./libburn-release"
skin_release="1.2.2"
skin_release="1.3.2"
patch_level=""
# patch_level=".pl00"
skin_rev="$skin_release""$patch_level"

View File

@ -38,7 +38,7 @@ original="./libburn_svn.tgz"
# My changes are in $changes , mainly in $changes/cdrskin
changes="./libburn-develop"
skin_release="1.2.3"
skin_release="1.3.3"
patch_level=""
skin_rev="$skin_release""$patch_level"

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH CDRSKIN 1 "Version 1.2.3, Jan 13, 2012"
.TH CDRSKIN 1 "Version 1.3.2, Aug 07, 2013"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@ -37,7 +37,7 @@ Blanking of CD-RW and DVD-RW.
.br
Formatting of DVD-RW, DVD+RW, DVD-RAM, BD.
.br
Burning of data or audio tracks to CD,
Burning of data tracks or audio tracks with CD-TEXT to CD,
.br
either in versatile Track at Once mode (TAO)
.br
@ -55,6 +55,8 @@ on overwriteable DVD+RW, DVD-RW, DVD-RAM, BD-RE
.br
or on data file or block device.
.br
Extraction of audio tracks and CD-TEXT to hard disk files.
.br
Bus scan, burnfree, speed options, retrieving media info, padding, fifo.
.br
See section EXAMPLES at the end of this text.
@ -994,6 +996,25 @@ the default.
This setting applies only to CD SAO writing. It overrides the track number
settings caused by options cuefile= or input_sheet_v07t=.
.TP
.BI cdtext_to_textfile= path
Extract the CD-TEXT packs from the lead-in of an audio CD and write them to
the file with the given path. If CD-TEXT can be retrieved, then this file
will be suitable for option textfile=.
.br
Not all drives can read CD-TEXT and not all audio CDs bear CD-TEXT.
It is not considered an error if no CD-TEXT is available.
.TP
.BI cdtext_to_v07t= path
Extract the CD-TEXT packs from the lead-in of an audio CD and write them
as human readable Sony Input Sheet Version 0.7T to the file with the
given path. If CD-TEXT can be retrieved, then this file
will be suitable for option input_sheet_v07t=.
.br
If the given path is "-", then the result is printed to standard output.
.br
Not all drives can read CD-TEXT and not all audio CDs bear CD-TEXT.
It is not considered an error if no CD-TEXT is available.
.TP
.BI \--demand_a_drive
Exit with a nonzero value if no drive can be found during a bus scan.
.TP
@ -1049,7 +1070,6 @@ media dependend transaction size. With DVD-RAM, BD-RE, DVD+RW this is 2k, with
overwriteable DVD-RW it is 32k.
.TP
.BI dvd_obs= default|32k|64k
Linux specific:
Set the number of bytes to be transmitted with each write operation to DVD
or BD media. With most write types, tracks get padded up to the next multiple
of this write size (see option --obs_pad).
@ -1057,6 +1077,32 @@ A number of 64 KB may improve throughput with systems
which show latency problems. The default depends on media type, option
stream_recording=, and on compile time options.
.TP
.BI extract_audio_to= directory_path
Extract tracks from an audio CD as separate WAVE audio files into the
given directory.
This directory has to already exist, but none of the track files may exist.
This option will rather fail than overwrite an existing file.
.br
By default all tracks of the CD are extracted to files with names
trackNN.wav, where NN is the track number from 01 to at most 99.
.TP
.BI extract_basename= name
Set a filename which shall be used by extract_audio_to= instead of the default
name "track".
.TP
.BI --extract_dap
Enable Digital Audio Play flaw obscuring mechanisms
like audio data mute and interpolate.
.TP
.BI extract_tracks= number[,number[,...]]
Set a list of track numbers to define which tracks shall be extracted
by extract_audio_to=.
If no extract_tracks= is given, then all audio tracks get extracted.
It is permissible to have more than one extract_tracks= option in order
to split a long list into shorter pieces.
.br
The lowest permissible track number is 1, the highest is 99.
.TP
.BI fallback_program= command
Set a command name to be executed if cdrskin encounters a known cdrecord
option which it does not yet support. If a non-empty command is given with
@ -1140,7 +1186,15 @@ growisofs -dvd-compat is roughly equivalent to cdrskin without option -multi.
.BI input_sheet_v07t= path
Read CD-TEXT definitions from a Sony Input Sheet version 0.7T. Up to eight
or seven such sheets can be read by multiple input_sheet_v07t= options.
Each will define a CD-TEXT language block.
Each will define one CD-TEXT language block.
.br
The first line of a sheet file decides whether more than one sheet
may be defined by the file. If it is
.br
Input Sheet Version = 0.7T
.br
then each further line with that text switches to the next sheet for the next block.
If it is not, then all definitions apply to a single block.
.br
The information in such a sheet is given by text lines of the following form:
.br
@ -1243,14 +1297,45 @@ 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
option which ends by "=". The list is ended by an empty line.
.TP
.BI \--list_speeds
Put out a list of speed values as reported by the output drive with
the loaded medium. This does not necessarily mean that the medium is writable
or that these speeds are actually achievable. Especially the
lists reported with empty drive or with ROM media obviously advertise
speeds for other media.
.br
It is not mandatory to use speed values out of the listed range.
The drive is supposed to choose a safe speed that is as near to the desired
speed as possible.
.br
At the end of the list, "Write speed L" and "Write speed H"
are the best guesses for lower and upper speed limit.
"Write speed l" and "Write speed h" may appear only with CD
and eventually override the list of other speed offers.
.br
Only if the drive reports contradicting speed information there will appear
"Write speed 0" or "Write speed-1", which tell the outcome of speed selection
by options speed=0 resp. speed=-1, if it deviates from "Write speed L"
resp. "Write speed H".
.TP
.BI \--long_toc
Like option -toc but marking each session start by a line "first: X last: Y"
and each session end by "track:lout ...".
.TP
.BI \--no_load
When aquiring the optical drive, do not try to load its tray. This yields the
same behavior for desktop drives with tray loader as is shown by laptop drives
which usually lack a motorized tray loader.
.TP
.BI \--no_rc
Only if used as first command line argument this option prevents reading and
interpretation of eventual startup files. See section FILES below.
.TP
.BI \--pacifier_with_newline
Adds a newline character to each pacifier line that would elsewise be
overwritten by the next pacifier line. Such lines are emitted during a
run of writing, formatting, or blanking if option -v is given.
.TP
.BI \--prodvd_cli_compatible
Activates behavior modifications with some DVD situations which bring cdrskin
nearer to the behavior of cdrecord-ProDVD:
@ -1313,6 +1398,17 @@ 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 textfile_to_v07t= path
Read a CD-TEXT pack file (e.g. cdtext.dat from a run with -v -v -toc)
and print its content in the human readable format that is described
with option input_sheet_v07t=.
.br
The program run ends immediately thereafter.
No drive scan will happen and no drive will be aquired.
.br
To avoid the cdrskin start message in the output, run:
cdrskin textfile_to_v07t=cdtext.dat | grep -v '^cdrskin'
.TP
.BI --two_channel
Indicate for subsequent tracks that they were mastered with two channels.
.TP
@ -1551,7 +1647,7 @@ cdrskin -v dev=/dev/sr0 blank=deformat_sequential
.br
cdrskin -v dev=/dev/hdc speed=12 fs=8m \\
.br
blank=as_needed -eject padsize=300k my_image.iso
blank=as_needed -eject padsize=300k my_image.iso
.SS
.B Write compressed afio archive on-the-fly (not possible with minimally blanked DVD-RW or DVD-R DL):
.br
@ -1559,7 +1655,7 @@ find . | afio -oZ - | \\
.br
cdrskin -v dev=0,1,0 fs=32m speed=8 \\
.br
blank=as_needed padsize=300k -
blank=as_needed padsize=300k -
.SS
.B Write multi-session to the same CD, DVD-R[W], DVD+R[/DL], or BD-R:
.br
@ -1581,16 +1677,25 @@ mkisofs ... -C "$c_values" ...
.br
x=$(cdrskin dev=/dev/sr0 -multi \\
.br
--tell_media_space 2>/dev/null)
--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 and CD-TEXT to CD:
.br
cdrskin -v dev=ATA:1,0,0 speed=48 -sao \\
.br
track1.wav track2.au -audio -swab track3.raw
input_sheet_v07t=cdtext.v07t \\
.br
track1.wav track2.au -audio -swab track3.raw
.SS
.B Extract audio tracks and CD-TEXT from CD into directory /home/me/my_cd:
.br
mkdir /home/me/my_cd
.br
cdrskin -v dev=/dev/sr0 extract_audio_to=/home/me/my_cd \\
.br
cdtext_to_v07t=/home/me/my_cd/cdtext.v07t
.SH FILES
.SS
Startup files:

File diff suppressed because it is too large Load Diff

View File

@ -65,7 +65,7 @@ connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
GPL software included:<BR>
</H2>
<DL>
<DT>libburn-1.2.2</DT>
<DT>libburn-1.3.2</DT>
<DD>(founded by Derek Foreman and Ben Jansens,
developed and maintained since August 2006 by
Thomas Schmitt from team of libburnia-project.org)
@ -200,13 +200,13 @@ Standalone ISO 9660 multi-session CD/DVD/BD tool
<P>
<DL>
<DT>Download as source code (see README):</DT>
<DD><A HREF="cdrskin-1.2.2.tar.gz">cdrskin-1.2.2.tar.gz</A>
(930 KB).
<DD><A HREF="cdrskin-1.3.2.tar.gz">cdrskin-1.3.2.tar.gz</A>
(950 KB).
</DD>
<DD><A HREF="cdrskin-1.2.2.tar.gz.sig">cdrskin-1.2.2.tar.gz.sig</A></DD>
<DD><A HREF="cdrskin-1.3.2.tar.gz.sig">cdrskin-1.3.2.tar.gz.sig</A></DD>
<DD>
(detached GPG signature for verification by
<KBD>gpg --verify cdrskin-1.2.2.tar.gz.sig cdrskin-1.2.2.tar.gz</KBD>
<KBD>gpg --verify cdrskin-1.3.2.tar.gz.sig cdrskin-1.3.2.tar.gz</KBD>
<BR>
after <KBD>gpg --keyserver keys.gnupg.net --recv-keys ABC0A854</KBD>).
</DD>
@ -257,17 +257,40 @@ cdrskin_0.4.2.pl00-x86-suse9_0-static.tar.gz</A>, (310 KB), -static compiled,
<HR>
<P>
Enhancements towards previous stable version cdrskin-1.2.0:
Enhancements towards previous stable version cdrskin-1.3.0:
<UL>
<LI>Small internal refinements</LI>
<LI>
New option textfile_to_v07t=
</LI>
<LI>
New options cdtext_to_textfile= and cdtext_to_v07t=
</LI>
<LI>
New options extract_audio_to= , extract_tracks= , extract_basename= ,
--extract_dap
</LI>
<LI>
Improved granularity of SCSI log time measurement, now with timestamp
</LI>
<LI>
New cdrskin option --pacifier_with_newline
</LI>
<!--
<LI>none</LI>
-->
</UL>
Bug fixes towards cdrskin-1.2.0:
Bug fixes towards cdrskin-1.3.0:
<UL>
<LI>none</LI>
<LI>
cdrskin -msinfo on DVD and BD reported
old session start = next writable address.
Regression introduced by version 1.2.8.
(Also fixed by patch release 1.3.0.pl01 in may 2013.)
</LI>
<LI>
The signal handler aborted on SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU
</LI>
<!--
<LI>none</LI>
-->
@ -277,8 +300,8 @@ Bug fixes towards cdrskin-1.2.0:
<P>
<DL>
<DT><H3>Development snapshot, version 1.2.3 :</H3></DT>
<DD>Enhancements towards current stable version 1.2.2:
<DT><H3>Development snapshot, version 1.3.3 :</H3></DT>
<DD>Enhancements towards current stable version 1.3.2:
<UL>
<LI>none yet</LI>
<!--
@ -288,19 +311,20 @@ Bug fixes towards cdrskin-1.2.0:
</UL>
</DD>
<DD>Bug fixes towards cdrskin-1.2.0:
<DD>Bug fixes towards cdrskin-1.3.2:
<UL>
<LI>none yet</LI>
<!--
<LI>none yet</LI>
-->
</UL>
</DD>
<DD>&nbsp;</DD>
<DD><A HREF="README_cdrskin_devel">README 1.2.2</A>
<DD><A HREF="cdrskin__help_devel">cdrskin-1.2.2 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin-1.2.2 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.2.2)</A></DD>
<DD><A HREF="README_cdrskin_devel">README 1.3.3</A>
<DD><A HREF="cdrskin__help_devel">cdrskin-1.3.3 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin-1.3.3 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.3.3)</A></DD>
<DD>&nbsp;</DD>
<DT>Maintainers of cdrskin unstable packages please use SVN of
<A HREF="http://libburnia-project.org"> libburnia-project.org</A></DT>
@ -320,8 +344,8 @@ admins with full system souvereignty.</DT>
<A HREF="README_cdrskin_devel">upcoming README</A> ):
</DD>
<DD>
<A HREF="cdrskin-1.2.3.tar.gz">cdrskin-1.2.3.tar.gz</A>
(930 KB).
<A HREF="cdrskin-1.3.3.tar.gz">cdrskin-1.3.3.tar.gz</A>
(950 KB).
</DD>
<!-- This is not offered any more since spring 2008
@ -517,11 +541,15 @@ and by <A HREF="http://sourceforge.net">sourceforge.net</A><BR>
<A href="http://sourceforge.net">
<IMG src="sflogo-88-1.png" BORDER="0" ALT="SourceForge Logo"></A>
<!-- on sourceforge use : <IMG src="http://sourceforge.net/sflogo.php?group_id=16010" width="88" height="31" border="0" alt="SourceForge Logo"></A> -->
<!--
<P>
Enjoying a FreeBSD shell account with the opportunity to
build and install cdrskin at<BR>
<A HREF="http://www.en.free-shells.com.ar">free-shells.com.ar</A>
</P>
-->
</FONT></CENTER>
<HR>
<DL>

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2012.07.08.103007"
#define Cdrskin_timestamP "2013.08.07.093001"

View File

@ -11262,29 +11262,898 @@ Made number transition to 1.2.3
+ cdrskin/add_ts_changes_to_libburn_1_2_3
Updated cdrskin tarball generator
02 Apr 2012 []
02 Apr 2012 [4693]
ChangeLog
cdrskin/changelog.txt
Updated change log
02 Apr 2012 [4694]
svn move -m libburn release 1.2.2 is ready
http://svn.libburnia-project.org/libburn/branches/1.2.2
http://svn.libburnia-project.org/libburn/tags/1.2.2
------------------------------------ cycle - cdrskin-1.2.3 - 2012.04.02.172347
[]
2012.04.04.100754 [4698]
cdrskin/cdrskin.c
Bug fix: cdrskin SIGSEGV if track source was added when no drive was available
2012.04.04.183902 [4699]
libburn/crc.c
Reacted on warning of Debian buildd
2012.04.08.112703 [4701]
libburn/libburn.h
libburn/options.h
libburn/options.c
libburn/write.c
libburn/libdax_msgs.h
libburn/libburn.ver
New API call burn_write_opts_set_obs_pad()
2012.04.08.112825 [4702]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
New option --obs_pad
2012.04.10.181239 [4704]
cdrskin/cdrskin.c
Now recognizing long options with double dash
13 Apr 2012 [4706]
cdrskin/cdrskin.1
Small correction in cdrskin man page
2012.04.13.202654 [4707]
configure.ac
libburn/libburn.h
libburn/options.c
cdrskin/cdrskin.1
Compile time option for obs_pad
18 Apr 2012 [4708]
doc/cdtext.txt
Augmented CD-TEXT documentation by a complete example of packs
18 Apr 2012 [4709]
doc/cookbook.txt
Small change in cookbook.txt about DVD-R DL
2012.05.08.080449 [4731]
libburn/crc.c
Corrections of CRC-32 algorithm for 32 bit systems. Mentioning of start value.
2012.05.30.202249 [4744]
libburn/write.c
libburn/mmc.c
doc/cookbook.txt
Bug fix: CD SAO sessions with data tracks started by an audio pause
2012.06.17.173420 [4762]
libburn/sector.c
Improved reported number of missing bytes in case of track source shortage
2012.07.08.103007 [4778]
libburn/structure.c
Bug fix: CD tracks were perceived 2 sectors too short. Nice with TAO, bad with SAO.
20 Jul 2012 [4794]
svn copy -m "Branching for libburn release 1.2.4"
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/1.2.4
2012.07.20.113001 [4795]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.2.4
20 Jul 2012 [4796]
- cdrskin/add_ts_changes_to_libburn_1_2_2
- cdrskin/add_ts_changes_to_libburn_1_2_3
+ cdrskin/add_ts_changes_to_libburn_1_2_4
+ cdrskin/add_ts_changes_to_libburn_1_2_5
Updated cdrskin tarball generator
20 Jul 2012 []
ChangeLog
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.2.3 -
----------------------------------- release - libburn-1.2.4 - 2012.07.20.113001
* New API call burn_write_opts_set_obs_pad(), ./configure --enable-dvd-obs-pad
* New cdrskin option --obs_pad
* Bug fix: CD SAO sessions with data tracks started by an audio pause
* Bug fix: CD tracks were perceived 2 sectors too short. Nice with TAO, bad with SAO.
* Bug fix: cdrskin SIGSEGV if track source was added when no drive was available
[]
2012.07.20.164346 [4801]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.2.5
20 Jul 2012 [4802]
- cdrskin/add_ts_changes_to_libburn_1_2_2
- cdrskin/add_ts_changes_to_libburn_1_2_3
+ cdrskin/add_ts_changes_to_libburn_1_2_4
+ cdrskin/add_ts_changes_to_libburn_1_2_5
Updated cdrskin tarball generator
20 Jul 2012 [4803]
ChangeLog
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.2.3 -
20 Jul 2012 [4806]
svn move -m libburn release 1.2.4 is ready
http://svn.libburnia-project.org/libburn/branches/1.2.4
http://svn.libburnia-project.org/libburn/tags/1.2.4
------------------------------------ cycle - cdrskin-1.2.5 - 2012.07.20.164346
2012.07.26.122909 [4811]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
New option --no_load
26 Jul 2012 [4813]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.2.5 - 2012.07.26.195346
* New option --no_load
1 Aug 2012 [4814]
doc/cdtext.txt
Small grammatical correction in CD-TEXT documentaion
2012.08.28.161949 [4820]
libburn/drive.c
libburn/util.h
libburn/util.c
libburn/sg-freebsd.c
Removed buggy burn_strdup() and burn_strndup(). Thanks to Rich Felker.
2012.09.13.085623 [4828]
libburn/mmc.c
Bug fix: Speed setting had no effect on BD media. Thanks to Dennis Vshivkov.
13 Sep 2012 [4829]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.2.5 - 2012.09.13.090310
Bug fix: Speed setting had no effect on BD media. Thanks to Dennis Vshivkov.
2012.10.02.134821 [4841]
configure.ac
Configuration for use of libcdio on cygwin. Thanks Rocky Bernstein.
2012.10.24.095725 [4850]
libburn/async.c
Reporting (still cryptic) details about refusal to blank
2012.10.25.123837 [4852]
libburn/libburn.h
libburn/transport.h
libburn/read.c
libburn/spc.c
libburn/mmc.c
New flag bit4 of burn_read_data() for better handling of TAO end blocks
2012.10.25.173408 [4854]
libburn/read.c
Corrected error handling which was spoiled by rev 4852
2012.11.18.184006 [4858]
libburn/libburn.h
libburn/read.c
libburn/spc.c
libburn/mmc.h
libburn/mmc.c
Preserving an immature sketch of media quality scanning
2012.11.18.184114 [4859]
cdrskin/cdrskin.c
Preserving an immature sketch of media quality scanning
2012.11.24.181347 [4860]
libburn/mmc.c
Better reaction on non-plausible ATIP info from CD-ROM
2012.11.29.111344 [4865]
libburn/libburn.h
libburn/transport.h
libburn/libdax_msgs.h
libburn/options.h
libburn/options.c
libburn/toc.c
libburn/read.c
libburn/spc.c
libburn/mmc.h
libburn/sg-freebsd.c
libburn/libburn.ver
Beginning to create new API call burn_read_audio
2012.11.29.112506 [4866]
libburn/mmc.c
Forgot mcc.c with the previous commit
2012.11.29.112605 [4867]
libburn/libdax_msgs.h
libburn/mmc.c
Let mmc_format_unit issue failure message on SCSI error
2012.11.30.193330 [4868]
libburn/libburn.h
libburn/read.c
New API call burn_read_audio
2012.11.30.193415 [4869]
test/telltoc.c
Made telltoc ready for reading CD audio
2012.12.14.145101 [4878]
libburn/libburn.h
libburn/init.c
libburn/libdax_msgs.h
libburn/libdax_msgs.c
libburn/libburn.ver
New API call burn_list_sev_texts()
14 Dec 2012 [4879]
doc/cookbook.txt
Small change to burn cookbook about ISO multi-session emulation
08 Jan 2013 [4935]
svn copy -m "Branching for libburn release 1.2.6"
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/1.2.6
2013.01.08.090001 [4936]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.2.6
08 Jan 2013 [4937]
- cdrskin/add_ts_changes_to_libburn_1_2_4
- cdrskin/add_ts_changes_to_libburn_1_2_5
+ cdrskin/add_ts_changes_to_libburn_1_2_6
+ cdrskin/add_ts_changes_to_libburn_1_2_7
Updated cdrskin tarball generator
08 Jan 2013 [4938]
ChangeLog
cdrskin/changelog.txt
Updated change log
----------------------------------- release - libburn-1.2.6 - 2013.01.08.090001
Bug fix: Speed setting had no effect on BD media. Thanks to Dennis Vshivkov.
* New API call burn_read_audio()
* New API call burn_list_sev_texts()
* New cdrskin option --no_load
2013.01.08.144634 []
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.2.7
08 Jan 2013 [4947]
- cdrskin/add_ts_changes_to_libburn_1_2_4
- cdrskin/add_ts_changes_to_libburn_1_2_5
+ cdrskin/add_ts_changes_to_libburn_1_2_6
+ cdrskin/add_ts_changes_to_libburn_1_2_7
Updated cdrskin tarball generator
08 Jan 2013 [4948]
ChangeLog
cdrskin/changelog.txt
Updated change log
08 Jan 2013 [4949]
svn move -m libburn release 1.2.6 is ready
http://svn.libburnia-project.org/libburn/branches/1.2.6
http://svn.libburnia-project.org/libburn/tags/1.2.6
------------------------------------ cycle - cdrskin-1.2.7 - 2013.01.08.150303
2013.01.12.195030 [4955]
libburn/libburn.h
libburn/transport.h
libburn/structure.h
libburn/structure.c
libburn/mmc.c
libburn/libburn.ver
New API call burn_disc_get_incomplete_sessions(), new burn_toc_entry.track_status_bits
2013.01.12.195311 [4956]
cdrskin/cdrskin.c
Made use of new API features to handle incomplete sessions
2013.01.15.104005 [4961]
libburn/structure.c
Bug fix: All CD tracks were reported with the sizes of the tracks in the first session. Regression introduced with version 1.2.0 (rev 4552).
16 Jan 2013 [4965]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
2013.01.16.181124 [4966]
cdrskin/cdrskin.c
Updated cdrskin copyright message
------------------------------------ cycle - cdrskin-1.2.7 - 2013.01.16.181124
* New API call burn_disc_get_incomplete_sessions()
* New burn_toc_entry component .track_status_bits
* -toc and -minfo now report about tracks in the incomplete session
* Bug fix: All CD tracks were reported with the sizes of the tracks in the
first session. Regression introduced with version 1.2.0 (rev 4552).
2013.02.26.080127 [4972]
libburn/drive.c
Corrected wrong use of sizeof
2013.03.04.211258 [4975]
libburn/mmc.c
Bug fix: On some drives the request for minimum speed yielded maximum speed
2013.03.04.232436 [4976]
libburn/mmc.c
Corrected previous bug fix which caused speed descriptors to appear twice
2013.03.05.124217 [4977]
libburn/mmc.c
Still correcting the bug fix of rev 4975
2013.03.05.124508 [4978]
cdrskin/cdrskin.c
New cdrskin option --list_speeds
05 Mar 2013 [4979]
cdrskin/cdrskin.1
Mentioned --list_speeds in manual page
05 Mar 2013 [4980]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
2013.03.05.185356 [4981]
libburn/mmc.c
Always considering mode page 2A when looking for min and max speed
2013.03.05.185440 [4982]
cdrskin/cdrskin.c
Always considering mode page 2A when looking for min and max speed
------------------------------------ cycle - cdrskin-1.2.7 - 2013.03.05.185655
* Bug fix: On some drives the request for minimum speed yielded maximum speed
* New cdrskin option --list_speeds
2013.03.12.114739 [4987]
libburn/write.c
Avoiding SYNCHRONIZE CACHE if DVD track preparation has failed
18 Mar 2013 [4994]
svn copy -m "Branching for libburn release 1.2.8"
http://svn.libburnia-project.org/libburn/trunk
http://svn.libburnia-project.org/libburn/branches/1.2.8
2013.03.18.080001 [4997]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.2.8
18 Mar 2013 [4998]
- cdrskin/add_ts_changes_to_libburn_1_2_6
- cdrskin/add_ts_changes_to_libburn_1_2_7
+ cdrskin/add_ts_changes_to_libburn_1_2_8
+ cdrskin/add_ts_changes_to_libburn_1_2_9
Updated cdrskin tarball generator
18 Mar 2013 [4999]
ChangeLog
cdrskin/changelog.txt
Updated change log
----------------------------------- release - libburn-1.2.8 - 2013.03.18.080001
* -toc and -minfo now report about tracks in the incomplete session
* New API call burn_disc_get_incomplete_sessions()
* New burn_toc_entry component .track_status_bits
* Bug fix: All CD tracks were reported with the sizes of the tracks in the
first session. Regression introduced with version 1.2.0 (rev 4552).
* Bug fix: On some drives the request for minimum speed yielded maximum speed
* New cdrskin option --list_speeds
2013.03.18.210519 [5007]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.2.9
18 Mar 2013 [4996]
- cdrskin/add_ts_changes_to_libburn_1_2_6
- cdrskin/add_ts_changes_to_libburn_1_2_7
+ cdrskin/add_ts_changes_to_libburn_1_2_8
+ cdrskin/add_ts_changes_to_libburn_1_2_9
Updated cdrskin tarball generator
18 Mar 2013 [5008]
ChangeLog
cdrskin/changelog.txt
Updated change log
18 Mar 2013 [5009]
svn move -m libburn release 1.2.8 is ready
http://svn.libburnia-project.org/libburn/branches/1.2.8
http://svn.libburnia-project.org/libburn/tags/1.2.8
------------------------------------ cycle - cdrskin-1.2.9 - 2013.03.18.211611
2013.04.01.121637 [5013]
cdrskin/cdrskin.c
Forgot to increment cdrskin version number
2013.04.01.121851 [5014]
libburn/mmc.c
libburn/libdax_msgs.h
Bug fix: Formatting of BD-RE used certification regardless of drive capabilities
01 Apr 2013 [5015]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.2.9 - 2013.04.01.125750
Bug fix: Formatting of BD-RE used certification regardless of drive capabilities
2013.05.10.064018 [5034]
cdrskin/cdrskin.c
Bug fix: DVD+R with damaged TOC were reported by -minfo with wrong end address
2013.05.10.072542 [5035]
libburn/libdax_msgs.h
Added new item to list of error codes
10 May 2013 [5036]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.2.9 - 2013.05.10.073212
Bug fix: DVD+R with damaged TOC were reported by -minfo with wrong end address
17 May 2013 [5044]
svn copy -m Branching for libburn release 1.3.0
2013.05.17.090001 [5045]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.3.0
17 May 2013 [5046]
- cdrskin/add_ts_changes_to_libburn_1_2_8
- cdrskin/add_ts_changes_to_libburn_1_2_9
+ cdrskin/add_ts_changes_to_libburn_1_3_0
+ cdrskin/add_ts_changes_to_libburn_1_3_1
Updated cdrskin tarball generator
17 May 2013 [5047]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
----------------------------------- release - libburn-1.3.0 - 2013.05.17.090001
* Bug fix: Full formatting of BD-RE used certification regardless of drive
capabilities
* Bug fix: DVD+R with damaged TOC were reported by -minfo with wrong end
address
17 May 2013 [5051]
- cdrskin/add_ts_changes_to_libburn_1_2_8
- cdrskin/add_ts_changes_to_libburn_1_2_9
+ cdrskin/add_ts_changes_to_libburn_1_3_0
+ cdrskin/add_ts_changes_to_libburn_1_3_1
Updated cdrskin tarball generator
2013.05.17.180032 [5052]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.3.1
17 May 2013 [5053]
ChangeLog
cdrskin/changelog.txt
Updated change log
17 May 2013 [5054]
svn move -m libburn release 1.3.0 is ready
------------------------------------ cycle - cdrskin-1.3.1 - 2013.05.17.181442
2013.05.19.114643 [5059]
libburn/libburn.h
libburn/cdtext.c
doc/cdtext.txt
libburn/libburn.ver
New API call burn_make_input_sheet_v07t()
2013.05.19.114854 [5060]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
New option textfile_to_v07t=
2013.05.19.154838 [5061]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
New options cdtext_to_textfile= and cdtext_to_v07t=
2013.05.20.104814 [5062]
libburn/libburn.h
libburn/cdtext.c
libburn/libdax_msgs.h
API call burn_session_input_sheet_v07t(): read multiple blocks from same file
2013.05.20.110128 [5063]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
Allowed option input_sheet_v07t= to read multiple blocks from same file
2013.05.20.124448 [5064]
libburn/cdtext.c
Bug fixes with new API call burn_make_input_sheet_v07t()
2013.05.20.124520 [5065]
cdrskin/cdrskin.c
Closed memory leak introduced by rev 5063
20 May 2013 [5066]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.3.1 - 2013.05.20.141737
* New API call burn_make_input_sheet_v07t()
* New option textfile_to_v07t=
* New options cdtext_to_textfile= and cdtext_to_v07t=
* API call burn_session_input_sheet_v07t(): read multiple blocks from same file
2013.05.21.081819 [5067]
cdrskin/cdrskin.c
Defaulting -sao -multi to -tao -multi if -sao -multi is not possible
2013.05.23.154249 [5068]
libburn/libburn.h
libburn/file.c
libburn/util.h
libburn/util.c
libburn/libdax_msgs.h
libburn/libdax_msgs.c
libburn/libburn.ver
New API calls burn_drive_extract_audio(), burn_drive_extract_audio_track()
2013.05.23.154249 [5069]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
New cdrskin options extract_audio_to= , extract_tracks= , extract_basename= , --extract_dap
23 May 2013 [5070]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.3.1 - 2013.05.23.155617
* New API calls burn_drive_extract_audio(), burn_drive_extract_audio_track()
* New cdrskin options extract_audio_to= , extract_tracks= , extract_basename= ,
--extract_dap
23 May 2013 [5071]
doc/cdtext.txt
Updated documentation about CD-TEXT
2013.05.26.185945 [5072]
cdrskin/cdrskin.c
Luring K3B into using -xa rather than -xa1
2013.05.30.133008 [5076]
cdrskin/cdrskin.c
Bug fix: cdrskin -msinfo on DVD and BD reported
old session start == next writable address.
Regression introduced by version 1.2.8 (rev 4956).
[]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.3.1 - 2013.05.30.133756
* Bug fix: cdrskin -msinfo on DVD and BD reported
old session start == next writable address.
Regression introduced by version 1.2.8 (rev 4956).
31 May 2013 [5079]
svn copy -m Branching for libburn bugfix release 1.3.0.pl01
http://svn.libburnia-project.org/libburn/tags/1.3.0
http://svn.libburnia-project.org/libburn/branches/1.3.0.pl01
2013.05.31.080001 [5080]
cdrskin/cdrskin.c
Bug fix: cdrskin -msinfo on DVD and BD reported
old session start = next writable address.
Regression introduced by version 1.2.8 (rev 4956).
31 May 2013 [5081]
README
cdrskin/README
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Mentioned bug fix and pl01
31 May 2013 [5082]
svn move -m libburn bugfix release 1.3.0.pl01 is ready
http://svn.libburnia-project.org/libburn/branches/1.3.0.pl01
http://svn.libburnia-project.org/libburn/tags/1.3.0.pl01
------------------------------ release - libburn-1.3.0.pl01 - 2013.05.31.080001
* Bug fix: cdrskin -msinfo on DVD and BD reported
old session start = next writable address.
Regression introduced by version 1.2.8 (rev 4956).
31 May 2013 [5083]
README
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Mentioned bug fix and pl01
2013.06.09.152602 [5087]
libburn/transport.h
libburn/init.h
libburn/init.c
libburn/util.h
libburn/util.c
libburn/spc.h
libburn/spc.c
libburn/sg-linux.c
libburn/sg-solaris.c
libburn/sg-libcdio.c
libburn/sg-freebsd.c
Improved granularity of SCSI log time measurement and added absolute timestamp
2013.06.09.154237 [5088]
libburn/util.c
Prepared for optional use of clock_gettime()
2013.06.09.163052 [5089]
libburn/util.c
libburn/spc.c
Some polishing of SCSI log time measurement
12 Jun 2013 [5090]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.3.1 - 2013.06.12.104457
* Improved granularity of SCSI log time measurement, now with timestamp
24 Jun 2013 [5091]
test/telltoc.c
Removed inactive test code from telltoc.c
2013.06.28.104134 [5093]
cdrskin/cdrskin.c
Making sure in cdrskin that off_t is large enough before starting libburn
2013.06.28.104316 [5094]
cdrskin/cdrskin.c
Removed an obsolete note message from cdrskin --devices
2013.07.01.155958 [5097]
libburn/libburn.h
libburn/init.c
libburn/cleanup.c
New mode bit8 with burn_set_signal_handling() to particularly ignore SIGPIPE
2013.07.08.145600 [5110]
libburn/cleanup.c
Corrected typo in a comment
2013.07.08.151826 [5111]
cdrskin/cdrskin.c
cdrskin/cdrskin.1
New option --pacifier_with_newline
2013.07.21.170714 [5112]
libburn/os-dummy.h
libburn/os-freebsd.h
libburn/os-libcdio.h
libburn/os-linux.h
libburn/os-solaris.h
Bug fix: The signal handler aborted on SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU
2013.07.29.091415 [5114]
libburn/libburn.h
Reacted on warnings of Debian build service about doxygen flaws
2013.08.04.100247 [5116]
configure.ac
libburn/write.c
cdrskin/cdrskin.1
Changed default write chunk size for BD to 64 KiB
2013.08.04.124449 [5122]
libburn/libburn.h
Reacted on advise from Helmut Grohne to avoid confusion of doxygen
04 Aug 2013 [5124]
doc/doxygen.conf.in
Update of doxygen configuration for version 1.8.4 provided by George Danchev
07 Aug 2013 [5125]
svn copy -m Branching for libburn release 1.3.2
2013.08.07.093001 [5126]
Makefile.am
configure.ac
README
libburn/libburn.h
cdrskin/cdrskin.c
cdrskin/cdrskin.1
cdrskin/README
cdrskin/compile_cdrskin.sh
cdrskin/cdrskin_timestamp.h
cdrskin/cdrskin_eng.html
Made number transition to 1.3.2
07 Aug 2013 [5127]
- cdrskin/add_ts_changes_to_libburn_1_3_0
- cdrskin/add_ts_changes_to_libburn_1_3_1
+ cdrskin/add_ts_changes_to_libburn_1_3_2
+ cdrskin/add_ts_changes_to_libburn_1_3_3
Updated cdrskin tarball generator
[]
ChangeLog
cdrskin/changelog.txt
Documented changes and release timestamp
----------------------------------- release - cdrskin-1.3.2 - 2013.08.07.093001
* Bug fix: cdrskin -msinfo on DVD and BD reported
old session start = next writable address.
Regression introduced by version 1.2.8 (rev 4956).
* Bug fix: The signal handler aborted on SIGCONT, SIGTSTP, SIGTTIN, SIGTTOU
* New API call burn_make_input_sheet_v07t()
* API call burn_session_input_sheet_v07t(): read multiple blocks from same file
* New API calls burn_drive_extract_audio(), burn_drive_extract_audio_track()
* New cdrskin option textfile_to_v07t=
* New cdrskin options cdtext_to_textfile= and cdtext_to_v07t=
* New cdrskin options extract_audio_to= , extract_tracks= , extract_basename= ,
--extract_dap
* New cdrskin option --pacifier_with_newline
* Improved granularity of SCSI log time measurement, now with timestamp
* Optional "make doc" now demands doxygen 1.8.4
[]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.3.3 -
[]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.3.3 -
[]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.3.3 -
**********************************************************************
@ -11297,6 +12166,7 @@ Important: When adding a public API function then add its name to file
===============================================================================
CD-TEXT:
- with SAO
- libburn:

View File

@ -1,14 +1,14 @@
#!/bin/sh
# compile_cdrskin.sh
# Copyright 2005 - 2012 Thomas Schmitt, scdbackup@gmx.net, GPL
# Copyright 2005 - 2013 Thomas Schmitt, scdbackup@gmx.net, GPL v2 or later
# to be executed within ./libburn-* resp ./cdrskin-*
debug_opts="-O2"
def_opts=
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
fifo_opts=""
libvers="-DCdrskin_libburn_1_2_3"
libvers="-DCdrskin_libburn_1_3_2"
# To be used if Makefile.am uses libburn_libburn_la_CFLAGS
# burn="libburn/libburn_libburn_la-"
@ -41,15 +41,15 @@ do
elif test "$i" = "-compile_dewav"
then
compile_dewav=1
elif test "$i" = "-libburn_1_2_2"
elif test "$i" = "-libburn_1_3_2"
then
libvers="-DCdrskin_libburn_1_2_2"
libvers="-DCdrskin_libburn_1_3_2"
libdax_audioxtr_o="$burn"libdax_audioxtr.o
libdax_msgs_o="$burn"libdax_msgs.o
cleanup_src_or_obj="$burn"cleanup.o
elif test "$i" = "-libburn_svn"
then
libvers="-DCdrskin_libburn_1_2_3"
libvers="-DCdrskin_libburn_1_3_3"
libdax_audioxtr_o="$burn"libdax_audioxtr.o
libdax_msgs_o="$burn"libdax_msgs.o
cleanup_src_or_obj="$burn"cleanup.o
@ -99,7 +99,7 @@ do
echo "Options:"
echo " -compile_cdrfifo compile program cdrskin/cdrfifo."
echo " -compile_dewav compile program test/dewav without libburn."
echo " -libburn_1_2_2 set macro to match libburn-1.2.2"
echo " -libburn_1_3_2 set macro to match libburn-1.3.2"
echo " -libburn_svn set macro to match current libburn-SVN."
echo " -dvd_obs_64k 64 KB default size for DVD/BD writing."
echo " -use_libcdio link with -lcdio because libburn uses it."

View File

@ -1,4 +1,4 @@
AC_INIT([libburn], [1.2.3], [http://libburnia-project.org])
AC_INIT([libburn], [1.3.2], [http://libburnia-project.org])
AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h])
@ -97,6 +97,11 @@ dnl 1.1.6 = libburn.so.4.69.0
dnl 1.1.8 = libburn.so.4.71.0
dnl 1.2.0 = libburn.so.4.73.0
dnl 1.2.2 = libburn.so.4.75.0
dnl 1.2.4 = libburn.so.4.77.0
dnl 1.2.6 = libburn.so.4.79.0
dnl 1.2.8 = libburn.so.4.81.0
dnl 1.3.0 = libburn.so.4.83.0
dnl 1.3.2 = libburn.so.4.85.0
dnl
dnl So LT_CURRENT, LT_REVISION and LT_AGE get set directly here.
dnl SONAME of the emerging library is LT_CURRENT - LT_AGE.
@ -121,8 +126,8 @@ dnl If BURN_*_VERSION changes, be sure to change AC_INIT above to match.
dnl
dnl As said: Only copies. Original in libburn/libburn.h : burn_header_version_*
BURN_MAJOR_VERSION=1
BURN_MINOR_VERSION=2
BURN_MICRO_VERSION=3
BURN_MINOR_VERSION=3
BURN_MICRO_VERSION=2
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
AC_SUBST(BURN_MAJOR_VERSION)
@ -133,14 +138,14 @@ AC_SUBST(BURN_VERSION)
dnl Libtool versioning
LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
dnl
dnl ### This is the release version libburn-1.2.2
dnl This is the development version after above release version
dnl This is the release version libburn-1.3.2
dnl ### This is the development version after above release version
dnl LT_CURRENT++, LT_AGE++ has not yet happened.
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
dnl
dnl SONAME = 79 - 75 = 4 . Linux library name = libburn.so.4.75.0
LT_CURRENT=79
LT_AGE=75
dnl SONAME = 89 - 85 = 4 . Linux library name = libburn.so.4.85.0
LT_CURRENT=89
LT_AGE=85
LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
@ -217,14 +222,14 @@ CFLAGS="$LIBBURN_O_DIRECT_DEF $CFLAGS"
dnl ts A91116
AC_ARG_ENABLE(dvd-obs-64k,
[ --enable-dvd-obs-64k 64 KB default size for DVD/BD writing, default=no],
[ --enable-dvd-obs-64k 64 KB default size for DVD writing, default=no],
, enable_dvd_obs_64k=no)
if test x$enable_dvd_obs_64k = xyes; then
LIBBURN_DVD_OBS_64K="-DLibburn_dvd_obs_default_64K"
echo "enabled write size default 64 KB on DVD and BD"
echo "enabled write size default 64 KB on DVD"
else
LIBBURN_DVD_OBS_64K=
echo "disabled write size default 64 KB on DVD and BD"
echo "disabled write size default 64 KB on DVD"
fi
CFLAGS="$LIBBURN_DVD_OBS_64K $CFLAGS"
@ -241,10 +246,24 @@ else
fi
CFLAGS="$LIBBURN_DVD_OBS_PAD $CFLAGS"
dnl ts A91218
dnl ts A91218 - B21002
case $host_os in
cygwin*|mingw*)
default_libcdio=yes
;;
*)
default_libcdio=no
;;
esac
# Check for proper library versions if this is desired.
# (It fails too often on too many systems.)
AC_ARG_ENABLE(pkg-check-modules,
[ --enable-pkg-check-modules Enable pkg-config check for libcdio , default=no],
, enable_pkg_check_modules=no)
AC_ARG_ENABLE(libcdio,
[ --enable-libcdio Enable EXPERIMENTAL use of libcdio as system adapter, default=no],
, enable_libcdio=no)
[ --enable-libcdio Enable use of libcdio as system adapter, default=no (except on MSWindows)],
, enable_libcdio=$default_libcdio)
PKG_PROG_PKG_CONFIG
if test x$enable_libcdio = xyes; then
dnl Check whether there is libcdio-devel and libcdio-runtime.
dnl If not, erase this macro
@ -261,12 +280,15 @@ then
echo "WARNING: could not enable use of libcdio as system adapter"
fi
else
echo "enabled EXPERIMENTAL use of libcdio as system adapter"
echo "enabled use of libcdio as system adapter"
CFLAGS="$LIBCDIO_DEF $CFLAGS"
LIBCDIO_REQUIRED=0.83
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
if test x$enable_pkg_check_modules = xyes; then
LIBCDIO_REQUIRED=0.83
PKG_CHECK_MODULES(LIBCDIO, libcdio >= $LIBCDIO_REQUIRED)
else
echo "checking for LIBCDIO... skipped, no --enable-pkg-check-modules"
fi
fi
dnl ts B00704

View File

@ -180,7 +180,7 @@ the next text of the same pack type. If no text of the same type follows,
then the remaining text bytes are set to 0.
The CRC algorithm uses divisor 0x11021. The resulting 16-bit residue of the
polynomial division get inverted and written as big-endian number to bytes
polynomial division gets inverted and written as big-endian number to bytes
16 and 17 of the pack.
@ -403,7 +403,7 @@ Byte :Value Meaning
-------------------------------------------------------------------------------
Overview of libburn API calls for CD-TEXT (see libburn/libburn.h for details):
libburn can retrieve the set of text packs from a CD:
libburn can retrieve the array of text packs from a CD:
int burn_disc_get_leadin_text(struct burn_drive *d,
unsigned char **text_packs, int *num_packs,
@ -418,7 +418,7 @@ This set may be attached as array of readily formatted text packs by:
unsigned char *text_packs,
int num_packs, int flag);
The array may be read from a file by
The array of text packs may be read from a file by
int burn_cdtext_from_packfile(char *path, unsigned char **text_packs,
int *num_packs, int flag);
@ -453,6 +453,12 @@ There is a reader for Sony Input Sheet Version 0.7T:
int burn_session_input_sheet_v07t(struct burn_session *session,
char *path, int block, int flag);
and a writer which converts an array of text packs to such a Sony Input Sheet:
int burn_make_input_sheet_v07t(unsigned char *text_packs, int num_packs,
int start_tno, int track_count,
char **result, int *char_code, int flag);
CD-TEXT can be read from a CDRWIN cue sheet file which defines the tracks
of a session
@ -566,7 +572,8 @@ libburn peculiarties:
libburn may read files of the described format by
burn_session_input_sheet_v07t()
after the burn_session has been establiched and all burn_track objects have
been added.
been added. It can convert an array of CD-TEXT packs into this format by
burn_make_input_sheet_v07t()
The following purpose specifiers accept byte values of the form 0xXY.
Text Code , Language Code , Genre Code , Text Data Copy Protection
@ -593,7 +600,7 @@ as empty test. (Normally empty content is ignored.)
Example cdrskin run with three tracks:
$ cdrskin dev=/dev/sr0 -v input_sheet_v07t=NIGHTCATS.TXT \
-audio track_source_1 track_source_2 track_source_3
-audio -swab track_source_1 track_source_2 track_source_3
----------------------------------------------------------
Content of file NIGHTCATS.TXT :

View File

@ -913,7 +913,8 @@ To support CD, DVD and BD media alike, it is advisable to round the NWA
to the next multiple of 32 (= 64 KiB).
So one can use 0 as MSC1 and prepare a new ISO session for the computed NWA.
After writing the session it is necessary to patch the PVD at LBA 16.
After writing the session it is necessary to copy the PVD from session start
plus 16 to LBA 16 and to adjust it to its new location.
The minimal change would be to update the number of image sectors.
It is stored in both notations LSB and MSB:
for(i= 0; i < 4; i++)

File diff suppressed because it is too large Load Diff

View File

@ -395,11 +395,16 @@ void burn_disc_erase(struct burn_drive *drive, int fast)
||
(drive->drive_role != 1 && drive->drive_role != 5)
) {
char msg[160];
sprintf(msg, "Drive and media state unsuitable for blanking. (role= %d , profile= 0x%x , status= %d)",
drive->drive_role,
(unsigned int) drive->current_profile,
drive->status);
libdax_msgs_submit(libdax_messenger, drive->global_index,
0x00020130,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
"Drive and media state unsuitable for blanking",
0, 0);
msg, 0, 0);
return;
}

View File

@ -615,17 +615,65 @@ static int v07t_cdtext_to_track(struct burn_track *track, int block,
}
static int v07t_apply_to_session(struct burn_session *session, int block,
int char_codes[8], int copyrights[8], int languages[8],
int session_attr_seen[16], int track_attr_seen[16],
int genre_code, char *genre_text, int flag)
{
int i, ret, length;
char *line = NULL;
BURN_ALLOC_MEM(line, char, 4096);
for (i= 0x80; i <= 0x8e; i++) {
if (i > 0x85 && i != 0x8e)
continue;
if (session_attr_seen[i - 0x80] || !track_attr_seen[i - 0x80])
continue;
ret = v07t_cdtext_to_session(session, block, "",
char_codes + block, i, NULL, 0);
if (ret <= 0)
goto ex;
}
if (genre_code >= 0 && genre_text[0]) {
line[0] = (genre_code >> 8) & 0xff;
line[1] = genre_code & 0xff;
strcpy(line + 2, genre_text);
length = 2 + strlen(line + 2) + 1;
ret = burn_session_set_cdtext(session, block, 0, "GENRE",
(unsigned char *) line, length, 0);
if (ret <= 0)
goto ex;
}
ret = burn_session_set_cdtext_par(session, char_codes, copyrights,
languages, 0);
if (ret <= 0)
goto ex;
for (i = 0; i < 8; i++)
char_codes[i] = copyrights[i] = languages[i]= -1;
for (i = 0; i < 16; i++)
session_attr_seen[i] = track_attr_seen[i] = 0;
genre_text[0] = 0;
ret = 1;
ex:
BURN_FREE_MEM(line);
return ret;
}
/* ts B11215 API */
/* @param flag bit1= do not attach CATALOG to session or ISRC to track for
/* @param flag bit0= permission to read multiple blocks from the same sheet
bit1= do not attach CATALOG to session or ISRC to track for
writing to Q sub-channel
*/
int burn_session_input_sheet_v07t(struct burn_session *session,
char *path, int block, int flag)
{
int ret = 0, num_tracks, char_codes[8], copyrights[8], languages[8], i;
int genre_code = -1, track_offset = 1, length, pack_type, tno, tnum;
int genre_code = -1, track_offset = 1, pack_type, tno, tnum;
int session_attr_seen[16], track_attr_seen[16];
int int0x00 = 0x00, int0x01 = 0x01;
int additional_blocks = -1, line_count = 0, enable_multi_block = 0;
struct stat stbuf;
FILE *fp = NULL;
char *line = NULL, *eq_pos, *payload, *genre_text = NULL, track_txt[3];
@ -678,6 +726,7 @@ cannot_open:;
burn_printify(msg), 0, 0);
ret = 0; goto ex;
}
line_count++;
if (strlen(line) == 0)
continue;
eq_pos = strchr(line, '=');
@ -822,6 +871,31 @@ cannot_open:;
burn_printify(msg), 0, 0);
ret = 0; goto ex;
}
if (flag & 1)
if (line_count == 1)
enable_multi_block = 1;
if (enable_multi_block) {
if (additional_blocks >= 0) {
if (block == 7) {
libdax_msgs_submit(
libdax_messenger, -1, 0x000201a0,
LIBDAX_MSGS_SEV_WARNING, LIBDAX_MSGS_PRIO_HIGH,
"Maximum number of CD-TEXT blocks exceeded",
0, 0);
break;
}
ret = v07t_apply_to_session(
session, block, char_codes,
copyrights, languages,
session_attr_seen,
track_attr_seen,
genre_code, genre_text, 0);
if (ret <= 0)
goto ex;
block++;
}
additional_blocks++;
}
} else if (strcmp(line, "Remarks") == 0) {
;
@ -979,33 +1053,16 @@ bad_track_no:;
ret = 0; goto ex;
}
}
for (i= 0x80; i <= 0x8e; i++) {
if (i > 0x85 && i != 0x8e)
continue;
if (session_attr_seen[i - 0x80] || !track_attr_seen[i - 0x80])
continue;
ret = v07t_cdtext_to_session(session, block, "",
char_codes + block, i, NULL, 0);
if (ret <= 0)
goto ex;
}
if (genre_code >= 0 && genre_text[0]) {
line[0] = (genre_code >> 8) & 0xff;
line[1] = genre_code & 0xff;
strcpy(line + 2, genre_text);
length = 2 + strlen(line + 2) + 1;
ret = burn_session_set_cdtext(session, block, 0, "GENRE",
(unsigned char *) line, length, 0);
if (ret <= 0)
goto ex;
}
ret = burn_session_set_cdtext_par(session, char_codes, copyrights,
languages, 0);
ret = v07t_apply_to_session(session, block,
char_codes, copyrights, languages,
session_attr_seen, track_attr_seen,
genre_code, genre_text, 0);
if (ret <= 0)
goto ex;
ret = 1;
if (additional_blocks > 0)
ret += additional_blocks;;
ex:;
if(fp != NULL)
fclose(fp);
@ -1109,3 +1166,558 @@ ex:;
}
/* --------------------------------- make_v07t -------------------------- */
static int search_pack(unsigned char *text_packs, int num_packs,
int start_no, int pack_type, int block,
unsigned char **found_pack, int *found_no, int flag)
{
int i;
for (i = start_no; i < num_packs; i++) {
if (pack_type >= 0)
if (text_packs[i * 18] != pack_type)
continue;
if (block >= 0)
if (((text_packs[i * 18 + 3] >> 4) & 7) != block)
continue;
*found_pack = text_packs + i * 18;
*found_no = i;
return 1;
}
*found_pack = NULL;
*found_no = num_packs;
return 0;
}
static void write_v07t_line(char **respt, char *spec, char *value, int vlen,
int *result_len, int flag)
{
int len;
if (vlen == -1)
vlen = strlen(value);
len = strlen(spec);
if (len < 19)
len = 19;
len += 3 + vlen + 1;
if(flag & 1) {
*result_len += len;
return;
}
sprintf(*respt, "%-19s = ", spec);
if (vlen > 0)
memcpy(*respt + strlen(*respt), value, vlen);
(*respt)[len - 1] = '\n';
(*respt)[len] = 0;
*respt+= len;
}
/*
@return -1 error
0 no pack of block,pack_type found
1 packs found, delimiter is single 0-byte
2 packs found, delimiter is double 0-byte
*/
static int collect_payload(unsigned char *text_packs, int num_packs,
int pack_type, int block,
unsigned char **payload, int *payload_count,
int flag)
{
unsigned char *pack;
int pack_no, ret, double_byte = 0;
*payload_count = 0;
for (pack_no = 0; ; pack_no++) {
ret = search_pack(text_packs, num_packs, pack_no, pack_type,
block, &pack, &pack_no, 0);
if (ret <= 0)
break;
*payload_count += 12;
}
if (*payload_count == 0)
return 0;
*payload = burn_alloc_mem(*payload_count + 1, 1, 0);
if (*payload == NULL)
return -1;
*payload_count = 0;
for (pack_no = 0; ; pack_no++) {
ret = search_pack(text_packs, num_packs, pack_no, pack_type,
block, &pack, &pack_no, 0);
if (ret <= 0)
break;
memcpy(*payload + *payload_count, pack + 4, 12);
*payload_count += 12;
if (pack[4] & 128)
double_byte = 1;
}
(*payload)[*payload_count] = 0;
return 1 + double_byte;
}
/*
@param flag bit0= use double 0 as delimiter
*/
static int is_payload_text_end(unsigned char *payload, int payload_count,
int i, int flag)
{
if (i >= payload_count)
return 1;
if (payload[i])
return 0;
if (!(flag & 1))
return 1;
if (i + 1 >= payload_count)
return 1;
if (payload[i + 1] == 0)
return 1;
return 0;
}
/*
@param flag Bitfield for control purposes.
bit0= use double 0 as delimiter
bit1= replace TAB resp. TAB TAB by text of previous tno
*/
static int pick_payload_text(unsigned char *payload, int payload_count,
int tno,
unsigned char **text_start, int *text_len,
int flag)
{
int i, skipped = 0, end_found = 0;
again:;
if (tno <= 0) {
*text_start = payload;
*text_len = 0;
for (i = 0; i < payload_count; i += 1 + (flag & 1)) {
end_found = is_payload_text_end(payload, payload_count,
i, flag & 1);
if (end_found) {
*text_len = i;
break;
}
}
return 1;
}
*text_start = NULL;
*text_len = 0;
for (i = 0; i < payload_count; i += 1 + (flag & 1)) {
end_found = is_payload_text_end(payload, payload_count,
i, flag & 1);
if (end_found) {
skipped++;
if (skipped == tno) {
*text_start = payload + (i + 1 + (flag & 1));
} else if (skipped == tno + 1) {
*text_len = i - (*text_start - payload);
goto found;
}
}
}
if (*text_start == NULL)
return 0;
*text_len = payload_count - (*text_start - payload);
found:;
if (flag & 2) {
/* If TAB resp. TAB TAB, then look back */
if (flag & 1) {
if (*text_len == 2) {
if ((*text_start)[0] == '\t' &&
(*text_start)[1] == '\t') {
skipped = 0;
tno--;
goto again;
}
}
} else if (*text_len == 1) {
if ((*text_start)[0] == '\t') {
skipped = 0;
tno--;
goto again;
}
}
}
return 1;
}
static int write_v07t_textline(unsigned char *text_packs, int num_packs,
int pack_type, int block,
int tno, int first_tno, char *spec,
char **respt, int *result_len, int flag)
{
unsigned char *payload = NULL, *text_start;
int ret, payload_count = 0, text_len, tab_flag = 0;
char msg[80];
if ((pack_type >= 0x80 && pack_type <= 0x85) || pack_type == 0x8e)
tab_flag = 2;
ret = collect_payload(text_packs, num_packs, pack_type, block,
&payload, &payload_count, 0);
if(ret > 0) {
ret = pick_payload_text(payload, payload_count, tno,
&text_start, &text_len,
(ret == 2) | tab_flag);
if (ret > 0) {
if (tno > 0 && strcmp(spec, "ISRC") == 0)
sprintf(msg, "%s %-2.2d",
spec, tno + first_tno - 1);
else if (tno > 0)
sprintf(msg, "Track %-2.2d %s",
tno + first_tno - 1, spec);
else
strcpy(msg, spec);
write_v07t_line(respt, msg,
(char *) text_start, text_len,
result_len, flag & 1);
ret = 1;
}
}
BURN_FREE_MEM(payload);
return ret;
}
static int report_track(unsigned char *text_packs, int num_packs,
int block, int tno, int first_tno,
char **respt, int *result_len, int flag)
{
int ret, i;
static char *track_specs[6] = {
"Title", "Artist", "Songwriter", "Composer",
"Arranger", "Message"
};
for (i = 0; i < 6; i++) {
ret = write_v07t_textline(text_packs, num_packs, 0x80 + i,
block, tno, first_tno,
track_specs[i], respt, result_len,
flag & 1);
if (ret < 0)
return -1;
}
ret = write_v07t_textline(text_packs, num_packs, 0x8e, block,
tno, first_tno,
"ISRC", respt, result_len, flag & 1);
if (ret < 0)
return -1;
return 1;
}
/*
@param flag Bitfield for control purposes.
bit0= Do not store text in result but only determine
the minimum size for the result array.
It is permissible to submit result == NULL.
Submit the already occupied size as result_size.
@return > 0 tells the number of valid text bytes in result resp.
with flag bit0 the prediction of that number.
This does not include the trailing 0-byte.
= 0 indicates that the block is not present
< 0 indicates failure.
*/
static int report_block(unsigned char *text_packs, int num_packs,
int block, int first_tno, int last_tno, int char_code,
char *result, int result_size, int flag)
{
char *respt = NULL;
unsigned char *pack, *payload = NULL;
int result_len = 0, pack_no, ret, i, lang, payload_count = 0, genre;
char msg[80];
static char *languages[] = {
BURN_CDTEXT_LANGUAGES_0X00,
BURN_CDTEXT_FILLER,
BURN_CDTEXT_LANGUAGES_0X45
};
static char *volume_specs[7] = {
"Album Title", "Artist Name", "Songwriter", "Composer",
"Arranger", "Album Message", "Catalog Number",
};
static char *genres[BURN_CDTEXT_NUM_GENRES] = {
BURN_CDTEXT_GENRE_LIST
};
/* Search for any pack of the block. But do not accept 0x8f as first.*/
ret = search_pack(text_packs, num_packs, 0, -1, block,
&pack, &pack_no, 0);
if (ret <= 0)
return 0;
if (pack[0] == 0x8f)
return 0;
if (flag & 1) {
result_len = result_size;
} else {
respt = result + result_size;
}
write_v07t_line(&respt, "Input Sheet Version", "0.7T", -1, &result_len,
flag & 1);
sprintf(msg, "Libburn report of CD-TEXT Block %d", block);
write_v07t_line(&respt, "Remarks ", msg, -1, &result_len,
flag & 1);
write_v07t_line(&respt, "Text Code ",
char_code == 0 ? "8859" : char_code == 0x01 ? "ASCII" : "MS-JIS",
-1, &result_len, flag & 1);
pack_no = 0;
for (i = 0; i < 3; i++) {
ret = search_pack(text_packs, num_packs, pack_no, 0x8f, -1,
&pack, &pack_no, 0);
if (ret <= 0) {
libdax_msgs_submit(libdax_messenger, -1, 0x0002019f,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"No third CD-TEXT pack 0x8f found. No language code defined",
0, 0);
goto failure;
}
pack_no++;
}
lang = pack[8 + block];
if (lang > 127) {
sprintf(msg, "CD-TEXT with unknown language code %2.2x",
(unsigned int) lang);
libdax_msgs_submit(libdax_messenger, -1, 0x0002019f,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
goto failure;
}
write_v07t_line(&respt, "Language Code", languages[lang], -1,
&result_len, flag & 1);
for (i = 0; i < 7; i++) {
ret = write_v07t_textline(text_packs, num_packs, 0x80 + i,
block, 0, 0, volume_specs[i],
&respt, &result_len,
flag & 1);
if (ret < 0)
goto failure;
}
ret = collect_payload(text_packs, num_packs, 0x87, block,
&payload, &payload_count, 0);
if(ret > 0) {
genre = (payload[0] << 8) | payload[1];
if (genre < BURN_CDTEXT_NUM_GENRES)
strcpy(msg, genres[genre]);
else
sprintf(msg, "0x%-4.4x", (unsigned int) genre);
write_v07t_line(&respt, "Genre Code", msg,
-1, &result_len, flag & 1);
write_v07t_line(&respt, "Genre Information",
(char *) payload + 2,
-1, &result_len, flag & 1);
BURN_FREE_MEM(payload); payload = NULL;
}
ret = collect_payload(text_packs, num_packs, 0x8d, block,
&payload, &payload_count, 0);
if(ret > 0) {
write_v07t_line(&respt, "Closed Information", (char *) payload,
-1, &result_len, flag & 1);
BURN_FREE_MEM(payload); payload = NULL;
}
ret = write_v07t_textline(text_packs, num_packs, 0x8e, block, 0, 0,
"UPC / EAN", &respt, &result_len, flag & 1);
if (ret < 0)
goto failure;
ret = search_pack(text_packs, num_packs, 0, 0x8f, -1,
&pack, &pack_no, 0);
if (ret < 0)
goto failure;
if (pack[7] == 0x00)
strcpy(msg, "OFF");
else if (pack[7] == 0x03)
strcpy(msg, "ON");
else
sprintf(msg, "0x%2.2x", (unsigned int) pack[7]);
write_v07t_line(&respt, "Text Data Copy Protection", msg,
-1, &result_len, flag & 1);
sprintf(msg, "%d", first_tno);
write_v07t_line(&respt, "First Track Number", msg,
-1, &result_len, flag & 1);
sprintf(msg, "%d", last_tno);
write_v07t_line(&respt, "Last Track Number", msg,
-1, &result_len, flag & 1);
for (i = 0; i < last_tno - first_tno + 1; i++) {
ret = report_track(text_packs, num_packs, block,
i + 1, first_tno,
&respt, &result_len, flag & 1);
if (ret < 0)
goto failure;
}
if (flag & 1)
return result_len;
return respt - result;
failure:;
BURN_FREE_MEM(payload);
return -1;
}
/*
@param result A byte buffer of sufficient size.
It will be filled by the text for the v07t sheet file
plus a trailing 0-byte. (Be aware that double-byte
characters might contain 0-bytes, too.)
@param result_size The number of bytes in result.
To be determined by a run with flag bit0 set.
@param flag Bitfield for control purposes.
bit0= Do not store text in result but only determine
the minimum size for the result array.
It is permissible to submit result == NULL and
result_size == 0.
@return > 0 tells the number of valid text bytes in result resp.
with flag bit0 the prediction of that number.
This does not include the trailing 0-byte.
<= 0 indicates failure.
*/
static int burn_make_v07t(unsigned char *text_packs, int num_packs,
int first_tno, int track_count,
char *result, int result_size,
int *char_code, int flag)
{
int pack_no = 0, ret, block, last_tno = 0;
unsigned char *pack;
char msg[80];
/* >>> ??? Verify checksums ? */;
/* Check character code, reject unknown ones */
ret = search_pack(text_packs, num_packs, 0, 0x8f, -1,
&pack, &pack_no, 0);
if (ret <= 0) {
libdax_msgs_submit(libdax_messenger, -1, 0x0002019f,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
"No CD-TEXT pack 0x8f found. No character code defined",
0, 0);
return 0;
}
*char_code = pack[4];
if (*char_code != 0x00 && *char_code != 0x01 && *char_code != 0x80) {
sprintf(msg, "CD-TEXT with unknown character code %2.2x",
(unsigned int) *char_code);
libdax_msgs_submit(libdax_messenger, -1, 0x0002019f,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
return 0;
}
/* Obtain first_tno and last_tno from type 0x88 if present. */
if (first_tno <= 0) {
if (pack[5] > 0 && pack[5] + pack[6] < 100 &&
pack[5] <= pack[6]) {
first_tno = pack[5];
last_tno = pack[6];
} else {
sprintf(msg,
"CD-TEXT with illegal track range %d to %d",
(int) pack[5], (int) pack[6]);
libdax_msgs_submit(libdax_messenger, -1, 0x0002019f,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
return 0;
}
}
if (last_tno <= 0) {
if (track_count > 0) {
last_tno = first_tno + track_count - 1;
} else {
last_tno = 99;
}
}
/* Report content */
result_size = 0;
for (block = 0; block < 8; block++) {
ret = report_block(text_packs, num_packs, block,
first_tno, last_tno, *char_code,
result, result_size, flag & 1);
if (ret < 0)
return ret;
if (ret == 0)
continue;
result_size = ret;
}
#ifdef NIX
if (flag & 1)
return result_size;
return (int) strlen((char *) result);
#else /* NIX */
return result_size;
#endif /* ! NIX */
}
/* Convert an array of CD-TEXT packs into the text format of
Sony CD-TEXT Input Sheet Version 0.7T .
@param text_packs Array of bytes which form CD-TEXT packs of 18 bytes
each. For a description of the format of the array,
see file doc/cdtext.txt.
No header of 4 bytes must be prepended which would
tell the number of pack bytes + 2.
This parameter may be NULL if the currently attached
array of packs shall be removed.
@param num_packs The number of 18 byte packs in text_packs.
@param start_tno The start number of track counting, if known from
CD table-of-content or orther sources.
Submit 0 to enable the attempt to read it and the
track_count from pack type 0x8f.
@param track_count The number of tracks, if known from CD table-of-content
or orther sources.
@param result Will return the buffer with Sheet text.
Dispose by free() when no longer needed.
It will be filled by the text for the v07t sheet file
plus a trailing 0-byte. (Be aware that double-byte
characters might contain 0-bytes, too.)
Each CD-TEXT language block starts by the line
"Input Sheet Version = 0.7T"
and a "Remarks" line that tells the block number.
@param char_code Returns the character code of the pack array:
0x00 = ISO-8859-1
0x01 = 7 bit ASCII
0x80 = MS-JIS (japanese Kanji, double byte characters)
The presence of a code value that is not in this list
will cause this function to fail.
@param flag Bitfield for control purposes. Unused yet. Submit 0.
@return > 0 tells the number of valid text bytes in result.
This does not include the trailing 0-byte.
<= 0 indicates failure.
*/
int burn_make_input_sheet_v07t(unsigned char *text_packs, int num_packs,
int start_tno, int track_count,
char **result, int *char_code, int flag)
{
int ret, result_size = 0;
ret = burn_make_v07t(text_packs, num_packs, start_tno, track_count,
NULL, 0, char_code, 1);
if (ret <= 0)
return ret;
result_size = ret + 1;
*result = burn_alloc_mem(result_size, 1, 0);
if (*result == NULL)
return -1;
ret = burn_make_v07t(text_packs, num_packs, start_tno, track_count,
*result, result_size, char_code, 0);
if (ret <= 0) {
free(*result);
return ret;
}
return result_size - 1;
}

View File

@ -133,15 +133,27 @@ static void Cleanup_handler_generic(int signum)
}
static char *Cleanup_signo_to_name(int signo)
{
int i;
for(i= 0; i < signal_list_count; i++)
if(signal_list[i] == signo)
return(signal_name_list[i]);
return("");
}
int Cleanup_set_handlers(void *handle, Cleanup_app_handler_T handler, int flag)
/*
bit0= set to default handlers
bit1= set to ignore
bit2= set cleanup_perform_app_handler_first
bit3= set SIGABRT to handler (makes sense with bits 0 or 1)
bit8= set SIGPIPE to SIGIGN
*/
{
int i,j,max_sig= -1,min_sig= 0x7fffffff;
char *sig_name;
sighandler_t sig_handler;
cleanup_msg[0]= 0;
@ -172,8 +184,17 @@ int Cleanup_set_handlers(void *handle, Cleanup_app_handler_T handler, int flag)
if(i==non_signal_list[j])
break;
if(j>=non_signal_list_count) {
if(i==SIGABRT && (flag&8))
/* Avoid to use particular SIG macros which might not be defined.
If they are defined, then their names are in the name list.
*/
if(flag & (8 | 256))
sig_name= Cleanup_signo_to_name(i);
else
sig_name= "";
if((flag & 8) && strcmp(sig_name, "SIGABRT") == 0)
signal(i,Cleanup_handler_generic);
else if((flag & 256) && strcmp(sig_name, "SIGPIPE") == 0)
signal(i, SIG_IGN);
else
signal(i,sig_handler);
}

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -69,7 +69,7 @@ extern int burn_drive_role_4_allowed;
*/
int burn_setup_drive(struct burn_drive *d, char *fname)
{
d->devname = burn_strdup(fname);
d->devname = strdup(fname);
memset(&d->params, 0, sizeof(struct params));
d->idata = NULL;
d->mdata = NULL;
@ -2123,7 +2123,7 @@ int burn_drive_convert_scsi_adr(int bus_no, int host_no, int channel_no,
ret = 0;
ex:;
if (first == 0)
sg_give_next_adr(&enm, fname, sizeof(fname), -1);
sg_give_next_adr(&enm, fname, fname_size, -1);
BURN_FREE_MEM(fname);
BURN_FREE_MEM(msg);
return ret;

View File

@ -27,6 +27,7 @@
#include "file.h"
#include "async.h"
#include "init.h"
#include "util.h"
#include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger;
@ -919,3 +920,161 @@ struct burn_source *burn_offst_source_new(
return src;
}
/* -------------------- WAVE file extractor ------------------- */
/* ts B30522 */
/* API
@param flag Bitfield for control purposes:
bit0= Report about progress by UPDATE message
bit3= Enable DAP : "flaw obscuring mechanisms like
audio data mute and interpolate"
*/
int burn_drive_extract_audio(struct burn_drive *drive,
int start_sector, int sector_count,
char *target_path, int flag)
{
int fd = -1, ret, todo, sector_no, val, min, sec, fr;
int sectors_done= 0, last_reported = 0;
off_t data_size, data_count = 0;
time_t last_pacified = 0, now;
char *msg = NULL, *buf = NULL;
BURN_ALLOC_MEM(msg, char, 4096);
BURN_ALLOC_MEM(buf, char, 24 * 2352);
fd = open(target_path, O_WRONLY | O_CREAT,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (fd == -1) {
sprintf(msg, "Cannot open disk file for writing: %.4000s",
target_path);
libdax_msgs_submit(libdax_messenger, -1, 0x000201a1,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, errno, 0);
ret = 0; goto ex;
}
/* WAV header */
strcpy(buf, "RIFF");
val = 4 + 8 + 16 + 8 + sector_count * 2352; /* ChunkSize */
burn_int_to_lsb(val, buf + 4);
strcpy(buf + 8, "WAVE");
strcpy(buf + 12, "fmt ");
burn_int_to_lsb(16, buf + 16); /* Subchunk1Size */
buf[20] = 1; /* AudioFormat */
buf[21] = 0;
buf[22] = 2; /* NumChannels */
buf[23] = 0;
burn_int_to_lsb(44100, buf + 24); /* SampleRate */
burn_int_to_lsb(176400, buf + 28); /* ByteRate */
buf[32] = 4; /* BlockAlign */
buf[33] = 0;
buf[34] = 16; /* BitsPerSample */
buf[35] = 0;
strcpy(buf + 36, "data");
burn_int_to_lsb(sector_count * 2352, buf + 40); /* Subchunk2Size */
ret = write(fd, buf, 44);
if (ret == -1)
goto write_error;
/* Audio data */
todo = sector_count;
sector_no = start_sector;
while (todo > 0) {
if (todo > 24)
data_size = 24 * 2352;
else
data_size = todo * 2352;
ret = burn_read_audio(drive, sector_no, buf, data_size,
&data_count, flag & 8);
if (ret <= 0) {
sprintf(msg, "Failure to read audio sectors");
libdax_msgs_submit(libdax_messenger, -1, 0x000201a4,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
goto ex;
}
ret = write(fd, buf, data_count);
if (ret == -1) {
write_error:;
sprintf(msg,
"Error while writing to disk file: %.4000s",
target_path);
libdax_msgs_submit(libdax_messenger, -1, 0x000201a2,
LIBDAX_MSGS_SEV_FAILURE,
LIBDAX_MSGS_PRIO_HIGH,
msg, errno, 0);
ret = 0; goto ex;
}
todo -= data_count / 2352;
sectors_done += data_count / 2352;
sector_no += data_count / 2352;
if ((flag & 1) && (now = time(NULL)) - last_pacified >= 1) {
last_pacified = now;
burn_lba_to_msf(sectors_done, &min, &sec, &fr);
sprintf(msg,
"Minutes:seconds of audio data read: %2d:%2.2d (%6.2f MB)",
min, sec,
((double) sectors_done) * 2352.0 / 1048576.0);
libdax_msgs_submit(libdax_messenger, -1, 0x000201a3,
LIBDAX_MSGS_SEV_UPDATE,
LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 1);
last_reported = sectors_done;
}
}
if ((flag & 1)) {
burn_lba_to_msf(sectors_done, &min, &sec, &fr);
sprintf(msg,
"Minutes:seconds of audio data read: %2d:%2.2d (%6.2f MB)",
min, sec, ((double) sectors_done) * 2352.0 / 1048576.0);
libdax_msgs_submit(libdax_messenger, -1, 0x000201a3,
LIBDAX_MSGS_SEV_UPDATE,
LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
last_reported = sectors_done;
}
ret = 1;
ex:;
BURN_FREE_MEM(buf);
BURN_FREE_MEM(msg);
if (fd != -1)
close(fd);
return ret;
}
/* ts B30522 */
/* API
@param flag Bitfield for control purposes:
bit0= Report about progress by UPDATE message
bit3= Enable DAP : "flaw obscuring mechanisms like
audio data mute and interpolate"
*/
int burn_drive_extract_audio_track(struct burn_drive *drive,
struct burn_track *track,
char *target_path, int flag)
{
int ret;
struct burn_toc_entry toc_entry;
burn_track_get_entry(track, &toc_entry);
if (!(toc_entry.extensions_valid & 1)) {
/* Can only happen if burn_disc_cd_toc_extensions() is skipped
in mmc_read_toc_al().
*/
libdax_msgs_submit(libdax_messenger, -1, 0x00000004,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Internal libburn error: Outdated burn_toc_entry format encountered",
errno, 0);
return -1;
}
ret = burn_drive_extract_audio(drive, toc_entry.start_lba,
toc_entry.track_blocks,
target_path, flag & (1 | 8));
return ret;
}

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -31,6 +31,7 @@
#include "libburn.h"
#include "drive.h"
#include "transport.h"
#include "util.h"
/* ts A60825 : The storage location for back_hacks.h variables. */
#define BURN_BACK_HACKS_INIT 1
@ -43,6 +44,9 @@ struct libdax_msgs *libdax_messenger= NULL;
int burn_running = 0;
double lib_start_time;
/* ts A60813 : GNU/Linux: whether to use O_EXCL on open() of device files
ts B00212 : FreeBSD: whether to use flock(LOCK_EX) after open()
*/
@ -136,6 +140,8 @@ int burn_initialize(void)
if (burn_running)
return 1;
lib_start_time = burn_get_time(0);
burn_support_untested_profiles = 0;
ret = burn_msgs_initialize();
if (ret <= 0)
@ -347,6 +353,17 @@ int burn_sev_to_text(int severity_number, char **severity_name, int flag)
return ret;
}
/* ts B21214 API */
char *burn_list_sev_texts(int flag)
{
char *sev_list;
libdax_msgs__sev_to_text(0, &sev_list, 1);
return sev_list;
}
/* ts B00224 */
char *burn_util_thread_id(pid_t pid, pthread_t tid, char text[80])
{
@ -532,7 +549,7 @@ void burn_set_signal_handling(void *handle, burn_abort_handler_t handler,
if(burn_builtin_signal_action == 0)
burn_builtin_signal_action = 1;
Cleanup_set_handlers(handle, (Cleanup_app_handler_T) handler,
(mode & 15) | 4);
(mode & 15) | 4 | (mode & 256));
burn_global_signal_handle = handle;
burn_global_signal_handler = handler;
}

View File

@ -1,10 +1,17 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
#ifndef BURN__INIT_H
#define BURN__INIT_H
extern int burn_running;
extern double lib_start_time;
/** Indicator for burn_drive_get_status() wether a signal hit parts of the
thread team.
0= all works well ,

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This is the official API definition of libburn.
@ -343,7 +343,6 @@ enum burn_drive_status
"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
{
@ -372,6 +371,8 @@ struct burn_toc_entry
older elements in this structure:
bit0= DVD extension is valid @since 0.3.2
@since 0.5.2 : DVD extensions are made valid for CD too
bit1= LRA extension is valid @since 0.7.2
bit2= Track status bits extension is valid @since 1.2.8
*/
unsigned char extensions_valid;
@ -393,6 +394,24 @@ struct burn_toc_entry
This would mean profiles: 0x11, 0x15, 0x13, 0x14, 0x51, 0x41, 0x42
*/
int last_recorded_address;
/* ts B30112 : Track status bits extension. extensions_valid:bit2 */
/* @since 1.2.8 */
/* Names as of READ TRACK INFORMATION, MMC-5 6.27.3 :
bit0 - bit3 = Track Mode
bit4 = Copy
bit5 = Damage
bit6 - bit7 = LJRS
bit8 - bit11 = Data Mode
bit12 = FP
bit13 = Packet/Inc
bit14 = Blank
bit15 = RT
bit16 = NWA_V
bit17 = LRA_V
*/
int track_status_bits;
};
@ -1158,7 +1177,7 @@ int burn_drive_snooze(struct burn_drive *d, int flag);
/** Re-assess drive and media status. This should be done after a drive
underwent a status change and shall be further used without intermediate
burn_drive_release(), burn_drive_grab(). E.g. after blanking or burning.
@param drive The already grabbed drive to re-assess.
@param d The already grabbed drive to re-assess.
@param flag Unused yet. Submit 0.
@return 1 success , <= 0 could not determine drive and media state
@since 1.1.8
@ -1955,9 +1974,10 @@ int burn_session_set_start_tno(struct burn_session *session, int tno,
int flag);
/* ts B20108 */
/** Inquire the CD track start number, as set by default ot by
/** Inquire the CD track start number, as set by default or by
burn_session_set_start_tno().
@param session The session to be inquired
@param flag Bitfield for control purposes. Unused yet. Submit 0.
@return > 0 is the currently set CD track start number
<= 0 indicates failure
@since 1.2.0
@ -2070,7 +2090,7 @@ int burn_session_set_cdtext_par(struct burn_session *s,
@param s Session which to inquire
@param char_codes Will return Character Codes for block 0 to 7
@param copyrights Will return Copyright bytes for block 0 to 7
@param languages Will return Language Codes for block 0 to 7
@param block_languages Will return Language Codes for block 0 to 7
@param flag Bitfiled for control purposes. Unused yet. Submit 0.
@return <=0 failure, reply invalid, > 0 success, reply valid
@since 1.2.0
@ -2119,7 +2139,7 @@ int burn_session_get_cdtext_par(struct burn_session *s,
Pack type 0x8d contains ISO-8859-1 cleartext which is
not to be shown by commercial audio CD players.
Pack type 0x8e is ASCII cleartext with UPC/EAN code.
@pram length Number of bytes in payload. Including terminating
@param length Number of bytes in payload. Including terminating
0-bytes.
@param flag Bitfield for control purposes.
bit0= payload contains double byte characters
@ -2168,7 +2188,7 @@ int burn_session_set_cdtext(struct burn_session *s, int block,
If no text attribute is attached for pack type and
block, then payload is returned as NULL. The return
value will not indicate error in this case.
@pram length Will return the number of bytes pointed to by payload.
@param length Will return the number of bytes pointed to by payload.
Including terminating 0-bytes.
@param flag Bitfield for control purposes. Unused yet. Submit 0.
@return 1 single byte char, 2 double byte char, <=0 error
@ -2189,15 +2209,24 @@ int burn_session_get_cdtext(struct burn_session *s, int block,
The media catalog number from purpose specifier "UPC / EAN" gets into
effect only if burn_write_opts_set_has_mediacatalog() is set to 0.
The format of a v07t sheet file is documented in doc/cdtext.txt.
@param s Session where to attach CD-TEXT attributes
@param session Session where to attach CD-TEXT attributes
@param path Local filesystem address of the sheet file which
shall be read and interpreted.
@param block Number of the language block in which the attributes
shall appear. Possible values: 0 to 7.
@param flag Bitfield for control purposes.
bit0= Permission to read multiple blocks from the
given sheet file. Each block is supposed to begin
by a line "Input Sheet Version = 0.7T". Therefore
this permission is only valid if the input file
begins by such a line.
@since 1.3.2
bit1= Do not use media catalog string of session or ISRC
strings of tracks for writing to Q sub-channel.
@return > 0 indicates success , <= 0 is failure
@since 1.2.0
@return > 0 indicates success and the number of interpreted
blocks (1 if not flag bit0 is set).
<= 0 indicates failure
@since 1.2.0
*/
int burn_session_input_sheet_v07t(struct burn_session *session,
@ -2206,7 +2235,8 @@ int burn_session_input_sheet_v07t(struct burn_session *session,
/* ts B11210 */
/** Produce an array of CD-TEXT packs that could be submitted to
burn_write_opts_set_leadin_text() or stored as *.cdt file.
burn_write_opts_set_leadin_text(), or stored as *.cdt file,
or submitted to burn_make_input_sheet_v07t().
For a description of the format of the array, see file doc/cdtext.txt.
The input data stem from burn_session_set_cdtext_par(),
burn_session_set_cdtext(), and burn_track_set_cdtext().
@ -2231,6 +2261,49 @@ int burn_cdtext_from_session(struct burn_session *s,
int flag);
/* ts B30519 */
/** Convert an array of CD-TEXT packs into the text format of
Sony CD-TEXT Input Sheet Version 0.7T .
@param text_packs Array of bytes which form CD-TEXT packs of 18 bytes
each. For a description of the format of the array,
see file doc/cdtext.txt.
No header of 4 bytes must be prepended which would
tell the number of pack bytes + 2.
This parameter may be NULL if the currently attached
array of packs shall be removed.
@param num_packs The number of 18 byte packs in text_packs.
@param start_tno The start number of track counting, if known from
CD table-of-content or other sources.
Submit 0 to enable the attempt to read it and the
track_count from pack type 0x8f.
@param track_count The number of tracks, if known from CD table-of-content
or orther sources.
@param result Will return the buffer with Sheet text.
Dispose by free() when no longer needed.
It will be filled by the text for the v07t sheet file
plus a trailing 0-byte. (Be aware that double-byte
characters might contain 0-bytes, too.)
Each CD-TEXT language block starts by the line
"Input Sheet Version = 0.7T"
and a "Remarks" line that tells the block number.
@param char_code Returns the character code of the pack array:
0x00 = ISO-8859-1
0x01 = 7 bit ASCII
0x80 = MS-JIS (japanese Kanji, double byte characters)
The presence of a code value that is not in this list
will cause this function to fail.
@param flag Bitfield for control purposes. Unused yet. Submit 0.
@return > 0 tells the number of valid text bytes in result.
This does not include the trailing 0-byte.
<= 0 indicates failure.
@since 1.3.2
*/
int burn_make_input_sheet_v07t(unsigned char *text_packs, int num_packs,
int start_tno, int track_count,
char **result, int *char_code, int flag);
/* ts B11206 */
/** Remove all CD-TEXT attributes of the given block from the session.
They were attached by burn_session_set_cdtext().
@ -2301,7 +2374,7 @@ void burn_track_define_data(struct burn_track *t, int offset, int tail,
0x8e = "UPC_ISRC"
@param payload 0-terminated cleartext. If double byte characters
are used, then two 0-bytes terminate the cleartext.
@pram length Number of bytes in payload. Including terminating
@param length Number of bytes in payload. Including terminating
0-bytes.
@param flag Bitfield for control purposes.
bit0= payload contains double byte characters
@ -2326,7 +2399,7 @@ int burn_track_set_cdtext(struct burn_track *t, int block,
If no text attribute is attached for pack type and
block, then payload is returned as NULL. The return
value will not indicate error in this case.
@pram length Will return the number of bytes pointed to by payload.
@param length Will return the number of bytes pointed to by payload.
Including terminating 0-bytes.
@param flag Bitfield for control purposes. Unused yet. Submit 0.
@return 1=single byte char , 2= double byte char , <=0 error
@ -3387,8 +3460,12 @@ void burn_track_get_entry(struct burn_track *t, struct burn_toc_entry *entry);
void burn_session_get_leadout_entry(struct burn_session *s,
struct burn_toc_entry *entry);
/** Gets an array of all the sessions for the disc
/** Gets an array of all complete sessions for the disc
THIS IS NO LONGER VALID AFTER YOU ADD OR REMOVE A SESSION
The result array contains *num + burn_disc_get_incomplete_sessions()
elements. All above *num are incomplete sessions.
Typically there is at most one incomplete session with one empty track.
DVD+R and BD-R seem to allow more than one track with even readable data.
@param d Disc to get session array for
@param num Returns the number of sessions in the array
@return array of sessions
@ -3396,6 +3473,17 @@ void burn_session_get_leadout_entry(struct burn_session *s,
struct burn_session **burn_disc_get_sessions(struct burn_disc *d,
int *num);
/* ts B30112 */
/* @since 1.2.8 */
/** Obtains the number of incomplete sessions which are recorded in the
result array of burn_disc_get_sessions() after the complete sessions.
See above.
@param d Disc object to inquire
@return Number of incomplete sessions
*/
int burn_disc_get_incomplete_sessions(struct burn_disc *d);
int burn_disc_get_sectors(struct burn_disc *d);
/** Gets an array of all the tracks for a session
@ -3450,8 +3538,8 @@ void burn_version(int *major, int *minor, int *micro);
*/
#define burn_header_version_major 1
#define burn_header_version_minor 2
#define burn_header_version_micro 3
#define burn_header_version_minor 3
#define burn_header_version_micro 2
/** Note:
Above version numbers are also recorded in configure.ac because libtool
wants them as parameters at build time.
@ -3589,15 +3677,24 @@ int burn_text_to_sev(char *severity_name, int *severity_number, int flag);
/* ts A80202 */
/** Convert a severity number into a severity name
@since 0.4.4
@param severity_number The rank number: the higher, the more severe.
@param severity_name A name as with burn_msgs_submit(), e.g. "SORRY".
@param flag Bitfield for control purposes (unused yet, submit 0)
@return >0 success, <=0 failure
@since 0.4.4
*/
int burn_sev_to_text(int severity_number, char **severity_name, int flag);
/* ts B21214 */
/** Return a blank separated list of severity names. Sorted from low
to high severity.
@param flag Bitfield for control purposes (unused yet, submit 0)
@return A constant string with the severity names
@since 1.2.6
*/
char *burn_list_sev_texts(int flag);
/* ts A70915 */
/** Replace the messenger object handle of libburn by a compatible handle
@ -3663,18 +3760,23 @@ typedef int (*burn_abort_handler_t)(void *handle, int signum, int flag);
0 Same as 1 (for pre-0.7.8 backward compatibility)
@since 0.7.8
1 Catch the control thread in abort handler, call
burn_abort(>0) and finally exit(1).
burn_abort() with a patience value > 0 and
finally exit(1). Does not always work with FreeBSD.
2 Call burn_abort() with patience -1 and return from
handler. When the control thread calls
burn_drive_get_status(), then call burn_abort()
with patience 1 instead, and finally exit(1).
Does not always work with FreeBSD.
2 Call burn_abort(-1) and return from handler. When the
control thread calls burn_drive_get_status(), then do
burn_abort(>0) instead, and finally exit(1).
Does not always work with FreeBSD.
3 Call burn_abort(-1), return from handler. It is duty of
the application to detect a pending abort condition
by calling burn_is_aborting() and to wait for all
drives to become idle. E.g. by calling burn_abort(>0).
4 Like 3, but without calling burn_abort(-1). Only the
indicator of burn_is_aborting() gets set.
3 Call burn_abort() with patience -1, return from handler.
It is duty of the application to detect a pending abort
condition by calling burn_is_aborting() and to wait for
all drives to become idle. E.g. by calling burn_abort()
with patience >0.
4 Like 3, but without calling burn_abort() with -1. Only
the indicator of burn_is_aborting() gets set.
bit8: @since 1.3.2
try to ignore SIGPIPE (regardless of bit0 - bit3)
@since 0.2.6
*/
void burn_set_signal_handling(void *handle, burn_abort_handler_t handler,
@ -3767,6 +3869,13 @@ int burn_get_read_capacity(struct burn_drive *d, int *capacity, int flag);
bit3= return -2 on permission denied error rather than
issueing a warning message.
@since 1.0.6
bit4= return -3 on SCSI error
5 64 00 ILLEGAL MODE FOR THIS TRACK
and prevent this error from being reported as
event message. Do not retry reading in this case.
(Useful to try the last two blocks of a CD
track which might be non-data because of TAO.)
@since 1.2.6
@return 1=sucessful , <=0 an error occured
with bit3: -2= permission denied error
@since 0.4.0
@ -3775,6 +3884,93 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
char data[], off_t data_size, off_t *data_count, int flag);
/* ts B21119 */
/** Read CD audio sectors in random access mode.
The drive must be grabbed successfully before calling this function.
Only CD audio tracks with 2352 bytes per sector can be read this way.
I.e. not data tracks, not CD-video-stream, ...
Note that audio data do not have exact block addressing. If you read a
sequence of successive blocks then you will get a seamless stream
of data. But the actual start and end position of this audio stream
will differ by a few dozens of milliseconds, depending on individual
CD and individual drive.
Expect leading and trailing zeros, as well as slight truncation.
@param d The drive from which to read.
It must be a real MMC drive (i.e. not a stdio file)
and it must have a CD loaded (i.e. not DVD or BD).
@param sector_no The sector number (Logical Block Address)
It may be slightly below 0, depending on drive and
medium. -150 is a lower limit.
@param data A memory buffer capable of taking data_size bytes
@param data_size The amount of data to be read. This must be aligned
to full multiples of 2352.
@param data_count The amount of data actually read (interesting on error)
@param flag Bitfield for control purposes:
bit0= - reserved -
bit1= do not submit error message if read error
bit2= on error do not try to read a second time
with single block steps.
bit3= Enable DAP : "flaw obscuring mechanisms like
audio data mute and interpolate"
bit4= return -3 on SCSI error
5 64 00 ILLEGAL MODE FOR THIS TRACK
and prevent this error from being reported as
event message. Do not retry reading in this case.
(Useful to try the last two blocks of a CD
track which might be non-audio because of TAO.)
@return 1=sucessful , <=0 an error occured
with bit3: -2= permission denied error
@since 1.2.6
*/
int burn_read_audio(struct burn_drive *d, int sector_no,
char data[], off_t data_size, off_t *data_count, int flag);
/* ts B30522 */
/** Extract an interval of audio sectors from CD and store it as a WAVE
audio file on hard disk.
@param drive The drive from which to read.
@param start_sector The logical block address of the first audio sector
which shall be read.
@param sector_count The number of audio sectors to be read.
Each sector consists of 2352 bytes.
@param target_path The address of the file where to store the extracted
audio data. Will be opened O_WRONLY | O_CREAT.
The file name should have suffix ".wav".
@param flag Bitfield for control purposes:
bit0= Report about progress by UPDATE messages
bit3= Enable DAP : "flaw obscuring mechanisms like
audio data mute and interpolate"
@since 1.3.2
*/
int burn_drive_extract_audio(struct burn_drive *drive,
int start_sector, int sector_count,
char *target_path, int flag);
/* ts B30522 */
/** Extract all audio sectors of a track from CD and store them as a WAVE
audio file on hard disk.
@param drive The drive from which to read.
@param track The track which shall be extracted.
@param target_path The address of the file where to store the extracted
audio data. Will be opened O_WRONLY | O_CREAT.
The file name should have suffix ".wav".
@param flag Bitfield for control purposes:
bit0= Report about progress by UPDATE messages
bit3= Enable DAP : "flaw obscuring mechanisms like
audio data mute and interpolate"
@since 1.3.2
*/
int burn_drive_extract_audio_track(struct burn_drive *drive,
struct burn_track *track,
char *target_path, int flag);
/* ts A70904 */
/** Inquire whether the drive object is a real MMC drive or a pseudo-drive
created by a stdio: address.
@ -3933,7 +4129,7 @@ int libdax_audioxtr_read(struct libdax_audioxtr *xtr,
/** Try to obtain a file descriptor which will deliver extracted data
to normal calls of read(2). This may fail because the format is
unsuitable for that, but ".wav" is ok. If this call succeeds the xtr
unsuitable for that, but WAVE (.wav) is ok. If this call succeeds the xtr
object will have forgotten its file descriptor and libdax_audioxtr_read()
will return a usage error. One may use *fd after libdax_audioxtr_destroy()
and will have to close it via close(2) when done with it.
@ -3988,5 +4184,27 @@ BURN_END_DECLS
*/
#define Libburn_dummy_probe_write_modeS 1
/* ts B30112 */
/* Handle DVD+R with reserved tracks in incomplete first session
by loading info about the incomplete session into struct burn_disc
*/
#define Libburn_disc_with_incomplete_sessioN 1
/* Early experimental:
Do not define Libburn_develop_quality_scaN unless you want to work
towards a usable implementation.
If it gets enabled, then the call must be published in libburn/libburn.ver
*/
#ifdef Libburn_develop_quality_scaN
/* ts B21108 */
/* Experiments mit quality scan command F3 on Optiarc drive */
int burn_nec_optiarc_rep_err_rate(struct burn_drive *d,
int start_lba, int rate_period, int flag);
#endif /* Libburn_develop_quality_scaN */
#endif /*LIBBURN_H*/

View File

@ -19,6 +19,7 @@ burn_disc_get_bd_spare_info;
burn_disc_get_cd_info;
burn_disc_get_format_descr;
burn_disc_get_formats;
burn_disc_get_incomplete_sessions;
burn_disc_get_leadin_text;
burn_disc_get_media_id;
burn_disc_get_msc1;
@ -43,6 +44,8 @@ burn_drive_convert_fs_adr;
burn_drive_convert_scsi_adr;
burn_drive_d_get_adr;
burn_drive_equals_adr;
burn_drive_extract_audio;
burn_drive_extract_audio_track;
burn_drive_free_speedlist;
burn_drive_get_adr;
burn_drive_get_all_profiles;
@ -86,7 +89,9 @@ burn_guess_manufacturer;
burn_initialize;
burn_is_aborting;
burn_lba_to_msf;
burn_list_sev_texts;
burn_lookup_device_link;
burn_make_input_sheet_v07t;
burn_msf_to_lba;
burn_msf_to_sectors;
burn_msgs_obtain;
@ -100,6 +105,7 @@ burn_os_open_track_src;
burn_precheck_write;
burn_preset_device_open;
burn_random_access_write;
burn_read_audio;
burn_read_data;
burn_read_opts_free;
burn_read_opts_new;

View File

@ -289,7 +289,7 @@ int libdax_msgs__sev_to_text(int severity, char **severity_name,
int flag)
{
if(flag&1) {
*severity_name= "NEVER\nABORT\nFATAL\nFAILURE\nMISHAP\nSORRY\nWARNING\nHINT\nNOTE\nUPDATE\nDEBUG\nERRFILE\nALL";
*severity_name= "ALL ERRFILE DEBUG UPDATE NOTE HINT WARNING SORRY MISHAP FAILURE FATAL ABORT NEVER";
return(1);
}
*severity_name= "";
@ -327,6 +327,11 @@ int libdax_msgs__sev_to_text(int severity, char **severity_name,
}
/*
@param flag Bitfield for control purposes
bit0= If direct output to stderr:
CarriageReturn rather than LineFeed
*/
int libdax_msgs_submit(struct libdax_msgs *m, int origin, int error_code,
int severity, int priority, char *msg_text,
int os_errno, int flag)
@ -345,7 +350,8 @@ int libdax_msgs_submit(struct libdax_msgs *m, int origin, int error_code,
if(ret>0)
sprintf(sev_text,"%s : ",sev_name);
fprintf(stderr,"%s%s%s\n",m->print_id,sev_text,textpt);
fprintf(stderr, "%s%s%s%c", m->print_id, sev_text, textpt,
(flag & 1) ? '\r' : '\n');
if(os_errno!=0) {
ret= libdax_msgs_lock(m,0);
if(ret<=0)

View File

@ -302,7 +302,9 @@ int libdax_msgs_refer(struct libdax_msgs **pt, struct libdax_msgs *o, int flag);
@param priority The LIBDAX_MSGS_PRIO_* number of the event.
@param msg_text Printable and human readable message text.
@param os_errno Eventual error code from operating system (0 if none)
@param flag Bitfield for control purposes (unused yet, submit 0)
@param flag Bitfield for control purposes
bit0= If direct output to stderr:
CarriageReturn rather than LineFeed
@return 1 on success, 0 on rejection, <0 for severe errors
*/
int libdax_msgs_submit(struct libdax_msgs *m, int origin, int error_code,
@ -316,7 +318,7 @@ int libdax_msgs_submit(struct libdax_msgs *m, int origin, int error_code,
/** Convert a registered severity number into a severity name
@param flag Bitfield for control purposes:
bit0= list all severity names in a newline separated string
bit0= list all severity names in a blank separated string
@return >0 success, <=0 failure
*/
int libdax_msgs__sev_to_text(int severity, char **severity_name,
@ -475,7 +477,7 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x0002011f (SORRY,HIGH) = Burning is restricted to a single track
0x00020120 (NOTE,HIGH) = FORMAT UNIT ignored
0x00020121 (FATAL,HIGH) = Write preparation setup failed
0x00020122 (FATAL,HIGH) = SCSI error on format_unit
0x00020122 (FAILURE,HIGH) = SCSI error on format_unit
0x00020123 (SORRY,HIGH) = DVD Media are unsuitable for desired track type
0x00020124 (SORRY,HIGH) = SCSI error on set_streaming
0x00020125 (SORRY,HIGH) = Write start address not supported
@ -596,6 +598,14 @@ Range "scdbackup" : 0x00020000 to 0x0002ffff
0x0002019a (SORRY,HIGH) = Bad track index number
0x0002019b (SORRY,HIGH) = CD track number exceeds range of 1 to 99
0x0002019c (SORRY,HIGH) = Session has no defined tracks
0x0002019d (SORRY,HIGH) = Audio read size not properly aligned
0x0002019e (NOTE,HIGH) = Drive does not support media certification
0x0002019f (FAILURE,HIGH) = CD-TEXT binary pack array faulty
0x000201a0 (WARNING,HIGH) = Maximum number of CD-TEXT blocks exceeded
0x000201a1 (FAILURE,HIGH) = Cannot open disk file for writing
0x000201a2 (FAILURE,HIGH) = Error while writing to disk file
0x000201a3 (UPDATE,HIGH) = Progress message of burn_drive_extract_audio()
0x000201a4 (FAILURE,HIGH) = Failure to read audio sectors
libdax_audioxtr:

View File

@ -236,6 +236,11 @@ static unsigned char MMC_READ_CAPACITY[] =
static unsigned char MMC_READ_DISC_STRUCTURE[] =
{ 0xAD, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
/* ts B21125 : An alternatvie to BEh READ CD
*/
static unsigned char MMC_READ_CD_MSF[] =
{ 0xB9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
static int mmc_function_spy_do_tell = 0;
int mmc_function_spy(struct burn_drive *d, char * text)
@ -1121,6 +1126,12 @@ err_ex:;
if (dlen + 2 > old_alloc_len)
dlen = old_alloc_len - 2;
d->complete_sessions = 1 + c->page->data[3] - c->page->data[2];
#ifdef Libburn_disc_with_incomplete_sessioN
/* ts B30112 : number of open sessions */
d->incomplete_sessions = 0;
#endif
d->last_track_no = d->complete_sessions;
if (dlen - 2 < (d->last_track_no + 1) * 8) {
libdax_msgs_submit(libdax_messenger, d->global_index,
@ -1248,9 +1259,22 @@ int mmc_fake_toc(struct burn_drive *d)
{ret = -1; goto ex;}
BURN_ALLOC_MEM(buf, struct buffer, 1);
#ifdef Libburn_disc_with_incomplete_sessioN
if (d->last_track_no <= 0 ||
d->complete_sessions + d->incomplete_sessions <= 0 ||
d->status == BURN_DISC_BLANK)
{ret = 2; goto ex;}
#else
if (d->last_track_no <= 0 || d->complete_sessions <= 0 ||
d->status == BURN_DISC_BLANK)
{ret = 2; goto ex;}
#endif /* ! Libburn_disc_with_incomplete_sessioN */
if (d->last_track_no > BURN_MMC_FAKE_TOC_MAX_SIZE) {
msg = calloc(1, 160);
if (msg != NULL) {
@ -1274,18 +1298,34 @@ int mmc_fake_toc(struct burn_drive *d)
d->disc = burn_disc_create();
if (d->disc == NULL)
{ret = -1; goto ex;}
d->toc_entries = d->last_track_no + d->complete_sessions;
d->toc_entries = d->last_track_no
+ d->complete_sessions + d->incomplete_sessions;
d->toc_entry = calloc(d->toc_entries, sizeof(struct burn_toc_entry));
if (d->toc_entry == NULL)
{ret = -1; goto ex;}
memset(d->toc_entry, 0,d->toc_entries * sizeof(struct burn_toc_entry));
#ifdef Libburn_disc_with_incomplete_sessioN
for (i = 0; i < d->complete_sessions + d->incomplete_sessions; i++) {
#else
for (i = 0; i < d->complete_sessions; i++) {
#endif
session = burn_session_create();
if (session == NULL)
{ret = -1; goto ex;}
burn_disc_add_session(d->disc, session, BURN_POS_END);
burn_session_free(session);
}
#ifdef Libburn_disc_with_incomplete_sessioN
d->disc->incomplete_sessions = d->incomplete_sessions;
#endif
memset(size_data, 0, 4);
memset(start_data, 0, 4);
@ -1328,7 +1368,16 @@ int mmc_fake_toc(struct burn_drive *d)
entry;
}
#ifdef Libburn_disc_with_incomplete_sessioN
if (session_number > d->complete_sessions) {
#else
if (session_number > d->disc->sessions) {
#endif
if (i == d->last_track_no - 1) {
/* ts A70212 : Last track field Free Blocks */
burn_drive_set_media_capacity_remaining(d,
@ -1336,7 +1385,18 @@ int mmc_fake_toc(struct burn_drive *d)
((off_t) 2048));
d->media_lba_limit = 0;
}
#ifdef Libburn_disc_with_incomplete_sessioN
if (session_number > d->disc->sessions )
continue;
#else
continue;
#endif
}
entry = &(d->toc_entry[i + session_number - 1]);
@ -1354,12 +1414,16 @@ int mmc_fake_toc(struct burn_drive *d)
memcpy(end_data, tdata + 28, 4);
mmc_fake_toc_entry(entry, session_number, i + 1,
size_data, start_data, end_data);
entry->track_status_bits = tdata[5] | (tdata[6] << 8) |
(tdata[7] << 16);
entry->extensions_valid |= 4;
if (prev_session != session_number)
d->disc->session[session_number - 1]->firsttrack = i+1;
d->disc->session[session_number - 1]->lasttrack = i+1;
prev_session = session_number;
}
if (prev_session > 0 && prev_session <= d->disc->sessions) {
/* leadout entry of last session of closed disc */
entry = &(d->toc_entry[(d->last_track_no - 1) + prev_session]);
@ -2024,16 +2088,28 @@ regard_as_blank:;
d->current_profile == 0x12 || d->current_profile == 0x43)
d->status = BURN_DISC_BLANK;
#ifdef Libburn_disc_with_incomplete_sessioN
/* ts B30112 : number of open sessions */
d->incomplete_sessions = 0;
#endif
if (d->status == BURN_DISC_BLANK) {
d->last_track_no = 1; /* The "incomplete track" */
d->complete_sessions = 0;
} else {
/* ts A70131 : number of non-empty sessions */
/* ts A70131 : number of closed sessions */
d->complete_sessions = number_of_sessions;
/* mmc5r03c.pdf 6.22.3.1.3 State of Last Session: 3=complete */
if (d->state_of_last_session != 3 && d->complete_sessions >= 1)
if (d->state_of_last_session != 3 &&
d->complete_sessions >= 1) {
d->complete_sessions--;
#ifdef Libburn_disc_with_incomplete_sessioN
d->incomplete_sessions++;
#endif
}
/* ts A70129 : mmc5r03c.pdf 6.22.3.1.7
This includes the "incomplete track" if the disk is
appendable. I.e number of complete tracks + 1. */
@ -2193,6 +2269,15 @@ void mmc_read_atip(struct burn_drive *d)
d->erasable = !!(data[6]&64);
d->start_lba = burn_msf_to_lba(data[8],data[9],data[10]);
d->end_lba = burn_msf_to_lba(data[12],data[13],data[14]);
/* ts B21124 : LITE-ON LTR-48125S returns crap on pressed
audio CD and CD-ROM
*/
if (d->start_lba >= d->end_lba) {
d->start_lba = 0;
d->end_lba = 0;
}
if (data[6]&4) {
if (speed_value[(data[16]>>4)&7] > 0) {
d->mdata->min_write_speed =
@ -2319,29 +2404,165 @@ ex:;
BURN_FREE_MEM(c);
}
void mmc_read_sectors(struct burn_drive *d,
int start,
int len,
const struct burn_read_opts *o, struct buffer *buf)
int mmc_eval_read_error(struct burn_drive *d, struct command *c, char *what,
int start_m, int start_s, int start_f,
int end_m, int end_s, int end_f, int flag)
{
int temp;
int req;
char *msg = NULL;
int key, asc, ascq, silent;
if (!c->error)
return 0;
msg = calloc(1, 256);
if (msg != NULL) {
if (start_s < 0 || start_f < 0 || end_s < 0 || end_f < 0) {
sprintf(msg,
"SCSI error on %s(%d,%d): ", what, start_m, end_m);
} else {
sprintf(msg, "SCSI error on %s(%dm%ds%df,%dm%ds%df): ",
what,
start_m, start_s, start_f, end_m, end_s, end_f);
}
scsi_error_msg(d, c->sense, 14, msg + strlen(msg),
&key, &asc, &ascq);
silent = (d->silent_on_scsi_error == 1);
if (key == 5 && asc == 0x64 && ascq == 0x0) {
d->had_particular_error |= 1;
silent = 1;
}
if(!silent)
libdax_msgs_submit(libdax_messenger,
d->global_index,
0x00020144,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
free(msg);
}
return BE_CANCELLED;
}
/* ts B21119 : Derived from older mmc_read_sectors()
@param flag bit0= set DAP bit (also with o->dap_bit)
*/
int mmc_read_cd_msf(struct burn_drive *d,
int start_m, int start_s, int start_f,
int end_m, int end_s, int end_f,
int sec_type, int main_ch,
const struct burn_read_opts *o, struct buffer *buf, int flag)
{
int req, ret, dap_bit;
int report_recovered_errors = 0, subcodes_audio = 0, subcodes_data = 0;
struct command *c;
c = &(d->casual_command);
mmc_start_if_needed(d, 0);
if (mmc_function_spy(d, "mmc_read_sectors") <= 0)
return;
if (mmc_function_spy(d, "mmc_read_cd_msf") <= 0)
return -1;
/* ts A61009 : to be ensured by callers */
/* a ssert(len >= 0); */
dap_bit = flag & 1;
if (o != NULL) {
report_recovered_errors = o->report_recovered_errors;
subcodes_audio = o->subcodes_audio;
subcodes_data = o->subcodes_data;
dap_bit |= o->dap_bit;
}
/* if the drive isn't busy, why the hell are we here? */
/* ts A61006 : i second that question */
/* a ssert(d->busy); */
scsi_init_command(c, MMC_READ_CD_MSF, sizeof(MMC_READ_CD_MSF));
c->retry = 1;
c->opcode[1] = ((sec_type & 7) << 2) | ((!!dap_bit) << 1);
c->opcode[3] = start_m;
c->opcode[4] = start_s;
c->opcode[5] = start_f;
c->opcode[6] = end_m;
c->opcode[7] = end_s;
c->opcode[8] = end_f;
req = main_ch & 0xf8;
/* ts A61106 : LG GSA-4082B dislikes this. key=5h asc=24h ascq=00h
if (d->busy == BURN_DRIVE_GRABBING || report_recovered_errors)
req |= 2;
*/
c->opcode[9] = req;
c->opcode[10] = 0;
/* always read the subcode, throw it away later, since we don't know
what we're really reading
*/
/* >>> ts B21125 : This is very obscure:
MMC-3 has sub channel selection 001b as "RAW"
MMC-5 does neither mention 001b nor "RAW".
And why should a non-grabbed drive get here ?
*/
if (d->busy == BURN_DRIVE_GRABBING || subcodes_audio || subcodes_data)
c->opcode[10] = 1;
/* <<< ts B21125 : test with sub channel selection 100b
no data, only sub channel
c->opcode[9] = 0;
c->opcode[10] = 4;
Did not help either with reading before LBA -150
*/
/* <<< ts B21125 : test with sub channel selection 001b and no user data
c->opcode[9] = 0;
c->opcode[10] = 1;
*/
c->page = buf;
c->dir = FROM_DRIVE;
d->issue_command(d, c);
ret = mmc_eval_read_error(d, c, "read_cd_msf",
start_m, start_s, start_f,
end_m, end_s, end_f, 0);
return ret;
}
/* ts B21119 : Derived from older mmc_read_sectors()
@param flag bit0= set DAP bit (also with o->dap_bit)
*/
int mmc_read_cd(struct burn_drive *d, int start, int len,
int sec_type, int main_ch,
const struct burn_read_opts *o, struct buffer *buf, int flag)
{
int temp, req, ret, dap_bit;
int report_recovered_errors = 0, subcodes_audio = 0, subcodes_data = 0;
struct command *c;
/* # define Libburn_read_cd_by_msF 1 */
#ifdef Libburn_read_cd_by_msF
int start_m, start_s, start_f, end_m, end_s, end_f;
burn_lba_to_msf(start, &start_m, &start_s, &start_f);
burn_lba_to_msf(start + len, &end_m, &end_s, &end_f);
ret = mmc_read_cd_msf(d, start_m, start_s, start_f,
end_m, end_s, end_f,
sec_type, main_ch, o, buf, flag);
return ret;
#endif /* Libburn_read_cd_by_msF */
c = &(d->casual_command);
mmc_start_if_needed(d, 0);
if (mmc_function_spy(d, "mmc_read_cd") <= 0)
return -1;
dap_bit = flag & 1;
if (o != NULL) {
report_recovered_errors = o->report_recovered_errors;
subcodes_audio = o->subcodes_audio;
subcodes_data = o->subcodes_data;
dap_bit |= o->dap_bit;
}
scsi_init_command(c, MMC_READ_CD, sizeof(MMC_READ_CD));
c->retry = 1;
c->opcode[1] = ((sec_type & 7) << 2) | ((!!dap_bit) << 1);
temp = start;
c->opcode[5] = temp & 0xFF;
temp >>= 8;
@ -2355,26 +2576,41 @@ void mmc_read_sectors(struct burn_drive *d,
c->opcode[7] = len & 0xFF;
len >>= 8;
c->opcode[6] = len & 0xFF;
req = 0xF8;
req = main_ch & 0xf8;
/* ts A61106 : LG GSA-4082B dislikes this. key=5h asc=24h ascq=00h
if (d->busy == BURN_DRIVE_GRABBING || o->report_recovered_errors)
if (d->busy == BURN_DRIVE_GRABBING || report_recovered_errors)
req |= 2;
*/
c->opcode[9] = req;
c->opcode[10] = 0;
/* always read the subcode, throw it away later, since we don't know
what we're really reading
*/
if (d->busy == BURN_DRIVE_GRABBING || (o->subcodes_audio)
|| (o->subcodes_data))
/* >>> ts B21125 : This is very obscure:
MMC-3 has sub channel selection 001b as "RAW"
MMC-5 does neither mention 001b nor "RAW".
And why should a non-grabbed drive get here ?
*/
if (d->busy == BURN_DRIVE_GRABBING || subcodes_audio || subcodes_data)
c->opcode[10] = 1;
c->opcode[9] = req;
/* <<< ts B21125 : test with sub channel selection 100b
c->opcode[10] = 4;
*/
/* <<< ts B21125 : test with sub channel selection 001b and no user data
c->opcode[9] = 0;
c->opcode[10] = 1;
*/
c->page = buf;
c->dir = FROM_DRIVE;
d->issue_command(d, c);
ret = mmc_eval_read_error(d, c, "read_cd", start, -1, -1,
len, -1, -1, 0);
return ret;
}
void mmc_erase(struct burn_drive *d, int fast)
@ -2548,9 +2784,9 @@ void mmc_set_speed(struct burn_drive *d, int r, int w)
if (r <= 0 || w <= 0) {
/* ts A70712 : now searching for best speed descriptor */
if (w > 0 && r <= 0)
burn_drive_get_best_speed(d, r, &best_sd, 1);
burn_drive_get_best_speed(d, r, &best_sd, 1 | 2);
else
burn_drive_get_best_speed(d, w, &best_sd, 0);
burn_drive_get_best_speed(d, w, &best_sd, 2);
if (best_sd != NULL) {
w = best_sd->write_speed;
d->nominal_write_speed = w;
@ -2563,7 +2799,9 @@ void mmc_set_speed(struct burn_drive *d, int r, int w)
d->nominal_write_speed = w;
/* ts A61221 : try to set DVD speed via command B6h */
if (strstr(d->current_profile_text, "DVD") == d->current_profile_text){
if (strstr(d->current_profile_text, "DVD") == d->current_profile_text
||
strstr(d->current_profile_text, "BD") == d->current_profile_text) {
ret = mmc_set_streaming(d, r, w, end_lba);
if (ret != 0)
return; /* success or really fatal failure */
@ -3719,10 +3957,22 @@ no_suitable_formatting_type:;
goto no_suitable_formatting_type;
format_type = d->format_descriptors[index].type;
if (format_type == 0x30 || format_type == 0x31) {
if (flag & 64)
format_sub_type = 3; /* Quick certification */
else
format_sub_type = 2; /* Full certification */
if ((flag & 64) || !(d->current_feat23h_byte4 & 3)) {
format_sub_type = 0;
if (!(flag & 64))
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x0002019e,
LIBDAX_MSGS_SEV_NOTE,
LIBDAX_MSGS_PRIO_HIGH,
"Drive does not support media certification",
0, 0);
} else {
/* With Certification */
if (d->current_feat23h_byte4 & 1)
format_sub_type = 2; /* Full */
else
format_sub_type = 3; /* Quick */
}
}
#ifdef Libburn_bd_re_format_olD
@ -3819,6 +4069,11 @@ unsuitable_media:;
}
#endif /* Libburn_do_not_format_dvd_ram_or_bd_rE */
/* <<<
fprintf(stderr, "\nlibburn_DEBUG: FORMAT UNIT temporarily disabled.\n");
ret = 1; goto ex;
*/
d->issue_command(d, c);
if (c->error && !tolerate_failure) {
spc_decode_sense(c->sense, 0, &key, &asc, &ascq);
@ -3826,6 +4081,11 @@ unsuitable_media:;
sprintf(msg, "SCSI error on format_unit(%s): ", descr);
scsi_error_msg(d, c->sense, 14, msg + strlen(msg),
&key, &asc, &ascq);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020122,
LIBDAX_MSGS_SEV_FAILURE, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
}
{ret = 0; goto ex;}
} else if ((!c->error) && (format_type == 0x13 || format_type == 0x15))
@ -3848,8 +4108,10 @@ ex:;
/* ts A61225 */
/* @param flag bit0= register speed descriptors
*/
static int mmc_get_write_performance_al(struct burn_drive *d,
int *alloc_len, int *max_descr)
int *alloc_len, int *max_descr, int flag)
{
struct buffer *buf = NULL;
int len, i, b, num_descr, ret, old_alloc_len;
@ -3932,7 +4194,7 @@ static int mmc_get_write_performance_al(struct burn_drive *d,
pd = c->page->data;
if (num_descr > *max_descr)
num_descr = *max_descr;
for (i = 0; i < num_descr; i++) {
for (i = 0; i < num_descr && (flag & 1); i++) {
exact_bit = !!(pd[8 + i*16] & 2);
end_lba = read_speed = write_speed = 0;
for (b = 0; b < 4 ; b++) {
@ -4007,15 +4269,25 @@ int mmc_get_write_performance(struct burn_drive *d)
return 0;
/* first command execution to learn number of descriptors and
dxfer_len */
ret = mmc_get_write_performance_al(d, &alloc_len, &max_descr);
dxfer_len
*/
ret = mmc_get_write_performance_al(d, &alloc_len, &max_descr, 0);
if (max_descr > 0 && ret > 0) {
/* Some drives announce only 1 descriptor if asked for 0.
So ask twice for non-0 descriptors.
*/
ret = mmc_get_write_performance_al(d, &alloc_len, &max_descr,
0);
}
/*
fprintf(stderr,"LIBBURN_DEBUG: ACh alloc_len = %d , ret = %d\n",
alloc_len, ret);
*/
if (max_descr > 0 && ret > 0)
/* second execution with announced length */
ret = mmc_get_write_performance_al(d, &alloc_len, &max_descr);
/* final execution with announced length */
max_descr = (alloc_len - 8) / 16;
ret = mmc_get_write_performance_al(d, &alloc_len, &max_descr,
1);
return ret;
}
@ -4191,7 +4463,7 @@ int mmc_read_10(struct burn_drive *d, int start,int amount, struct buffer *buf)
{
struct command *c;
char *msg = NULL;
int key, asc, ascq;
int key, asc, ascq, silent;
c = &(d->casual_command);
mmc_start_if_needed(d, 0);
@ -4212,6 +4484,8 @@ int mmc_read_10(struct burn_drive *d, int start,int amount, struct buffer *buf)
c->page->sectors = 0;
c->dir = FROM_DRIVE;
d->issue_command(d, c);
/* <<< replace by mmc_eval_read_error */;
if (c->error) {
msg = calloc(1, 256);
if (msg != NULL) {
@ -4219,7 +4493,12 @@ int mmc_read_10(struct burn_drive *d, int start,int amount, struct buffer *buf)
"SCSI error on read_10(%d,%d): ", start, amount);
scsi_error_msg(d, c->sense, 14, msg + strlen(msg),
&key, &asc, &ascq);
if(!d->silent_on_scsi_error)
silent = (d->silent_on_scsi_error == 1);
if (key == 5 && asc == 0x64 && ascq == 0x0) {
d->had_particular_error |= 1;
silent = 1;
}
if(!silent)
libdax_msgs_submit(libdax_messenger,
d->global_index,
0x00020144,
@ -4236,6 +4515,77 @@ int mmc_read_10(struct burn_drive *d, int start,int amount, struct buffer *buf)
}
#ifdef Libburn_develop_quality_scaN
/* B21108 ts : Vendor specific command REPORT ERROR RATE, see
http://liggydee.cdfreaks.com/ddl/errorcheck.pdf
*/
int mmc_nec_optiarc_f3(struct burn_drive *d, int sub_op,
int start_lba, int rate_period,
int *ret_lba, int *error_rate1, int *error_rate2)
{
struct buffer *buf = NULL;
struct command *c;
char *msg = NULL;
int key, asc, ascq, ret;
static unsigned char MMC_NEC_OPTIARC_F3[] =
{ 0xF3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
BURN_ALLOC_MEM(buf, struct buffer, 1);
BURN_ALLOC_MEM(c, struct command, 1);
mmc_start_if_needed(d, 0);
if (mmc_function_spy(d, "mmc_nec_optiarc_f3") <= 0)
return -1;
scsi_init_command(c, MMC_NEC_OPTIARC_F3, sizeof(MMC_NEC_OPTIARC_F3));
if (sub_op == 3) {
c->dxfer_len = 8;
c->dir = FROM_DRIVE;
} else {
c->dxfer_len = 0;
c->dir = NO_TRANSFER;
}
c->retry = 0;
c->opcode[1] = sub_op;
mmc_int_to_four_char(c->opcode + 2, start_lba);
c->opcode[8] = rate_period;
c->page = buf;
c->page->bytes = 0;
c->page->sectors = 0;
d->issue_command(d, c);
if (c->error) {
msg = calloc(1, 256);
if (msg != NULL) {
sprintf(msg,
"SCSI error on nec_optiarc_f3(%d, %d, %d): ",
sub_op, start_lba, rate_period);
scsi_error_msg(d, c->sense, 14, msg + strlen(msg),
&key, &asc, &ascq);
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020144,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
free(msg);
}
return BE_CANCELLED;
}
if (sub_op == 3) {
*ret_lba = mmc_four_char_to_int(c->page->data);
*error_rate1 = c->page->data[4] * 256 + c->page->data[5];
*error_rate2 = c->page->data[6] * 256 + c->page->data[7];
}
ret = 1;
ex:;
BURN_FREE_MEM(c);
BURN_FREE_MEM(buf);
return ret;
}
#endif /* Libburn_develop_quality_scaN */
/* ts A81210 : Determine the upper limit of readable data size */
int mmc_read_capacity(struct burn_drive *d)
{
@ -4711,7 +5061,7 @@ int mmc_setup_drive(struct burn_drive *d)
d->read_toc = mmc_read_toc;
d->write = mmc_write;
d->erase = mmc_erase;
d->read_sectors = mmc_read_sectors;
d->read_cd = mmc_read_cd;
d->perform_opc = mmc_perform_opc;
d->set_speed = mmc_set_speed;
d->send_cue_sheet = mmc_send_cue_sheet;
@ -4764,6 +5114,11 @@ int mmc_setup_drive(struct burn_drive *d)
d->disc_info_valid = 0;
d->num_format_descr = 0;
d->complete_sessions = 0;
#ifdef Libburn_disc_with_incomplete_sessioN
d->incomplete_sessions = 0;
#endif
d->state_of_last_session = -1;
d->last_track_no = 1;
d->media_capacity_remaining = 0;

View File

@ -36,9 +36,9 @@ void mmc_erase(struct burn_drive *, int);
void mmc_read_toc(struct burn_drive *);
void mmc_read_disc_info(struct burn_drive *);
void mmc_read_atip(struct burn_drive *);
void mmc_read_sectors(struct burn_drive *,
int,
int, const struct burn_read_opts *, struct buffer *);
int mmc_read_cd(struct burn_drive *d, int start, int len,
int sec_type, int main_ch,
const struct burn_read_opts *o, struct buffer *buf, int flag);
void mmc_set_speed(struct burn_drive *, int, int);
void mmc_read_lead_in(struct burn_drive *, struct buffer *);
void mmc_perform_opc(struct burn_drive *);
@ -128,4 +128,11 @@ int mmc_get_leadin_text(struct burn_drive *d,
unsigned char **text_packs, int *num_packs, int flag);
#ifdef Libburn_develop_quality_scaN
/* B21108 ts */
int mmc_nec_optiarc_f3(struct burn_drive *d, int sub_op,
int start_lba, int rate_period,
int *eba, int *error_rate1, int *error_rate2);
#endif
#endif /*__MMC*/

View File

@ -93,6 +93,7 @@ struct burn_read_opts *burn_read_opts_new(struct burn_drive *drive)
opts->report_recovered_errors = 0;
opts->transfer_damaged_blocks = 0;
opts->hardware_error_retries = 3;
opts->dap_bit = 0;
return opts;
}

View File

@ -129,6 +129,14 @@ struct burn_read_opts
/** The number of retries the hardware should make to correct
errors. */
unsigned char hardware_error_retries;
/* ts B21119 */
/* >>> Needs API access */
/** Whether to set DAP bit which allows drive to apply
"flaw obscuring mechanisms like audio data mute and interpolate"
*/
unsigned int dap_bit;
};
#endif /* BURN__OPTIONS_H */

View File

@ -5,7 +5,8 @@
Unknown POSIX like systems
with the dummy MMC transport adapter sg-dummy.c
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
Copyright (C) 2009 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPLv2+
*/
@ -16,18 +17,16 @@
#define BURN_OS_SIGNAL_MACRO_LIST \
SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, \
SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, \
SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, \
SIGTTOU
SIGUSR1, SIGUSR2, SIGXCPU
/* Once as text 1:1 list of strings for messages and interpreters */
#define BURN_OS_SIGNAL_NAME_LIST \
"SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", \
"SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", \
"SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", \
"SIGTTOU"
"SIGUSR1", "SIGUSR2", "SIGXCPU"
/* The number of above list items */
#define BURN_OS_SIGNAL_COUNT 16
#define BURN_OS_SIGNAL_COUNT 13
/** The list of all signals which shall surely not be caught.
It depends on the particular signal whether it can be ignored or whether
@ -55,11 +54,12 @@
/** The combined list of all signals which shall not be caught.
*/
#define BURN_OS_NON_SIGNAL_MACRO_LIST \
SIGKILL, SIGCHLD, SIGSTOP BURN_OS_SIG_WINCH BURN_OS_SIG_URG
SIGKILL, SIGCHLD, SIGSTOP, SIGTSTP, SIGCONT, SIGTTIN, SIGTTOU \
BURN_OS_SIG_WINCH BURN_OS_SIG_URG
/* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT \
( 3 + BURN_OS_SIG_WINCH_CNT + BURN_OS_SIG_URG_CNT )
( 7 + BURN_OS_SIG_WINCH_CNT + BURN_OS_SIG_URG_CNT )
/* The maximum size for a (SCSI) i/o transaction */

View File

@ -4,8 +4,8 @@
by os.h in case of compilation for
FreeBSD with CAM
Copyright (C) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>,
provided under GPLv2+
Copyright (C) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>,
Provided under GPLv2+
*/
/** List of all signals which shall be caught by signal handlers and trigger
@ -15,29 +15,25 @@
#define BURN_OS_SIGNAL_MACRO_LIST \
SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, \
SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, \
SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, \
SIGTTOU, \
SIGBUS, SIGPROF, SIGSYS, SIGTRAP, \
SIGVTALRM, SIGXCPU, SIGXFSZ
SIGUSR1, SIGUSR2, SIGXCPU, SIGBUS, SIGPROF, \
SIGSYS, SIGTRAP, SIGVTALRM, SIGXCPU, SIGXFSZ
/* Once as text 1:1 list of strings for messages and interpreters */
#define BURN_OS_SIGNAL_NAME_LIST \
"SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", \
"SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", \
"SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", \
"SIGTTOU", \
"SIGBUS", "SIGPROF", "SIGSYS", "SIGTRAP", \
"SIGVTALRM", "SIGXCPU", "SIGXFSZ"
"SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGBUS", "SIGPROF", \
"SIGSYS", "SIGTRAP", "SIGVTALRM", "SIGXCPU", "SIGXFSZ"
/* The number of above list items */
#define BURN_OS_SIGNAL_COUNT 23
#define BURN_OS_SIGNAL_COUNT 20
/** To list all signals which shall surely not be caught */
#define BURN_OS_NON_SIGNAL_MACRO_LIST \
SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
SIGKILL, SIGCHLD, SIGSTOP, SIGTSTP, SIGCONT, SIGTTIN, SIGTTOU, SIGURG, SIGWINCH
/* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT 5
#define BURN_OS_NON_SIGNAL_COUNT 9
/* The maximum size for a (SCSI) i/o transaction */

View File

@ -5,7 +5,8 @@
Unknown X/Open-like systems
with GNU libcdio MMC transport adapter sg-libcdio.c
Copyright (C) 2009 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
Copyright (C) 2009 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPLv2+
*/
@ -16,18 +17,16 @@
#define BURN_OS_SIGNAL_MACRO_LIST \
SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, \
SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, \
SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, \
SIGTTOU
SIGUSR1, SIGUSR2, SIGXCPU
/* Once as text 1:1 list of strings for messages and interpreters */
#define BURN_OS_SIGNAL_NAME_LIST \
"SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", \
"SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", \
"SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", \
"SIGTTOU"
"SIGUSR1", "SIGUSR2", "SIGXCPU"
/* The number of above list items */
#define BURN_OS_SIGNAL_COUNT 16
#define BURN_OS_SIGNAL_COUNT 13
/** The list of all signals which shall surely not be caught.
@ -56,11 +55,12 @@
/** The combined list of all signals which shall not be caught.
*/
#define BURN_OS_NON_SIGNAL_MACRO_LIST \
SIGKILL, SIGCHLD, SIGSTOP BURN_OS_SIG_WINCH BURN_OS_SIG_URG
SIGKILL, SIGCHLD, SIGSTOP, SIGTSTP, SIGCONT, SIGTTIN, SIGTTOU \
BURN_OS_SIG_WINCH BURN_OS_SIG_URG
/* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT \
( 3 + BURN_OS_SIG_WINCH_CNT + BURN_OS_SIG_URG_CNT )
( 7 + BURN_OS_SIG_WINCH_CNT + BURN_OS_SIG_URG_CNT )
/* The maximum size for a (SCSI) i/o transaction */

View File

@ -4,7 +4,7 @@
by os.h in case of compilation for
Linux kernels 2.4 and 2.6, GNU/Linux SCSI Generic (sg)
Copyright (C) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -16,29 +16,27 @@
#define BURN_OS_SIGNAL_MACRO_LIST \
SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, \
SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, \
SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, \
SIGTTOU, \
SIGBUS, SIGPOLL, SIGPROF, SIGSYS, SIGTRAP, \
SIGVTALRM, SIGXCPU, SIGXFSZ
SIGUSR1, SIGUSR2, SIGXCPU, SIGBUS, SIGPOLL, \
SIGPROF, SIGSYS, SIGTRAP, SIGVTALRM, SIGXCPU, \
SIGXFSZ
/* Once as text 1:1 list of strings for messages and interpreters */
#define BURN_OS_SIGNAL_NAME_LIST \
"SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", \
"SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", \
"SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", \
"SIGTTOU", \
"SIGBUS", "SIGPOLL", "SIGPROF", "SIGSYS", "SIGTRAP", \
"SIGVTALRM", "SIGXCPU", "SIGXFSZ"
"SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGBUS", "SIGPOLL", \
"SIGPROF", "SIGSYS", "SIGTRAP", "SIGVTALRM", "SIGXCPU", \
"SIGXFSZ"
/* The number of above list items */
#define BURN_OS_SIGNAL_COUNT 24
#define BURN_OS_SIGNAL_COUNT 21
/** To list all signals which shall surely not be caught */
#define BURN_OS_NON_SIGNAL_MACRO_LIST \
SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
SIGKILL, SIGCHLD, SIGSTOP, SIGTSTP, SIGCONT, SIGURG, SIGWINCH, SIGTTIN, SIGTTOU
/* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT 5
#define BURN_OS_NON_SIGNAL_COUNT 9
/* The maximum size for a (SCSI) i/o transaction */

View File

@ -5,7 +5,8 @@
Solaris based systems, e.g. SunOS 5.11
with Solaris uscsi MMC transport adapter sg-solaris.c
Copyright (C) 2010 Thomas Schmitt <scdbackup@gmx.net>, provided under GPLv2+
Copyright (C) 2010 - 2013 Thomas Schmitt <scdbackup@gmx.net>
provided under GPLv2+
*/
@ -16,25 +17,23 @@
#define BURN_OS_SIGNAL_MACRO_LIST \
SIGHUP, SIGINT, SIGQUIT, SIGILL, SIGABRT, \
SIGFPE, SIGSEGV, SIGPIPE, SIGALRM, SIGTERM, \
SIGUSR1, SIGUSR2, SIGXCPU, SIGTSTP, SIGTTIN, \
SIGTTOU
SIGUSR1, SIGUSR2, SIGXCPU
/* Once as text 1:1 list of strings for messages and interpreters */
#define BURN_OS_SIGNAL_NAME_LIST \
"SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGABRT", \
"SIGFPE", "SIGSEGV", "SIGPIPE", "SIGALRM", "SIGTERM", \
"SIGUSR1", "SIGUSR2", "SIGXCPU", "SIGTSTP", "SIGTTIN", \
"SIGTTOU"
"SIGUSR1", "SIGUSR2", "SIGXCPU"
/* The number of above list items */
#define BURN_OS_SIGNAL_COUNT 16
#define BURN_OS_SIGNAL_COUNT 13
/** To list all signals which shall surely not be caught */
#define BURN_OS_NON_SIGNAL_MACRO_LIST \
SIGKILL, SIGCHLD, SIGSTOP, SIGURG, SIGWINCH
SIGKILL, SIGCHLD, SIGSTOP, SIGTSTP, SIGCONT, SIGTTIN, SIGTTOU, SIGURG, SIGWINCH
/* The number of above list items */
#define BURN_OS_NON_SIGNAL_COUNT 5
#define BURN_OS_NON_SIGNAL_COUNT 9
/* The maximum size for a (SCSI) i/o transaction */

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -36,6 +36,7 @@
#include "init.h"
#include "toc.h"
#include "util.h"
#include "mmc.h"
#include "sg.h"
#include "read.h"
#include "options.h"
@ -158,6 +159,8 @@ drive, or only store a subset of the _opts structs in drives */
drive_lba);
/* >>> ts A61009 : ensure page.sectors >= 0 before calling */
/* >>> ts B21123 : Would now be d->read_cd() with
with sectype = 0 , mainch = 0xf8 */
d->r ead_sectors(d, drive_lba, page.sectors, o, &page);
printf("Read %d\n", page.sectors);
@ -472,6 +475,11 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
cpy_size = data_size - *data_count;
if (flag & 2)
d->silent_on_scsi_error = 1;
if (flag & 16) {
d->had_particular_error &= ~1;
if (!d->silent_on_scsi_error)
d->silent_on_scsi_error = 2;
}
if (d->drive_role == 1) {
err = d->read_10(d, start, chunksize, d->buffer);
} else {
@ -481,9 +489,11 @@ int burn_read_data(struct burn_drive *d, off_t byte_address,
if (ret <= 0)
err = BE_CANCELLED;
}
if (flag & 2)
if (flag & (2 | 16))
d->silent_on_scsi_error = sose_mem;
if (err == BE_CANCELLED) {
if ((flag & 16) && (d->had_particular_error & 1))
{ret = -3; goto ex;}
/* Try to read a smaller part of the chunk */
if(!(flag & 4))
for (i = 0; i < chunksize - 1; i++) {
@ -528,3 +538,144 @@ ex:;
d->busy = BURN_DRIVE_IDLE;
return ret;
}
/* ts B21119 : API function*/
int burn_read_audio(struct burn_drive *d, int sector_no,
char data[], off_t data_size, off_t *data_count, int flag)
{
int alignment = 2352, start, upto, chunksize = 1, err, cpy_size, i;
int sose_mem = 0, ret;
char msg[81], *wpt;
struct buffer *buf = NULL, *buffer_mem = d->buffer;
BURN_ALLOC_MEM(buf, struct buffer, 1);
*data_count = 0;
sose_mem = d->silent_on_scsi_error;
if (d->released) {
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020142,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Drive is not grabbed on random access read", 0, 0);
{ret = 0; goto ex;}
}
if (d->drive_role != 1) {
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020146,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Drive is a virtual placeholder (stdio-drive or null-drive)",
0, 0);
{ret = 0; goto ex;}
}
if ((data_size % alignment) != 0) {
sprintf(msg,
"Audio read size not properly aligned (%d bytes)",
alignment);
libdax_msgs_submit(libdax_messenger, d->global_index,
0x0002019d,
LIBDAX_MSGS_SEV_SORRY, LIBDAX_MSGS_PRIO_HIGH,
msg, 0, 0);
{ret = 0; goto ex;}
}
if (d->busy != BURN_DRIVE_IDLE) {
libdax_msgs_submit(libdax_messenger,
d->global_index, 0x00020145,
LIBDAX_MSGS_SEV_FATAL, LIBDAX_MSGS_PRIO_HIGH,
"Drive is busy on attempt to read audio", 0, 0);
{ret = 0; goto ex;}
}
d->busy = BURN_DRIVE_READING_SYNC;
d->buffer = buf;
start = sector_no;
upto = start + data_size / alignment;
wpt = data;
for (; start < upto; start += chunksize) {
chunksize = upto - start;
if (chunksize > (BUFFER_SIZE / alignment))
chunksize = (BUFFER_SIZE / alignment);
cpy_size = chunksize * alignment;
if (flag & 2)
d->silent_on_scsi_error = 1;
if (flag & 16) {
d->had_particular_error &= ~1;
if (!d->silent_on_scsi_error)
d->silent_on_scsi_error = 2;
}
err = d->read_cd(d, start, chunksize, 1, 0x10, NULL, d->buffer,
(flag & 8) >> 3);
if (flag & (2 | 16))
d->silent_on_scsi_error = sose_mem;
if (err == BE_CANCELLED) {
if ((flag & 16) && (d->had_particular_error & 1))
{ret = -3; goto ex;}
if(!(flag & 4))
for (i = 0; i < chunksize - 1; i++) {
if (flag & 2)
d->silent_on_scsi_error = 1;
err = d->read_cd(d, start + i, 1, 1, 0x10,
NULL, d->buffer, (flag & 8) >> 3);
if (flag & 2)
d->silent_on_scsi_error = sose_mem;
if (err == BE_CANCELLED)
break;
memcpy(wpt, d->buffer->data, alignment);
wpt += alignment;
*data_count += alignment;
}
ret = 0; goto ex;
}
memcpy(wpt, d->buffer->data, cpy_size);
wpt += cpy_size;
*data_count += cpy_size;
}
ret = 1;
ex:
BURN_FREE_MEM(buf);
d->buffer = buffer_mem;
d->busy = BURN_DRIVE_IDLE;
return ret;
}
#ifdef Libburn_develop_quality_scaN
/* B21108 ts */
int burn_nec_optiarc_rep_err_rate(struct burn_drive *d,
int start_lba, int rate_period, int flag)
{
int ret, lba = 0, error_rate1 = 0, error_rate2 = 0, enabled = 0, dret;
/* Sub Operation Code 1 : Enable Error Rate reporting function */
ret = mmc_nec_optiarc_f3(d, 1, start_lba, rate_period,
&lba, &error_rate1, &error_rate2);
if (ret <= 0)
goto ex;
enabled = 1;
/* >>> Sub Operation Code 2 : Seek to starting address
start_lba , rate_period
*/;
/* >>> Loop with Sub Operation Code 3 : Send Error Rate information
reply: 4-byte LBA , 2-byte C1/PIE , 2-byte C2/PIF
*/;
ret = 1;
ex:;
if (enabled) {
/* Code F : Disable Error Rate reporting function */
dret = mmc_nec_optiarc_f3(d, 0xf, 0, 0,
&lba, &error_rate1, &error_rate2);
if (dret < ret)
ret = dret;
}
return ret;
}
#endif /* Libburn_develop_quality_scaN */

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/*
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later
and under FreeBSD license revised, i.e. without advertising clause.
*/
@ -448,7 +448,7 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
out.channel = channel_no;
out.lun = lun_no;
out.devname = burn_strdup(fname);
out.devname = strdup(fname);
out.cam = NULL;
out.lock_fd = -1;
@ -477,7 +477,7 @@ static void enumerate_common(char *fname, int bus_no, int host_no,
out.read_toc = mmc_read_toc;
out.write = mmc_write;
out.erase = mmc_erase;
out.read_sectors = mmc_read_sectors;
out.read_cd = mmc_read_cd;
out.perform_opc = mmc_perform_opc;
out.set_speed = mmc_set_speed;
out.send_parameters = spc_select_error_params;
@ -861,8 +861,11 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
memset(&ccb->csio.sense_data, 0, sizeof(ccb->csio.sense_data));
memset(c->sense, 0, sizeof(c->sense));
c->start_time = burn_get_time(0);
err = cam_send_ccb(d->cam, ccb);
c->end_time = burn_get_time(0);
ignore_error = sense_len = 0;
/* ts B00325 : CAM_AUTOSNS_VALID advised by Alexander Motin */
if (ccb->ccb_h.status & CAM_AUTOSNS_VALID) {
@ -959,19 +962,12 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
c->sense[13] = 0x00;
done = 1;
}
/* >>> Need own duration time measurement.
Then remove bit1 from flag.
*/
done = scsi_eval_cmd_outcome(d, c, fp, c->sense,
sense_len, 0, start_time,
timeout_ms, i,
2 | !!ignore_error);
if (d->cancel)
done = 1;
} else {
done = 1;
}
done = scsi_eval_cmd_outcome(d, c, fp, c->sense,
sense_len, start_time,
timeout_ms, i, !!ignore_error);
if (d->cancel)
done = 1;
} while (!done);
ret = 1;
ex:;

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/*
Copyright (c) 2009 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2009 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -669,9 +669,12 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
for(i = 0; !done; i++) {
memset(c->sense, 0, sizeof(c->sense));
c->start_time = burn_get_time(0);
i_status = mmc_run_cmd(p_cdio, timeout_ms, &cdb, e_direction,
dxfer_len, c->page->data);
c->end_time = burn_get_time(0);
sense_valid = mmc_last_cmd_sense(p_cdio, &sense_pt);
if (sense_valid >= 18) {
memcpy(c->sense, (unsigned char *) sense_pt,
@ -717,7 +720,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
else
sense_len = 0;
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len,
0, start_time, timeout_ms, i, 2);
start_time, timeout_ms, i, 0);
if (d->cancel)
done = 1;

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -404,13 +404,13 @@ static int sgio_log_cmd(unsigned char *cmd, int cmd_len, FILE *fp_in, int flag)
/* ts B11110 */
static int sgio_log_reply(unsigned char *opcode, int data_dir,
unsigned char *data, int dxfer_len,
void *fp_in, unsigned char sense[18],
int sense_len, int duration, int flag)
void *fp_in, unsigned char sense[18], int sense_len,
double duration, int flag)
{
int ret;
ret = scsi_log_reply(opcode, data_dir, data, dxfer_len, fp_in,
sense, sense_len, duration, flag);
sense, sense_len, duration, flag);
return ret;
}
@ -420,6 +420,7 @@ static int sgio_test(int fd)
unsigned char test_ops[] = { 0, 0, 0, 0, 0, 0 };
sg_io_hdr_t s;
int ret;
double c_start_time, c_end_time;
memset(&s, 0, sizeof(sg_io_hdr_t));
s.interface_id = 'S';
@ -430,10 +431,12 @@ static int sgio_test(int fd)
sgio_log_cmd(s.cmdp, s.cmd_len, NULL, 0);
c_start_time = burn_get_time(0);
ret= ioctl(fd, SG_IO, &s);
c_end_time = burn_get_time(0);
sgio_log_reply(s.cmdp, NO_TRANSFER, NULL, 0,
NULL, s.sbp, s.sb_len_wr, s.duration, 0);
sgio_log_reply(s.cmdp, NO_TRANSFER, NULL, 0, NULL,
s.sbp, s.sb_len_wr, c_end_time - c_start_time, 0);
return ret;
}
@ -446,6 +449,7 @@ static int sgio_inquiry_cd_drive(int fd, char *fname)
unsigned char *sense = NULL;
char *msg = NULL, *msg_pt;
int ret = 0, i;
double c_start_time, c_end_time;
BURN_ALLOC_MEM(buf, struct buffer, 1);
BURN_ALLOC_MEM(sense, unsigned char, 128);
@ -465,7 +469,9 @@ static int sgio_inquiry_cd_drive(int fd, char *fname)
sgio_log_cmd(s.cmdp, s.cmd_len, NULL, 0);
c_start_time = burn_get_time(0);
ret = ioctl(fd, SG_IO, &s);
c_end_time = burn_get_time(0);
if (ret == -1) {
sprintf(msg,
"INQUIRY on '%s' : ioctl(SG_IO) failed , errno= %d",
@ -476,8 +482,8 @@ static int sgio_inquiry_cd_drive(int fd, char *fname)
goto ex;
}
sgio_log_reply(s.cmdp, FROM_DRIVE, buf->data, s.dxfer_len,
NULL, s.sbp, s.sb_len_wr, s.duration, 0);
sgio_log_reply(s.cmdp, FROM_DRIVE, buf->data, s.dxfer_len, NULL,
s.sbp, s.sb_len_wr, c_end_time - c_start_time, 0);
if (s.sb_len_wr > 0 || s.host_status != Libburn_sg_host_oK ||
s.driver_status != Libburn_sg_driver_oK) {
@ -1992,8 +1998,12 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
for(i = 0; !done; i++) {
memset(c->sense, 0, sizeof(c->sense));
c->start_time = burn_get_time(0);
err = ioctl(d->fd, SG_IO, &s);
c->end_time = burn_get_time(0);
/* ts A61010 */
/* a ssert(err != -1); */
if (err == -1) {
@ -2009,7 +2019,7 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
{ret = -1; goto ex;}
}
done = scsi_eval_cmd_outcome(d, c, fp, s.sbp, s.sb_len_wr,
s.duration, start_time, s.timeout, i, 0);
start_time, s.timeout, i, 0);
if (d->cancel)
done = 1;
}

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/*
Copyright (c) 2010 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2010 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -637,8 +637,12 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
for(i = 0; !done; i++) {
memset(c->sense, 0, sizeof(c->sense));
c->start_time = burn_get_time(0);
ret = ioctl(d->fd, USCSICMD, &cgc);
c->end_time = burn_get_time(0);
/* For cgc.uscsi_status see SAM-3 5.3.1, Table 22
0 = GOOD , 2 = CHECK CONDITION : Sense Data are delivered
8 = BUSY
@ -669,8 +673,8 @@ int sg_issue_command(struct burn_drive *d, struct command *c)
sense_len = 18;
else
sense_len = 0;
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len, 0,
start_time, timeout_ms, i, 2);
done = scsi_eval_cmd_outcome(d, c, fp, c->sense, sense_len,
start_time, timeout_ms, i, 0);
if (d->cancel)
done = 1;

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -33,6 +33,7 @@
#include "debug.h"
#include "options.h"
#include "init.h"
#include "util.h"
#include "libdax_msgs.h"
extern struct libdax_msgs *libdax_messenger;
@ -1003,6 +1004,9 @@ int burn_scsi_setup_drive(struct burn_drive *d, int bus_no, int host_no,
/* ts A61106 */
d->silent_on_scsi_error = 0;
/* ts B21023 */
d->had_particular_error = 0;
d->idata = calloc(1, sizeof(struct burn_scsi_inquiry_data));
d->mdata = calloc(1, sizeof(struct scsi_mode_data));
@ -1459,10 +1463,20 @@ static char *scsi_command_name(unsigned int c, int flag)
return "READ DISC STRUCTURE";
case 0xb6:
return "SET STREAMING";
case 0xb9:
return "READ CD MSF";
case 0xbb:
return "SET CD SPEED";
case 0xbe:
return "READ CD";
#ifdef Libburn_develop_quality_scaN
case 0xf3:
return "NEC/OPTIARC REPORT ERROR RATE";
#endif /* Libburn_develop_quality_scaN */
}
return "(NOT IN LIBBURN COMMAND LIST)";
}
@ -1576,7 +1590,7 @@ int scsi_show_command_reply(unsigned char *opcode, int data_dir,
if (data_dir != FROM_DRIVE)
return 2;
if (opcode[0] == 0x28 || opcode[0] == 0x3C ||
opcode[0] == 0xA8 || opcode[0] == 0xBE) {
opcode[0] == 0xA8 || opcode[0] == 0xB9 || opcode[0] == 0xBE) {
/* READ commands */
/* >>> report amount of data */;
@ -1636,9 +1650,8 @@ int scsi_log_cmd(struct command *c, void *fp_in, int flag)
*/
int scsi_log_reply(unsigned char *opcode, int data_dir, unsigned char *data,
int dxfer_len, void *fp_in, unsigned char sense[18],
int sense_len, int duration, int flag)
int sense_len, double duration, int flag)
{
char durtxt[20];
FILE *fp = fp_in;
int key, asc, ascq, i, l;
@ -1654,20 +1667,18 @@ int scsi_log_reply(unsigned char *opcode, int data_dir, unsigned char *data,
for (i = 0 ; i < l; i++)
fprintf(fp, " %2.2X", sense[i]);
fprintf(fp, "\n");
durtxt[0] = 0;
if (!(flag & 2))
sprintf(durtxt, " (%6d ms)", duration);
spc_decode_sense(sense, 0, &key, &asc, &ascq);
fprintf(fp, "+++ key=%X asc=%2.2Xh ascq=%2.2Xh%s\n",
fprintf(fp, "+++ key=%X asc=%2.2Xh ascq=%2.2Xh\n",
(unsigned int) key, (unsigned int) asc,
(unsigned int) ascq, durtxt);
(unsigned int) ascq);
} else {
scsi_show_command_reply(opcode, data_dir, data,
dxfer_len, fp, 0);
if (!(flag & 2))
fprintf(fp,"%6d ms\n", duration);
}
if (!(flag & 2))
fprintf(fp, " %8.f us [ %.f ]\n",
duration * 1.0e6,
(burn_get_time(0) - lib_start_time) * 1.0e6);
if (burn_sg_log_scsi & 4)
fflush(fp);
}
@ -1685,16 +1696,19 @@ int scsi_log_reply(unsigned char *opcode, int data_dir, unsigned char *data,
@param flag bit0 causes an error message
bit1 do not print duration
*/
int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18],
int sense_len, int duration, int flag)
int scsi_log_err(struct burn_drive *d, struct command *c,
void *fp_in, unsigned char sense[18],
int sense_len, int flag)
{
int ret;
unsigned char *data = NULL;
if (c->page != NULL)
data = c->page->data;
ret= scsi_log_reply(c->opcode, c->dir, data, c->dxfer_len ,
fp_in, sense, sense_len, duration, flag);
fp_in, sense, sense_len,
c->end_time - c->start_time, flag);
return ret;
}
@ -1707,7 +1721,7 @@ int scsi_log_err(struct command *c, void *fp_in, unsigned char sense[18],
*/
int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp,
unsigned char *sense, int sense_len,
int duration, time_t start_time, int timeout_ms,
time_t start_time, int timeout_ms,
int loop_count, int flag)
{
enum response outcome;
@ -1715,7 +1729,7 @@ int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp,
char *msg = NULL;
if (burn_sg_log_scsi & 3)
scsi_log_err(c, fp, sense, sense_len, duration,
scsi_log_err(d, c, fp, sense, sense_len,
(sense_len > 0) | (flag & 2));
if (sense_len <= 0)
{done = 1; goto ex;}

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -87,15 +87,16 @@ int scsi_log_cmd(struct command *c, void *fp, int flag);
*/
int scsi_log_reply(unsigned char *opcode, int data_dir, unsigned char *data,
int dxfer_len, void *fp_in, unsigned char sense[18],
int sense_len, int duration, int flag);
int sense_len, double duration, int flag);
/* ts A91221 (former sg_log_err ts A91108) */
/** Legacy frontend to scsi_log_reply().
@param flag bit0 causes an error message
bit1 do not print duration
*/
int scsi_log_err(struct command *c, void *fp, unsigned char sense[18],
int sense_len, int duration, int flag);
int scsi_log_err(struct burn_drive *d, struct command *c,
void *fp, unsigned char sense[18],
int sense_len, int flag);
/* ts B00728 */
int spc_decode_sense(unsigned char *sense, int senselen,
@ -109,7 +110,7 @@ int spc_decode_sense(unsigned char *sense, int senselen,
*/
int scsi_eval_cmd_outcome(struct burn_drive *d, struct command *c, void *fp_in,
unsigned char *sense, int sense_len,
int duration, time_t start_time, int timeout_ms,
time_t start_time, int timeout_ms,
int loop_count, int flag);

View File

@ -65,6 +65,11 @@ struct burn_disc *burn_disc_create(void)
d->refcnt = 1;
d->sessions = 0;
d->session = NULL;
#ifdef Libburn_disc_with_incomplete_sessioN
d->incomplete_sessions= 0;
#endif
return d;
}
@ -691,10 +696,37 @@ void burn_session_get_leadout_entry(struct burn_session *s,
struct burn_session **burn_disc_get_sessions(struct burn_disc *d, int *num)
{
#ifdef Libburn_disc_with_incomplete_sessioN
*num = d->sessions - d->incomplete_sessions;
#else
*num = d->sessions;
#endif
return d->session;
}
/* ts B30112 : API */
int burn_disc_get_incomplete_sessions(struct burn_disc *d)
{
#ifdef Libburn_disc_with_incomplete_sessioN
return d->incomplete_sessions;
#else
return 0;
#endif
}
struct burn_track **burn_session_get_tracks(struct burn_session *s, int *num)
{
*num = s->tracks;
@ -737,11 +769,11 @@ int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag)
ret = 1;
goto ex;
}
track_offset = burn_session_get_start_tno(d->session[0], 0);
if (track_offset <= 0)
track_offset = 1;
for (sidx = 0; sidx < d->sessions; sidx++) {
track_offset = burn_session_get_start_tno(d->session[sidx], 0);
if (track_offset <= 0)
track_offset = 1;
if (d->session[sidx] == NULL) {
sprintf(msg, "d->session[%d of %d] == NULL",
sidx, d->sessions);

View File

@ -144,6 +144,11 @@ struct burn_disc
{
int sessions;
struct burn_session **session;
#ifdef Libburn_disc_with_incomplete_sessioN
int incomplete_sessions;
#endif
int refcnt;
};

View File

@ -147,7 +147,11 @@ void toc_find_modes(struct burn_drive *d)
lba = burn_msf_to_lba(e->pmin, e->psec,
e->pframe);
mem->sectors = 1;
ts B21119 : Would now be d->read_cd() with
with sectype = 0 , mainch = 0xf8
d->read_sectors(d, lba, mem.sectors, &o, mem);
t->mode = sector_identify(mem->data);
*/
}

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -65,6 +65,10 @@ struct command
int retry;
struct buffer *page;
int timeout; /* milliseconds */
double start_time;
double end_time;
};
struct burn_scsi_inquiry_data
@ -261,8 +265,18 @@ struct burn_drive
volatile int released;
/* ts A61106 */
/* 0= report errors
1= do not report errors
2= do not report errors which the libburn function indicates in
member .had_particular_error
*/
int silent_on_scsi_error;
/* ts B21023 */
/* bit0= 5 64 00 occured with READ10 in mmc_read_10()
*/
int had_particular_error;
int stdio_fd;
int nwa; /* next writeable address */
@ -277,6 +291,12 @@ struct burn_drive
/* ts A90107 */
int state_of_last_session;
#ifdef Libburn_disc_with_incomplete_sessioN
/* ts B30112 */
int incomplete_sessions;
#endif
/* ts A70129 :
from 51h READ DISC INFORMATION Last Track Number in Last Session */
int last_track_no;
@ -372,10 +392,10 @@ struct burn_drive
int is_stopped;
void (*read_disc_info) (struct burn_drive *);
void (*read_sectors) (struct burn_drive *,
int start,
int len,
const struct burn_read_opts *, struct buffer *);
int (*read_cd) (struct burn_drive *, int start, int len,
int sec_type, int main_ch,
const struct burn_read_opts *, struct buffer *,
int flag);
void (*perform_opc) (struct burn_drive *);
void (*set_speed) (struct burn_drive *, int, int);
void (*send_parameters) (struct burn_drive *,

View File

@ -1,6 +1,6 @@
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2010 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
*/
@ -15,6 +15,10 @@
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
/* ts A80914 : This is unneeded. Version info comes from libburn.h.
#include "v ersion.h"
@ -23,42 +27,6 @@
#include "util.h"
#include "libburn.h"
char *burn_strdup(char *s)
{
char *ret;
int l;
/* ts A61008 */
/* a ssert(s); */
if (s == NULL)
return NULL;
l = strlen(s) + 1;
ret = calloc(1, l);
memcpy(ret, s, l);
return ret;
}
char *burn_strndup(char *s, int n)
{
char *ret;
int l;
/* ts A61008 */
/* a ssert(s); */
/* a ssert(n > 0); */
if (s == NULL || n <= 0)
return NULL;
l = strlen(s);
ret = calloc(1, l < n ? l : n);
memcpy(ret, s, l < n - 1 ? l : n - 1);
ret[n - 1] = '\0';
return ret;
}
void burn_version(int *major, int *minor, int *micro)
{
@ -364,3 +332,49 @@ char *burn_printify(char *msg)
return msg;
}
/* ts B30521 */
void burn_int_to_lsb(int val, char *target)
{
unsigned char *buf;
buf = (unsigned char *) target;
buf[0] = val & 0xff;
buf[1] = (val >> 8) & 0xff;
buf[2] = (val >> 16) & 0xff;
buf[3] = (val >> 24) & 0xff;
}
/* ts B30609 */
double burn_get_time(int flag)
{
int ret;
struct timeval tv;
#ifdef Libburn_use_clock_gettime_monotoniC
#ifdef _POSIX_TIMERS
#ifdef _POSIX_MONOTONIC_CLOCK
/* Enable by
export CFLAGS=-DLibburn_use_clock_gettime_monotoniC
export LIBS=-lrt
./configure ... && make clean && make
*/
struct timespec tp;
ret = clock_gettime(CLOCK_MONOTONIC, &tp);
if (ret == 0)
return ((double) tp.tv_sec) + ((double) tp.tv_nsec) * 1.0e-9;
#endif /* _POSIX_MONOTONIC_CLOCK */
#endif /* _POSIX_TIMERS */
#endif /* Xorriso_use_clock_gettime_monotoniC */
ret = gettimeofday(&tv, NULL);
if (ret == 0)
return ((double) tv.tv_sec) + ((double) tv.tv_usec) * 1.0e-6;
return (double) time(NULL);
}

View File

@ -1,10 +1,6 @@
#ifndef __UTIL
#define __UTIL
char *burn_strdup(char *s);
char *burn_strndup(char *s, int n);
/* ts A90905 */
int burn_util_make_printable_word(char **text, int flag);
@ -12,4 +8,10 @@ int burn_util_make_printable_word(char **text, int flag);
char *burn_sfile_fgets(char *line, int maxl, FILE *fp);
char *burn_printify(char *msg);
/* ts B30521 */
void burn_int_to_lsb(int val, char *target);
/* ts B30609 */
double burn_get_time(int flag);
#endif

View File

@ -76,11 +76,15 @@ extern struct libdax_msgs *libdax_messenger;
/* The size to be used with BD-RE media in normal, not streamed mode.
*/
#define Libburn_bd_re_obS (32 * 1024)
#define Libburn_bd_re_obS (64 * 1024)
/* The size to be used with BD-RE media in streamed mode.
/* The size to be used with BD-R media in normal, not streamed mode.
*/
#define Libburn_bd_re_streamed_obS (64 * 1024)
#define Libburn_bd_r_obS (64 * 1024)
/* The size to be used with BD-RE and BD-R media in streamed mode.
*/
#define Libburn_bd_streamed_obS (64 * 1024)
static int type_to_ctrl(int mode)
@ -1861,7 +1865,7 @@ int burn_dvd_write_track(struct burn_write_opts *o,
struct burn_drive *d = o->drive;
struct buffer *out = d->buffer;
int sectors;
int i, open_ended = 0, ret= 0, is_flushed = 0;
int i, open_ended = 0, ret= 0, is_flushed = 0, track_open = 0;
int first_buf_cap = 0, further_cap = 0, buf_cap_step = 1024;
/* ts A70213 : eventually expand size of track to max */
@ -1889,6 +1893,7 @@ int burn_dvd_write_track(struct burn_write_opts *o,
if (ret <= 0)
goto ex;
}
track_open = 1;
sectors = burn_track_get_sectors_2(t, 1);
open_ended = burn_track_is_open_ended(t);
@ -1971,7 +1976,7 @@ int burn_dvd_write_track(struct burn_write_opts *o,
ex:;
if (d->cancel)
burn_source_cancel(t->source);
if (!is_flushed)
if (track_open && !is_flushed)
d->sync_cache(d); /* burn_write_flush() was not called */
return ret;
}
@ -2306,7 +2311,7 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
if (o->obs_pad < 2)
o->obs_pad = 1;
if (d->current_profile == 0x43) /* BD-RE */
o->obs = Libburn_bd_re_streamed_obS;
o->obs = Libburn_bd_streamed_obS;
}
} else if (d->current_profile == 0x13) {
@ -2384,10 +2389,12 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
}
/* ??? padding needed ??? cowardly doing it for now */
if (o->obs_pad < 2)
o->obs_pad = 1; /* fill-up track's last 32k buffer */
o->obs_pad = 1; /* fill-up track's last obs buffer */
if (d->current_profile == 0x41) /* BD-R */
o->obs = Libburn_bd_r_obS;
if (d->do_stream_recording) {
if (d->current_profile == 0x41) /* BD-R */
o->obs = Libburn_bd_re_streamed_obS;
o->obs = Libburn_bd_streamed_obS;
}
}
@ -2417,10 +2424,10 @@ int burn_dvd_write_sync(struct burn_write_opts *o,
if (d->do_stream_recording &&
(d->current_profile == 0x43 || d->current_profile == 0x41) &&
o->obs < Libburn_bd_re_streamed_obS) {
o->obs < Libburn_bd_streamed_obS) {
/* LG GGW-H20 writes junk with stream recording and obs=32k */
sprintf(msg,
"Stream recording disabled because of small OS buffer");
"Stream recording disabled because of small output buffer");
libdax_msgs_submit(libdax_messenger, d->global_index,
0x00020176, LIBDAX_MSGS_SEV_NOTE,
LIBDAX_MSGS_PRIO_HIGH, msg, 0, 0);

View File

@ -7,8 +7,9 @@
telltoc is a minimal demo application for the library libburn as provided
on http://libburnia-project.org . It can list the available devices, can
display some drive properties, the type of media, eventual table of content
and multisession info for mkisofs option -C .
display some drive properties, the type of media, eventual table of content,
multisession info for mkisofs option -C, and can read audio or data tracks.
It's main purpose, nevertheless, is to show you how to use libburn and also
to serve the libburn team as reference application. telltoc.c does indeed
define the standard way how above gestures can be implemented and stay upward
@ -25,8 +26,9 @@
telltoc_media() prints some information about the media in a drive
telltoc_toc() prints a table of content (if there is content)
telltoc_msinfo() prints parameters for mkisofs option -C
telltoc_read_and_print() reads from data CD or from DVD and prints 7-bit
to stdout (encodings 0,2) or 8-bit to file (encoding 1)
telltoc_read_and_print() reads from audio or data CD or from DVD or BD
and prints 7-bit to stdout (encodings 0,2) or 8-bit to
file (encoding 1)
When everything is done, main() releases the drive and shuts down libburn:
burn_drive_release();
burn_finish()
@ -75,9 +77,10 @@ int telltoc_aquire_by_adr(char *drive_adr);
int telltoc_aquire_by_driveno(int *drive_no, int silent);
/* A message from --toc to --read_and_print (CD tracksize is a bit tricky) */
/* Messages from --toc to --read_and_print (CD tracksize is a bit tricky) */
static int last_track_start = 0, last_track_size = -1;
static int media_is_cd_profile = 0;
static int medium_is_cd_profile = 0; /* 0 = undecided , -1 = no , 1 = yes */
static int cd_is_audio = 0; /* 0 = undecided , -1 = no , 1 = yes */
/* ------------------------------- API gestures ---------------------------- */
@ -116,10 +119,6 @@ int telltoc_aquire_by_adr(char *drive_adr)
int ret;
char libburn_drive_adr[BURN_DRIVE_ADR_LEN];
/* <<< ts A70907 FOR TESTING ONLY !
struct burn_drive_info *test_drive_list;
*/
/* This tries to resolve links or alternative device files */
ret = burn_drive_convert_fs_adr(drive_adr, libburn_drive_adr);
if (ret<=0) {
@ -128,10 +127,6 @@ int telltoc_aquire_by_adr(char *drive_adr)
return 0;
}
/* <<< ts A70907 FOR TESTING ONLY !
ret = burn_drive_scan_and_grab(&test_drive_list, "/dev/sg2", 1);
*/
fprintf(stderr,"Aquiring drive '%s' ...\n", libburn_drive_adr);
ret = burn_drive_scan_and_grab(&drive_list, libburn_drive_adr, 1);
@ -143,10 +138,6 @@ int telltoc_aquire_by_adr(char *drive_adr)
drive_is_grabbed = 1;
}
/* <<< ts A70907 FOR TESTING ONLY !
burn_drive_info_free(test_drive_list);
*/
return ret;
}
@ -464,12 +455,25 @@ int telltoc_formatlist(struct burn_drive *drive)
}
void telltoc_detect_cd(struct burn_drive *drive)
{
int pno;
char profile_name[80];
if (burn_disc_get_profile(drive, &pno, profile_name) > 0) {
if (pno >= 0x08 && pno <= 0x0a)
medium_is_cd_profile = 1;
else
medium_is_cd_profile = -1;
}
}
int telltoc_toc(struct burn_drive *drive)
{
int num_sessions = 0 , num_tracks = 0 , lba = 0, pmin, psec, pframe;
int track_count = 0, pno;
int track_count = 0, track_is_audio;
int session_no, track_no;
char profile_name[80];
struct burn_disc *disc= NULL;
struct burn_session **sessions;
struct burn_track **tracks;
@ -499,10 +503,20 @@ int telltoc_toc(struct burn_drive *drive)
pframe = toc_entry.pframe;
lba= burn_msf_to_lba(pmin, psec, pframe);
}
if ((toc_entry.control & 7) < 4) {
if (cd_is_audio == 0)
cd_is_audio = 1;
track_is_audio = 1;
} else {
track_is_audio = 0;
cd_is_audio = -1;
}
printf("Media content: session %2d ", session_no+1);
printf("track %2d %s lba: %9d %4.2d:%2.2d:%2.2d\n",
track_count,
((toc_entry.control&7)<4?"audio":"data "),
(track_is_audio ? "audio" : "data "),
lba, pmin, psec, pframe);
last_track_start = lba;
}
@ -521,10 +535,7 @@ int telltoc_toc(struct burn_drive *drive)
printf("leadout lba: %9d %4.2d:%2.2d:%2.2d\n",
lba, pmin, psec, pframe);
last_track_size = lba - last_track_start;
if (burn_disc_get_profile(drive, &pno, profile_name) > 0)
if (pno == 0x09 || pno == 0x0a)
media_is_cd_profile = 1;
telltoc_detect_cd(drive);
}
if (disc!=NULL)
burn_disc_free(disc);
@ -597,27 +608,26 @@ int telltoc_read_and_print(struct burn_drive *drive,
int start_sector, int sector_count, char *raw_file, int encoding)
{
int j, i, request = 16, done, lbas = 0, final_cd_try = -1, todo;
int ret = 0;
int ret = 0, sector_size, chunk_size, read_audio = 0;
char buf[16 * 2048], line[81];
off_t data_count, total_count= 0, last_reported_count= 0;
struct stat stbuf;
FILE *raw_fp = NULL;
if (medium_is_cd_profile == 0)
telltoc_detect_cd(drive);
if (start_sector == -1)
start_sector = last_track_start;
if (sector_count == -1) {
sector_count = last_track_start + last_track_size
- start_sector;
if (media_is_cd_profile) /* In case it is a TAO track */
if (medium_is_cd_profile > 0) /* In case it is a TAO track */
final_cd_try = 0; /* allow it (-1 is denial) */
}
if (start_sector < 0)
start_sector = 0;
if (sector_count <= 0)
sector_count = 2147483632;
if (sector_count <= 0)
return -1;
if (encoding == 1) {
if (stat(raw_file,&stbuf) != -1) {
if (!(S_ISCHR(stbuf.st_mode) || S_ISFIFO(stbuf.st_mode)
@ -640,16 +650,45 @@ int telltoc_read_and_print(struct burn_drive *drive,
printf(
"Data : start=%ds , count=%ds , read=0 , encoding=%d\n",
start_sector, sector_count, encoding);
/* Whether to read audio or data */
if (cd_is_audio > 0) {
read_audio = 1;
} else if (medium_is_cd_profile > 0 && cd_is_audio == 0) {
/* Try whether the start sector is audio */
ret = burn_read_audio(drive, start_sector,
buf, (off_t) 2352, &data_count, 2 | 4);
if (ret > 0)
read_audio = 1;
}
if (read_audio) {
sector_size = 2352;
chunk_size = 12;
} else {
sector_size = 2048;
chunk_size = 16;
if (start_sector < 0)
start_sector = 0;
}
todo = sector_count - 2*(final_cd_try > -1);
for (done = 0; done < todo && final_cd_try != 1; done += request) {
if (todo - done > 16)
request = 16;
if (todo - done > chunk_size)
request = chunk_size;
else
request = todo - done;
ret = burn_read_data(drive,
((off_t) start_sector + done) * (off_t) 2048,
buf, (off_t) (request * 2048), &data_count, 1);
if (read_audio) {
ret = burn_read_audio(drive, start_sector + done,
buf, (off_t) (request * sector_size),
&data_count, 0);
} else {
ret = burn_read_data(drive,
((off_t) start_sector + done) *
(off_t) sector_size,
buf, (off_t) (request * sector_size),
&data_count, 1);
}
print_result:;
total_count += data_count;
if (encoding == 1) {
@ -658,8 +697,8 @@ print_result:;
} else for (i = 0; i < data_count; i += 16) {
if (encoding == 0) {
sprintf(line, "%8ds + %4d : ",
start_sector + done + i / 2048,
i % 2048);
start_sector + done + i / sector_size,
i % sector_size);
lbas = strlen(line);
}
for (j = 0; j < 16 && i + j < data_count; j++) {
@ -675,11 +714,11 @@ print_result:;
printf("%s\n",line);
}
if (encoding == 1 &&
total_count - last_reported_count >= 1000 * 2048) {
total_count - last_reported_count >= 1000 * sector_size) {
fprintf(stderr,
"\rReading data : start=%ds , count=%ds , read=%ds ",
start_sector, sector_count,
(int) (total_count / (off_t) 2048));
(int) (total_count / (off_t) sector_size));
last_reported_count = total_count;
}
if (ret <= 0) {
@ -687,13 +726,21 @@ print_result:;
break;
}
}
if (ret > 0 && media_is_cd_profile && final_cd_try == 0) {
if (ret > 0 && medium_is_cd_profile > 0 && final_cd_try == 0) {
/* In a SAO track the last 2 frames should be data too */
final_cd_try = 1;
burn_read_data(drive,
((off_t) start_sector + todo) * (off_t) 2048,
buf, (off_t) (2 * 2048), &data_count, 2);
if (data_count < 2 * 2048)
if (read_audio) {
ret = burn_read_audio(drive, start_sector + todo,
buf, (off_t) (2 * sector_size),
&data_count, 2);
} else {
burn_read_data(drive,
((off_t) start_sector + todo) *
(off_t) sector_size,
buf, (off_t) (2 * sector_size),
&data_count, 2);
}
if (data_count < 2 * sector_size)
fprintf(stderr, "\rNOTE : Last two frames of CD track unreadable. This is normal if TAO track.\n");
if (data_count > 0)
goto print_result;
@ -702,7 +749,8 @@ print_result:;
fprintf(stderr,
"\r \r");
printf("End Of Data : start=%ds , count=%ds , read=%ds\n",
start_sector, sector_count,(int) (total_count / (off_t) 2048));
start_sector, sector_count,
(int) (total_count / (off_t) sector_size));
return ret;
}
@ -808,10 +856,10 @@ int telltoc_setup(int argc, char **argv)
printf(" mkisofs ... -C \"$msinfo\" ...\n");
printf("Obtain what is available about drive 0 and its media\n");
printf(" %s --drive 0\n",argv[0]);
printf("View blocks 16 to 19 of data CD or DVD in human readable form\n");
printf("View blocks 16 to 19 of audio or data CD or DVD or BD in human readable form\n");
printf(" %s --drive /dev/sr1 --read_and_print 16 4 0 | less\n",
argv[0]);
printf("Copy last data track from CD to file /tmp/data\n");
printf("Copy last track from CD to file /tmp/data\n");
printf(" %s --drive /dev/sr1 --toc --read_and_print -1 -1 raw:/tmp/data\n",
argv[0]);
}
@ -891,7 +939,7 @@ int main(int argc, char **argv)
if (ret<=0)
{ret = 38; goto release_drive; }
}
if (read_start >= -1 && (read_count > 0 || read_count == -1)) {
if (read_start != -2 && (read_count > 0 || read_count == -1)) {
ret = telltoc_read_and_print(drive_list[driveno].drive,
read_start, read_count, print_raw_file,
print_encoding);