Compare commits
90 Commits
Author | SHA1 | Date | |
---|---|---|---|
56bbe41a62 | |||
c0d00dfc98 | |||
3a5f14590e | |||
7241d55a12 | |||
9afa5379e5 | |||
b08075479e | |||
2b74f6fa63 | |||
8f60105c8d | |||
f8be7e46ab | |||
f9793c54c2 | |||
870b71377d | |||
8eed2e9558 | |||
abe560a6ec | |||
2a991bbab3 | |||
b46f7157de | |||
9aaca05499 | |||
bd381583de | |||
e2188fb9f7 | |||
fd8f4d48b8 | |||
0eb24d293f | |||
f1ef0a1995 | |||
0178c42c20 | |||
21511e3fdf | |||
744da88c3c | |||
3ab91cb93b | |||
19cbdde95f | |||
167d73e268 | |||
1887b0b938 | |||
0b932e5f7d | |||
ecd303149f | |||
8f500d90df | |||
644feceb5c | |||
eb03488f52 | |||
a252038113 | |||
ca3f994dcb | |||
7f8d8a04d0 | |||
2fd5af75eb | |||
cf363b27fa | |||
469ab7bf21 | |||
ac2bfec065 | |||
c566ea03cf | |||
3632e1be4e | |||
f18b832a82 | |||
1f92419cb4 | |||
d6e15a0139 | |||
e0db790103 | |||
9bc362f59b | |||
44d5f3ce4e | |||
0f43a39a45 | |||
0a1a085471 | |||
a1fdfe1519 | |||
bbb6315af0 | |||
40d83b2314 | |||
c82ac0a825 | |||
46b598abd2 | |||
c7784b79b7 | |||
f1b3184531 | |||
a18c862e84 | |||
c2903ab717 | |||
04ccaebff7 | |||
2e83dc554b | |||
3a17a8a014 | |||
ffca3e89dd | |||
676231c362 | |||
d76c715df7 | |||
9aa47792e0 | |||
f4cfe9b267 | |||
6f19122672 | |||
057f24d5b9 | |||
a843727bc7 | |||
bb409500ed | |||
1a74a05965 | |||
2df7f3d5d5 | |||
0728d855d5 | |||
100be5078c | |||
5139bf922a | |||
a2b4361d69 | |||
d216764867 | |||
4c74cbf7b3 | |||
7ed8619a9e | |||
fa2508bfd5 | |||
72ae8e3b5a | |||
fa95326bac | |||
eb86e5298a | |||
4cfa8170ee | |||
d885d9a408 | |||
6a23213113 | |||
89edfaf875 | |||
1297525889 | |||
5397f85d38 |
56
ChangeLog
56
ChangeLog
@ -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
|
||||
|
@ -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
45
README
@ -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.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
@ -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
|
||||
|
@ -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"
|
@ -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"
|
||||
|
@ -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
@ -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> </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> </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>
|
||||
|
@ -1 +1 @@
|
||||
#define Cdrskin_timestamP "2012.07.08.103007"
|
||||
#define Cdrskin_timestamP "2013.08.07.093001"
|
||||
|
@ -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:
|
||||
|
@ -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."
|
||||
|
58
configure.ac
58
configure.ac
@ -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
|
||||
|
@ -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 :
|
||||
|
@ -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++)
|
||||
|
1780
doc/doxygen.conf.in
1780
doc/doxygen.conf.in
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
}
|
||||
|
||||
|
662
libburn/cdtext.c
662
libburn/cdtext.c
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
159
libburn/file.c
159
libburn/file.c
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 ,
|
||||
|
@ -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*/
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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:
|
||||
|
429
libburn/mmc.c
429
libburn/mmc.c
@ -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;
|
||||
|
@ -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*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
@ -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 */
|
||||
|
155
libburn/read.c
155
libburn/read.c
@ -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 */
|
||||
|
||||
|
@ -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:;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;}
|
||||
|
@ -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);
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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);
|
||||
*/
|
||||
}
|
||||
|
@ -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 *,
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
148
test/telltoc.c
148
test/telltoc.c
@ -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);
|
||||
|
Reference in New Issue
Block a user