Compare commits
59 Commits
1.2.4
...
1.3.0.pl01
Author | SHA1 | Date | |
---|---|---|---|
1612e037ca | |||
64baafc17e | |||
b4c2f450d1 | |||
ae0dd31ae6 | |||
311d5347e1 | |||
da046bc232 | |||
5c1ef0d55a | |||
5c2c4e3b40 | |||
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 |
39
ChangeLog
39
ChangeLog
@ -1,10 +1,41 @@
|
||||
SVN trunk (to become libburn-1.2.4 or higher)
|
||||
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
|
||||
* 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
|
||||
|
||||
libburn-1.2.2.tar.gz Mon Apr 02 2012
|
||||
===============================================================================
|
||||
|
@ -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 - B20720
|
||||
## cdrskin construction site - ts A60816 - B30517
|
||||
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
|
||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_2_4
|
||||
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_3_0
|
||||
|
||||
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
|
||||
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking
|
||||
|
33
README
33
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.0.pl01.tar.gz
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
@ -19,10 +19,10 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
|
||||
|
||||
From tarball
|
||||
|
||||
Obtain libburn-1.2.4.tar.gz, take it to a directory of your choice and do:
|
||||
Obtain libburn-1.3.0.pl01.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf libburn-1.2.4.tar.gz
|
||||
cd libburn-1.2.4
|
||||
tar xzf libburn-1.3.0.pl01.tar.gz
|
||||
cd libburn-1.3.0
|
||||
./configure --prefix=/usr
|
||||
make
|
||||
|
||||
@ -681,11 +681,32 @@ 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 releae 1.2.4:
|
||||
- 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.
|
||||
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
@ -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.4.tar.gz
|
||||
http://scdbackup.sourceforge.net/cdrskin-1.3.0.pl01.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.4.tar.gz, take it to a directory of your choice and do:
|
||||
Obtain cdrskin-1.3.0.pl01.tar.gz, take it to a directory of your choice and do:
|
||||
|
||||
tar xzf cdrskin-1.2.4.tar.gz
|
||||
cd cdrskin-1.2.4
|
||||
tar xzf cdrskin-1.3.0.pl01.tar.gz
|
||||
cd cdrskin-1.3.0
|
||||
|
||||
Within that directory execute:
|
||||
|
||||
@ -576,7 +576,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.4"
|
||||
skin_release="1.3.0"
|
||||
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.5"
|
||||
skin_release="1.3.1"
|
||||
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.0, May 17, 2013"
|
||||
.\" Please adjust this date whenever revising the manpage.
|
||||
.\"
|
||||
.\" Some roff macros, for reference:
|
||||
@ -1243,10 +1243,36 @@ 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.
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
/*
|
||||
cdrskin.c , Copyright 2006-2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
cdrskin.c , Copyright 2006-2013 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
|
||||
A cdrecord compatible command line interface for libburn.
|
||||
@ -87,7 +87,7 @@ or
|
||||
|
||||
/** The official program version */
|
||||
#ifndef Cdrskin_prog_versioN
|
||||
#define Cdrskin_prog_versioN "1.2.4"
|
||||
#define Cdrskin_prog_versioN "1.3.0"
|
||||
#endif
|
||||
|
||||
/** The official libburn interface revision to use.
|
||||
@ -97,10 +97,10 @@ or
|
||||
#define Cdrskin_libburn_majoR 1
|
||||
#endif
|
||||
#ifndef Cdrskin_libburn_minoR
|
||||
#define Cdrskin_libburn_minoR 2
|
||||
#define Cdrskin_libburn_minoR 3
|
||||
#endif
|
||||
#ifndef Cdrskin_libburn_micrO
|
||||
#define Cdrskin_libburn_micrO 4
|
||||
#define Cdrskin_libburn_micrO 0
|
||||
#endif
|
||||
|
||||
|
||||
@ -120,34 +120,34 @@ or
|
||||
#undef Cdrskin_libburn_versioN
|
||||
#endif
|
||||
|
||||
#ifdef Cdrskin_libburn_1_2_4
|
||||
#define Cdrskin_libburn_versioN "1.2.4"
|
||||
#ifdef Cdrskin_libburn_1_3_0
|
||||
#define Cdrskin_libburn_versioN "1.3.0"
|
||||
#endif
|
||||
|
||||
#ifdef Cdrskin_libburn_1_2_5
|
||||
#define Cdrskin_libburn_versioN "1.2.5"
|
||||
#ifdef Cdrskin_libburn_1_3_1
|
||||
#define Cdrskin_libburn_versioN "1.3.1"
|
||||
#endif
|
||||
|
||||
#ifndef Cdrskin_libburn_versioN
|
||||
#define Cdrskin_libburn_1_2_4
|
||||
#define Cdrskin_libburn_versioN "1.2.4"
|
||||
#define Cdrskin_libburn_1_3_0
|
||||
#define Cdrskin_libburn_versioN "1.3.0"
|
||||
#endif
|
||||
|
||||
#ifdef Cdrskin_libburn_1_2_4
|
||||
#ifdef Cdrskin_libburn_1_3_0
|
||||
#undef Cdrskin_libburn_majoR
|
||||
#undef Cdrskin_libburn_minoR
|
||||
#undef Cdrskin_libburn_micrO
|
||||
#define Cdrskin_libburn_majoR 1
|
||||
#define Cdrskin_libburn_minoR 2
|
||||
#define Cdrskin_libburn_micrO 4
|
||||
#define Cdrskin_libburn_minoR 3
|
||||
#define Cdrskin_libburn_micrO 0
|
||||
#endif
|
||||
#ifdef Cdrskin_libburn_1_2_5
|
||||
#ifdef Cdrskin_libburn_1_3_1
|
||||
#undef Cdrskin_libburn_majoR
|
||||
#undef Cdrskin_libburn_minoR
|
||||
#undef Cdrskin_libburn_micrO
|
||||
#define Cdrskin_libburn_majoR 1
|
||||
#define Cdrskin_libburn_minoR 2
|
||||
#define Cdrskin_libburn_micrO 5
|
||||
#define Cdrskin_libburn_minoR 3
|
||||
#define Cdrskin_libburn_micrO 1
|
||||
#endif
|
||||
|
||||
|
||||
@ -2862,11 +2862,13 @@ set_dev:;
|
||||
printf(" input_sheet_v07t=<path> read a Sony CD-TEXT definition file\n");
|
||||
printf(" --list_formats list format descriptors for loaded media.\n");
|
||||
printf(" --list_ignored_options list all ignored cdrecord options.\n");
|
||||
printf(" --list_speeds list speed descriptors for loaded media.\n");
|
||||
printf(" --long_toc print overview of media content\n");
|
||||
printf(" modesty_on_drive=<options> no writing into full drive buffer\n");
|
||||
printf(" --no_abort_handler exit even if the drive is in busy state\n");
|
||||
printf(" --no_blank_appendable refuse to blank appendable CD-RW\n");
|
||||
printf(" --no_convert_fs_adr only literal translations of dev=\n");
|
||||
printf(" --no_load do not try to load the drive tray\n");
|
||||
printf(
|
||||
" --no_rc as first argument: do not read startup files\n");
|
||||
printf(" --obs_pad pad DVD DAO to full 16 or 32 blocks\n");
|
||||
@ -3109,7 +3111,7 @@ set_severities:;
|
||||
int major, minor, micro;
|
||||
|
||||
printf(
|
||||
"Cdrecord 2.01-Emulation Copyright (C) 2006-2012, see libburnia-project.org\n");
|
||||
"Cdrecord 2.01-Emulation Copyright (C) 2006-2013, see libburnia-project.org\n");
|
||||
if(o->fallback_program[0]) {
|
||||
char *hargv[2];
|
||||
|
||||
@ -3334,7 +3336,7 @@ struct CdrskiN {
|
||||
|
||||
int do_scanbus;
|
||||
|
||||
int do_load;
|
||||
int do_load; /* 1= -load , 2= -lock , -1= --no_load */
|
||||
|
||||
int do_checkdrive;
|
||||
|
||||
@ -3342,8 +3344,13 @@ struct CdrskiN {
|
||||
char msifile[Cdrskin_strleN];
|
||||
|
||||
int do_atip;
|
||||
int do_list_speeds;
|
||||
int do_list_formats;
|
||||
|
||||
#ifdef Libburn_develop_quality_scaN
|
||||
int do_qcheck; /* 0= no , 1=nec_optiarc_rep_err_rate */
|
||||
#endif /* Libburn_develop_quality_scaN */
|
||||
|
||||
int do_blank;
|
||||
int blank_fast;
|
||||
int no_blank_appendable;
|
||||
@ -3588,7 +3595,13 @@ int Cdrskin_new(struct CdrskiN **skin, struct CdrpreskiN *preskin, int flag)
|
||||
o->do_msinfo= 0;
|
||||
o->msifile[0]= 0;
|
||||
o->do_atip= 0;
|
||||
o->do_list_speeds= 0;
|
||||
o->do_list_formats= 0;
|
||||
|
||||
#ifdef Libburn_develop_quality_scaN
|
||||
o->do_qcheck= 0;
|
||||
#endif /* Libburn_develop_quality_scaN */
|
||||
|
||||
o->do_blank= 0;
|
||||
o->blank_fast= 0;
|
||||
o->no_blank_appendable= 0;
|
||||
@ -4016,7 +4029,7 @@ int Cdrskin_grab_drive(struct CdrskiN *skin, int flag)
|
||||
mem= skin->drive_is_busy;
|
||||
skin->drive_is_busy= 2;
|
||||
ret= burn_drive_scan_and_grab(&(skin->drives),skin->preskin->device_adr,
|
||||
!(flag&2));
|
||||
(skin->do_load != -1) && !(flag&2));
|
||||
skin->drive_is_busy= mem;
|
||||
if(Cdrskin__is_aborting(0)) {
|
||||
aborted:;
|
||||
@ -4056,7 +4069,7 @@ aborted:;
|
||||
|
||||
mem= skin->drive_is_busy;
|
||||
skin->drive_is_busy= 2;
|
||||
ret= burn_drive_grab(drive,!(flag&2));
|
||||
ret= burn_drive_grab(drive,(skin->do_load != -1) && !(flag&2));
|
||||
skin->drive_is_busy= mem;
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto aborted;
|
||||
@ -4905,7 +4918,7 @@ int Cdrskin_toc(struct CdrskiN *skin, int flag)
|
||||
{
|
||||
int num_sessions= 0,num_tracks= 0,lba= 0,track_count= 0,total_tracks= 0;
|
||||
int session_no, track_no, pmin, psec, pframe, ret, final_ret= 1;
|
||||
int track_offset = 1;
|
||||
int track_offset = 1, open_sessions= 0, have_real_open_session= 0;
|
||||
struct burn_drive *drive;
|
||||
struct burn_disc *disc= NULL;
|
||||
struct burn_session **sessions;
|
||||
@ -4941,21 +4954,32 @@ int Cdrskin_toc(struct CdrskiN *skin, int flag)
|
||||
goto cannot_read;
|
||||
}
|
||||
sessions= burn_disc_get_sessions(disc,&num_sessions);
|
||||
open_sessions= burn_disc_get_incomplete_sessions(disc);
|
||||
if(num_sessions > 0)
|
||||
track_offset = burn_session_get_start_tno(sessions[0], 0);
|
||||
if(track_offset <= 0)
|
||||
track_offset= 1;
|
||||
if(flag&1) {
|
||||
for(session_no= 0; session_no<num_sessions; session_no++) {
|
||||
for(session_no= 0; session_no < num_sessions + open_sessions;
|
||||
session_no++) {
|
||||
tracks= burn_session_get_tracks(sessions[session_no],&num_tracks);
|
||||
total_tracks+= num_tracks;
|
||||
if(session_no == num_sessions + open_sessions - 1 && open_sessions > 0) {
|
||||
total_tracks--; /* Do not count invisible track */
|
||||
if(num_tracks > 1)
|
||||
have_real_open_session= 1;
|
||||
}
|
||||
}
|
||||
printf("first: %d last %d\n",
|
||||
track_offset, total_tracks + track_offset - 1);
|
||||
}
|
||||
for(session_no= 0; session_no<num_sessions; session_no++) {
|
||||
for(session_no= 0; session_no < num_sessions + open_sessions; session_no++) {
|
||||
tracks= burn_session_get_tracks(sessions[session_no],&num_tracks);
|
||||
if(tracks==NULL)
|
||||
continue;
|
||||
if(session_no == num_sessions + open_sessions - 1 && open_sessions > 0)
|
||||
num_tracks--;
|
||||
if(num_tracks <= 0)
|
||||
continue;
|
||||
if(!(flag&1))
|
||||
printf("first: %d last: %d\n",
|
||||
@ -4988,9 +5012,15 @@ int Cdrskin_toc(struct CdrskiN *skin, int flag)
|
||||
printf(" mode: %d\n",((toc_entry.control&7)<4?0:1));
|
||||
|
||||
}
|
||||
if((flag&1) && session_no<num_sessions-1)
|
||||
if((flag&1) &&
|
||||
session_no < num_sessions + open_sessions - 1 + have_real_open_session - 1)
|
||||
continue;
|
||||
burn_session_get_leadout_entry(sessions[session_no],&toc_entry);
|
||||
if(have_real_open_session) {
|
||||
/* Use start of invisible track */
|
||||
burn_track_get_entry(tracks[num_tracks], &toc_entry);
|
||||
} else {
|
||||
burn_session_get_leadout_entry(sessions[session_no],&toc_entry);
|
||||
}
|
||||
if(toc_entry.extensions_valid&1) { /* DVD extension valid */
|
||||
lba= toc_entry.start_lba;
|
||||
burn_lba_to_msf(lba, &pmin, &psec, &pframe);
|
||||
@ -5029,13 +5059,15 @@ summary:
|
||||
strcpy(profile_name, "media");
|
||||
|
||||
printf("Media summary: %d sessions, %d tracks, %s %s\n",
|
||||
num_sessions, track_count,
|
||||
num_sessions + open_sessions - 1 + have_real_open_session, track_count,
|
||||
s==BURN_DISC_BLANK ? "blank" :
|
||||
s==BURN_DISC_APPENDABLE ? "appendable" :
|
||||
s==BURN_DISC_FULL ? "closed" :
|
||||
s==BURN_DISC_EMPTY ? "no " : "unknown ",
|
||||
profile_name);
|
||||
|
||||
if(have_real_open_session)
|
||||
printf("Warning : Incomplete session encountered !\n");
|
||||
|
||||
if(disc!=NULL)
|
||||
burn_disc_free(disc);
|
||||
@ -5057,7 +5089,7 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
|
||||
{
|
||||
int num_sessions= 0,num_tracks= 0,lba= 0,track_count= 0,total_tracks= 0;
|
||||
int session_no, track_no, pmin, psec, pframe, ret, size= 0, nwa= 0;
|
||||
int last_leadout= 0, ovwrt_full= 0, track_offset= 1;
|
||||
int last_leadout= 0, ovwrt_full= 0, track_offset= 1, open_sessions= 0;
|
||||
struct burn_drive *drive;
|
||||
struct burn_disc *disc= NULL;
|
||||
struct burn_session **sessions= NULL;
|
||||
@ -5069,8 +5101,9 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
|
||||
char media_class[80];
|
||||
int nominal_sessions= 1, ftils= 1, ltils= 1, first_track= 1, read_capacity= 0;
|
||||
int app_code, cd_info_valid, lra, alloc_blocks, free_blocks;
|
||||
int have_real_open_session= 0;
|
||||
off_t avail, buf_count;
|
||||
char disc_type[80], bar_code[9], buf[2 * 2048];
|
||||
char disc_type[80], bar_code[9], buf[2 * 2048], *type_text;
|
||||
unsigned int disc_id;
|
||||
|
||||
drive= skin->drives[skin->driveno].drive;
|
||||
@ -5128,15 +5161,17 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
|
||||
} else {
|
||||
|
||||
sessions= burn_disc_get_sessions(disc, &num_sessions);
|
||||
open_sessions= burn_disc_get_incomplete_sessions(disc);
|
||||
if(num_sessions > 0)
|
||||
track_offset= burn_session_get_start_tno(sessions[0], 0);
|
||||
if(track_offset <= 0)
|
||||
track_offset= 1;
|
||||
first_track= track_offset;
|
||||
nominal_sessions= num_sessions;
|
||||
if(s == BURN_DISC_APPENDABLE)
|
||||
nominal_sessions= num_sessions + open_sessions;
|
||||
if(s == BURN_DISC_APPENDABLE && open_sessions == 0)
|
||||
nominal_sessions++;
|
||||
for(session_no= 0; session_no<num_sessions; session_no++) {
|
||||
for(session_no= 0; session_no < num_sessions + open_sessions;
|
||||
session_no++) {
|
||||
ftils= total_tracks + 1;
|
||||
tracks= burn_session_get_tracks(sessions[session_no],&num_tracks);
|
||||
if(tracks==NULL)
|
||||
@ -5147,7 +5182,7 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
|
||||
&& total_tracks >= 2)
|
||||
first_track= 2;
|
||||
}
|
||||
if(s == BURN_DISC_APPENDABLE)
|
||||
if(s == BURN_DISC_APPENDABLE && open_sessions == 0)
|
||||
ftils= ltils= total_tracks + 1;
|
||||
}
|
||||
printf("first track: %d\n", first_track);
|
||||
@ -5177,7 +5212,7 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
|
||||
printf("\n");
|
||||
printf("Track Sess Type Start Addr End Addr Size\n");
|
||||
printf("==============================================\n");
|
||||
for(session_no= 0; session_no<num_sessions; session_no++) {
|
||||
for(session_no= 0; session_no < num_sessions + open_sessions; session_no++) {
|
||||
tracks= burn_session_get_tracks(sessions[session_no],&num_tracks);
|
||||
if(tracks==NULL)
|
||||
continue;
|
||||
@ -5223,11 +5258,33 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
|
||||
|
||||
#endif /* Cdrskin_with_last_recorded_addresS */
|
||||
|
||||
if(session_no < num_sessions) {
|
||||
type_text= ((toc_entry.control&7)<4) ? "Audio" : "Data";
|
||||
} else {
|
||||
if(track_no < num_tracks - 1) {
|
||||
type_text= "Rsrvd";
|
||||
have_real_open_session = 1;
|
||||
} else {
|
||||
type_text= "Blank";
|
||||
}
|
||||
if(toc_entry.extensions_valid & 4) {
|
||||
if(toc_entry.track_status_bits & (1 << 14))
|
||||
type_text= "Blank";
|
||||
else if(toc_entry.track_status_bits & (1 << 16)) {
|
||||
type_text= "Apdbl";
|
||||
have_real_open_session = 1;
|
||||
} else if(toc_entry.track_status_bits & (1 << 15)) {
|
||||
type_text= "Rsrvd";
|
||||
have_real_open_session = 1;
|
||||
} else
|
||||
type_text= "Invsb";
|
||||
}
|
||||
}
|
||||
printf("%5d %5d %-6s %-10d %-10d %-10d\n",
|
||||
track_count + track_offset - 1, session_no + 1,
|
||||
((toc_entry.control&7)<4) ? "Audio" : "Data", lba, lra, size);
|
||||
|
||||
last_leadout= lba + size;
|
||||
type_text, lba, lra, size);
|
||||
if(session_no < num_sessions)
|
||||
last_leadout= lba + size;
|
||||
}
|
||||
}
|
||||
if(last_leadout > 0)
|
||||
@ -5240,10 +5297,12 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
|
||||
size= avail / 2048;
|
||||
if(read_capacity == 0 && skin->media_is_overwriteable)
|
||||
size= 0; /* unformatted overwriteable media */
|
||||
printf("%5d %5d %-6s %-10d %-10d %-10d\n",
|
||||
track_count + track_offset, nominal_sessions,
|
||||
ovwrt_full ? "Data" : "Blank",
|
||||
nwa, lba + size - 1, size);
|
||||
if(nominal_sessions > num_sessions + open_sessions) {
|
||||
printf("%5d %5d %-6s %-10d %-10d %-10d\n",
|
||||
track_count + track_offset, nominal_sessions,
|
||||
ovwrt_full ? "Data" : "Blank",
|
||||
nwa, nwa + size - 1, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
@ -5274,6 +5333,9 @@ int Cdrskin_minfo(struct CdrskiN *skin, int flag)
|
||||
printf("cdrskin: Above contrary statements follow cdrecord traditions.\n");
|
||||
}
|
||||
|
||||
if(have_real_open_session)
|
||||
printf("\nWarning: Incomplete session encountered !\n");
|
||||
|
||||
if(disc!=NULL)
|
||||
burn_disc_free(disc);
|
||||
if(s == BURN_DISC_EMPTY)
|
||||
@ -5553,6 +5615,117 @@ ex:;
|
||||
}
|
||||
|
||||
|
||||
/** Perform --list_speeds
|
||||
@param flag Bitfield for control purposes:
|
||||
@return <=0 error, 1 success
|
||||
*/
|
||||
int Cdrskin_list_speeds(struct CdrskiN *skin, int flag)
|
||||
{
|
||||
struct burn_drive *drive;
|
||||
int ret, i, profile_no, high= -1, low= 0x7fffffff, is_cd= 0;
|
||||
char profile_name[90], *speed_unit= "D";
|
||||
double speed_factor= 1385000.0, cd_factor= 75.0 * 2352;
|
||||
struct burn_speed_descriptor *speed_list= NULL, *item, *other;
|
||||
|
||||
ret= Cdrskin_grab_drive(skin,0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
drive= skin->drives[skin->driveno].drive;
|
||||
ret= burn_drive_get_speedlist(drive, &speed_list);
|
||||
if(ret <= 0) {
|
||||
fprintf(stderr, "cdrskin: SORRY: Cannot obtain speed list info\n");
|
||||
ret= 0; goto ex;
|
||||
}
|
||||
ret= burn_disc_get_profile(drive, &profile_no, profile_name);
|
||||
printf("Media current: ");
|
||||
if(profile_no > 0 && ret > 0) {
|
||||
if(profile_name[0])
|
||||
printf("%s\n", profile_name);
|
||||
else
|
||||
printf("%4.4Xh\n", profile_no);
|
||||
} else
|
||||
printf("is not recognizable\n");
|
||||
if(profile_no >= 0x08 && profile_no <= 0x0a)
|
||||
is_cd= profile_no;
|
||||
speed_factor= Cdrskin_libburn_speed_factoR * 1000.0;
|
||||
if(Cdrskin_libburn_speed_factoR == Cdrskin_libburn_cd_speed_factoR)
|
||||
speed_unit= "C";
|
||||
else if(Cdrskin_libburn_speed_factoR == Cdrskin_libburn_bd_speed_factoR)
|
||||
speed_unit= "B";
|
||||
|
||||
for (item= speed_list; item != NULL; item= item->next) {
|
||||
if(item->source == 1) {
|
||||
/* CD mode page 2Ah : report only if not same speed by GET PERFORMANCE */
|
||||
for(other= speed_list; other != NULL; other= other->next)
|
||||
if(other->source == 2 && item->write_speed == other->write_speed)
|
||||
break;
|
||||
if(other != NULL)
|
||||
continue;
|
||||
}
|
||||
printf("Write speed : %5dk , %4.1fx%s\n",
|
||||
item->write_speed,
|
||||
((double) item->write_speed) * 1000.0 / speed_factor, speed_unit);
|
||||
if(item->write_speed > high)
|
||||
high= item->write_speed;
|
||||
if(item->write_speed < low)
|
||||
low= item->write_speed;
|
||||
}
|
||||
|
||||
/* Maybe there is ATIP info */
|
||||
if(is_cd) {
|
||||
ret= burn_disc_read_atip(drive);
|
||||
if(ret < 0)
|
||||
goto ex;
|
||||
if(ret > 0) {
|
||||
for(i= 0; i < 2; i++) {
|
||||
if(i == 0)
|
||||
ret= burn_drive_get_min_write_speed(drive);
|
||||
else
|
||||
ret= burn_drive_get_write_speed(drive);
|
||||
if(ret > 0) {
|
||||
if(ret < low || (i == 0 && ret != low)) {
|
||||
printf("Write speed l: %5dk , %4.1fx%s\n",
|
||||
ret, ((double) ret) * 1000.0 / cd_factor, "C");
|
||||
low= ret;
|
||||
}
|
||||
if(ret > high || (i == 1 && ret != high)) {
|
||||
printf("Write speed h: %5dk , %4.1fx%s\n",
|
||||
ret, ((double) ret) * 1000.0 / cd_factor, "C");
|
||||
high= ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(high > -1) {
|
||||
printf("Write speed L: %5dk , %4.1fx%s\n",
|
||||
low, ((double) low) * 1000.0 / speed_factor, speed_unit);
|
||||
printf("Write speed H: %5dk , %4.1fx%s\n",
|
||||
high, ((double) high) * 1000.0 / speed_factor, speed_unit);
|
||||
ret= burn_drive_get_best_speed(drive, -1, &item, 2);
|
||||
if(ret > 0 && item != NULL)
|
||||
if(item->write_speed != low)
|
||||
printf("Write speed 0: %5dk , %4.1fx%s\n",
|
||||
item->write_speed,
|
||||
((double) item->write_speed) * 1000.0 / speed_factor, speed_unit);
|
||||
ret= burn_drive_get_best_speed(drive, 0, &item, 2);
|
||||
if(ret > 0 && item != NULL)
|
||||
if(item->write_speed != high)
|
||||
printf("Write speed-1: %5dk , %4.1fx%s\n",
|
||||
item->write_speed,
|
||||
((double) item->write_speed) * 1000.0 / speed_factor, speed_unit);
|
||||
} else {
|
||||
fprintf(stderr,
|
||||
"cdrskin: SORRY : Could not get any write speed information from drive");
|
||||
}
|
||||
ret= 1;
|
||||
ex:;
|
||||
if(speed_list != NULL)
|
||||
burn_drive_free_speedlist(&speed_list);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
|
||||
int Cdrskin_read_textfile(struct CdrskiN *skin, char *path, int flag)
|
||||
{
|
||||
int ret, num_packs = 0;
|
||||
@ -7341,12 +7514,44 @@ ex:;
|
||||
}
|
||||
|
||||
|
||||
#ifdef Libburn_develop_quality_scaN
|
||||
|
||||
int Cdrskin_qcheck(struct CdrskiN *skin, int flag)
|
||||
{
|
||||
struct burn_drive *drive;
|
||||
int ret, rate_period, profile_number;
|
||||
char profile_name[80];
|
||||
|
||||
printf("cdrskin: beginning to perform quality check on disc\n");
|
||||
ret= Cdrskin_grab_drive(skin,0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
drive= skin->drives[skin->driveno].drive;
|
||||
|
||||
ret= burn_disc_get_profile(drive, &profile_number, profile_name);
|
||||
if(ret <= 0)
|
||||
profile_number= 0;
|
||||
if(profile_number != 0x08 && profile_number != 0x09 && profile_number != 0x0a)
|
||||
rate_period= 8;
|
||||
else
|
||||
rate_period= 75;
|
||||
if(skin->do_qcheck == 1) {
|
||||
ret= burn_nec_optiarc_rep_err_rate(drive, 0, rate_period, 0);
|
||||
if(ret<=0)
|
||||
return(ret);
|
||||
}
|
||||
return(1);
|
||||
}
|
||||
|
||||
#endif /* Libburn_develop_quality_scaN */
|
||||
|
||||
|
||||
/** Print lba of first track of last session and Next Writeable Address of
|
||||
the next unwritten session.
|
||||
*/
|
||||
int Cdrskin_msinfo(struct CdrskiN *skin, int flag)
|
||||
{
|
||||
int num_sessions, session_no, ret, num_tracks;
|
||||
int num_sessions, session_no, ret, num_tracks, open_sessions= 0;
|
||||
int nwa= -123456789, lba= -123456789, aux_lba;
|
||||
char msg[80];
|
||||
enum burn_disc_status s;
|
||||
@ -7386,12 +7591,29 @@ int Cdrskin_msinfo(struct CdrskiN *skin, int flag)
|
||||
{ret= 0; goto ex;}
|
||||
}
|
||||
sessions= burn_disc_get_sessions(disc,&num_sessions);
|
||||
for(session_no= 0; session_no<num_sessions; session_no++) {
|
||||
open_sessions= burn_disc_get_incomplete_sessions(disc);
|
||||
for(session_no= 0; session_no < num_sessions + open_sessions; session_no++) {
|
||||
tracks= burn_session_get_tracks(sessions[session_no],&num_tracks);
|
||||
if(tracks==NULL || num_tracks<=0)
|
||||
continue;
|
||||
burn_track_get_entry(tracks[0],&toc_entry);
|
||||
if(toc_entry.extensions_valid&1) { /* DVD extension valid */
|
||||
if(session_no >= num_sessions) {
|
||||
|
||||
/* 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).
|
||||
*/
|
||||
if(!(toc_entry.extensions_valid & 4))
|
||||
continue; /* open session with no track status bits from libburn */
|
||||
if((toc_entry.track_status_bits & (1 << 14)) ||
|
||||
!((toc_entry.track_status_bits & (1 << 16)) ||
|
||||
((toc_entry.track_status_bits & (1 << 17)) &&
|
||||
toc_entry.last_recorded_address > toc_entry.start_lba)))
|
||||
continue; /* Blank or not appendable and not recorded */
|
||||
}
|
||||
|
||||
lba= toc_entry.start_lba;
|
||||
} else {
|
||||
lba= burn_msf_to_lba(toc_entry.pmin,toc_entry.psec,toc_entry.pframe);
|
||||
@ -8118,6 +8340,10 @@ set_isrc:;
|
||||
printf("%s\n",ignored_full_options[k]);
|
||||
printf("\n");
|
||||
|
||||
} else if(strcmp(argv[i],"--list_speeds")==0) {
|
||||
skin->do_list_speeds= 1;
|
||||
skin->preskin->demands_cdrskin_caps= 1;
|
||||
|
||||
} else if(strncmp(argv[i],"fallback_program=",17)==0) {
|
||||
/* is handled in Cdrpreskin_setup() */;
|
||||
|
||||
@ -8248,6 +8474,13 @@ msifile_equals:;
|
||||
} else if(strcmp(argpt,"-msinfo")==0) {
|
||||
skin->do_msinfo= 1;
|
||||
|
||||
#ifdef Libburn_develop_quality_scaN
|
||||
|
||||
} else if(strcmp(argv[i],"--nec_optiarc_qcheck")==0) {
|
||||
skin->do_qcheck= 1;
|
||||
|
||||
#endif /* Libburn_develop_quality_scaN */
|
||||
|
||||
} else if(strcmp(argv[i],"--no_abort_handler")==0) {
|
||||
/* is handled in Cdrpreskin_setup() */;
|
||||
|
||||
@ -8257,6 +8490,9 @@ msifile_equals:;
|
||||
} else if(strcmp(argv[i],"--no_convert_fs_adr")==0) {
|
||||
/* is handled in Cdrpreskin_setup() */;
|
||||
|
||||
} else if(strcmp(argv[i],"--no_load")==0) {
|
||||
skin->do_load= -1;
|
||||
|
||||
} else if(strcmp(argv[i],"--no_rc")==0) {
|
||||
/* is handled in Cdrpreskin_setup() */;
|
||||
|
||||
@ -8830,7 +9066,7 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
fprintf(stderr,"cdrskin: FATAL : -scanbus failed.\n");
|
||||
{*exit_value= 5*(ret<=0); goto ex;}
|
||||
}
|
||||
if(skin->do_load) {
|
||||
if(skin->do_load > 0) {
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_grab_drive(skin,8);
|
||||
@ -8872,14 +9108,23 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
if(ret<=0)
|
||||
{*exit_value= 7; goto ex;}
|
||||
}
|
||||
if(skin->do_list_speeds) {
|
||||
if(skin->n_drives<=0)
|
||||
{*exit_value= 17; goto no_drive;}
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_list_speeds(skin, 0);
|
||||
if(ret<=0)
|
||||
{*exit_value= 17; goto ex;}
|
||||
}
|
||||
if(skin->do_list_formats) {
|
||||
if(skin->n_drives<=0)
|
||||
{*exit_value= 14; goto no_drive;}
|
||||
{*exit_value= 16; goto no_drive;}
|
||||
if(Cdrskin__is_aborting(0))
|
||||
goto ex;
|
||||
ret= Cdrskin_list_formats(skin, 0);
|
||||
if(ret<=0)
|
||||
{*exit_value= 14; goto ex;}
|
||||
{*exit_value= 16; goto ex;}
|
||||
}
|
||||
if(skin->do_blank) {
|
||||
if(skin->n_drives<=0)
|
||||
@ -8907,6 +9152,17 @@ int Cdrskin_run(struct CdrskiN *skin, int *exit_value, int flag)
|
||||
if(ret<=0)
|
||||
{*exit_value= 10; goto ex;}
|
||||
}
|
||||
|
||||
#ifdef Libburn_develop_quality_scaN
|
||||
|
||||
if(skin->do_qcheck) {
|
||||
ret= Cdrskin_qcheck(skin, 0);
|
||||
if(ret<=0)
|
||||
{*exit_value= 15; goto ex;}
|
||||
}
|
||||
|
||||
#endif /* Libburn_develop_quality_scaN */
|
||||
|
||||
ex:;
|
||||
if(Cdrskin__is_aborting(0))
|
||||
Cdrskin_abort(skin, 0); /* Never comes back */
|
||||
|
@ -65,7 +65,7 @@ connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
|
||||
GPL software included:<BR>
|
||||
</H2>
|
||||
<DL>
|
||||
<DT>libburn-1.2.4</DT>
|
||||
<DT>libburn-1.3.0.pl01</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.4.tar.gz">cdrskin-1.2.4.tar.gz</A>
|
||||
(930 KB).
|
||||
<DD><A HREF="cdrskin-1.3.0.pl01.tar.gz">cdrskin-1.3.0.pl01.tar.gz</A>
|
||||
(950 KB).
|
||||
</DD>
|
||||
<DD><A HREF="cdrskin-1.2.4.tar.gz.sig">cdrskin-1.2.4.tar.gz.sig</A></DD>
|
||||
<DD><A HREF="cdrskin-1.3.0.pl01.tar.gz.sig">cdrskin-1.3.0.pl01.tar.gz.sig</A></DD>
|
||||
<DD>
|
||||
(detached GPG signature for verification by
|
||||
<KBD>gpg --verify cdrskin-1.2.4.tar.gz.sig cdrskin-1.2.4.tar.gz</KBD>
|
||||
<KBD>gpg --verify cdrskin-1.3.0.pl01.tar.gz.sig cdrskin-1.3.0.pl01.tar.gz</KBD>
|
||||
<BR>
|
||||
after <KBD>gpg --keyserver keys.gnupg.net --recv-keys ABC0A854</KBD>).
|
||||
</DD>
|
||||
@ -257,32 +257,53 @@ 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.2:
|
||||
Enhancements towards previous stable version cdrskin-1.2.8:
|
||||
<UL>
|
||||
<LI>New option --obs_pad</LI>
|
||||
<LI>none</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
-->
|
||||
</UL>
|
||||
|
||||
Bug fixes towards cdrskin-1.2.2:
|
||||
Bug fixes towards cdrskin-1.2.8:
|
||||
<UL>
|
||||
<LI>CD SAO sessions with data tracks started by an audio pause</LI>
|
||||
<LI>CD tracks were perceived 2 sectors too short. Nice with TAO, bad with SAO.</LI>
|
||||
<LI>Memory fault if track source was added when no drive was available</LI>
|
||||
<LI>
|
||||
Full formatting of BD-RE used certification regardless of drive capabilities
|
||||
</LI>
|
||||
<LI>
|
||||
DVD+R with damaged TOC were reported by -minfo with wrong end address
|
||||
</LI>
|
||||
<!--
|
||||
<LI>none</LI>
|
||||
-->
|
||||
</UL>
|
||||
|
||||
Bug fix towards cdrskin-1.3.0:
|
||||
<UL>
|
||||
<LI>
|
||||
cdrskin -msinfo on DVD and BD reported
|
||||
old session start = next writable address.
|
||||
Regression introduced by version 1.2.8
|
||||
</LI>
|
||||
</UL>
|
||||
|
||||
<HR>
|
||||
|
||||
<P>
|
||||
<DL>
|
||||
<DT><H3>Development snapshot, version 1.2.5 :</H3></DT>
|
||||
<DD>Enhancements towards current stable version 1.2.4:
|
||||
<DT><H3>Development snapshot, version 1.3.1 :</H3></DT>
|
||||
<DD>Enhancements towards current stable version 1.3.0.pl01:
|
||||
<UL>
|
||||
<LI>none yet</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>none yet</LI>
|
||||
-->
|
||||
@ -290,19 +311,20 @@ Bug fixes towards cdrskin-1.2.2:
|
||||
</UL>
|
||||
</DD>
|
||||
|
||||
<DD>Bug fixes towards cdrskin-1.2.4:
|
||||
<DD>Bug fixes towards cdrskin-1.3.0.pl01:
|
||||
<UL>
|
||||
<LI>none yet</LI>
|
||||
<!--
|
||||
<LI>none yet</LI>
|
||||
-->
|
||||
</UL>
|
||||
</DD>
|
||||
|
||||
<DD> </DD>
|
||||
<DD><A HREF="README_cdrskin_devel">README 1.2.5</A>
|
||||
<DD><A HREF="cdrskin__help_devel">cdrskin-1.2.5 --help</A></DD>
|
||||
<DD><A HREF="cdrskin_help_devel">cdrskin-1.2.5 -help</A></DD>
|
||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.2.5)</A></DD>
|
||||
<DD><A HREF="README_cdrskin_devel">README 1.3.1</A>
|
||||
<DD><A HREF="cdrskin__help_devel">cdrskin-1.3.1 --help</A></DD>
|
||||
<DD><A HREF="cdrskin_help_devel">cdrskin-1.3.1 -help</A></DD>
|
||||
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.3.1)</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>
|
||||
@ -322,8 +344,8 @@ admins with full system souvereignty.</DT>
|
||||
<A HREF="README_cdrskin_devel">upcoming README</A> ):
|
||||
</DD>
|
||||
<DD>
|
||||
<A HREF="cdrskin-1.2.5.tar.gz">cdrskin-1.2.5.tar.gz</A>
|
||||
(930 KB).
|
||||
<A HREF="cdrskin-1.3.1.tar.gz">cdrskin-1.3.1.tar.gz</A>
|
||||
(950 KB).
|
||||
</DD>
|
||||
|
||||
<!-- This is not offered any more since spring 2008
|
||||
@ -519,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.20.113001"
|
||||
#define Cdrskin_timestamP "2013.05.31.080001"
|
||||
|
@ -11349,6 +11349,7 @@ configure.ac
|
||||
README
|
||||
libburn/libburn.h
|
||||
cdrskin/cdrskin.c
|
||||
cdrskin/cdrskin.1
|
||||
cdrskin/README
|
||||
cdrskin/compile_cdrskin.sh
|
||||
cdrskin/cdrskin_timestamp.h
|
||||
@ -11375,14 +11376,634 @@ Updated change log
|
||||
* 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.5 -
|
||||
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 []
|
||||
README
|
||||
cdrskin/README
|
||||
ChangeLog
|
||||
cdrskin/cdrskin_eng.html
|
||||
cdrskin/changelog.txt
|
||||
|
||||
------------------------------ 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).
|
||||
|
||||
|
||||
[]
|
||||
ChangeLog
|
||||
cdrskin/cdrskin_eng.html
|
||||
cdrskin/changelog.txt
|
||||
Updated change log
|
||||
|
||||
------------------------------------ cycle - cdrskin-1.3.1 -
|
||||
|
||||
[]
|
||||
ChangeLog
|
||||
cdrskin/cdrskin_eng.html
|
||||
cdrskin/changelog.txt
|
||||
Updated change log
|
||||
|
||||
------------------------------------ cycle - cdrskin-1.3.1 -
|
||||
|
||||
|
||||
**********************************************************************
|
||||
@ -11395,10 +12016,11 @@ Important: When adding a public API function then add its name to file
|
||||
===============================================================================
|
||||
|
||||
|
||||
>>> TRACK SHORTAGE
|
||||
xorriso: If libburn fails to produce the announced number of blocks
|
||||
libburn : FAILURE : Premature end of input encountered. Missing: 2048 bytes
|
||||
But actually several hundered blocks are missing.
|
||||
cdrskin option to emit pacifiers with newline rather than carriage return
|
||||
|
||||
cdrskin does not have a runtime check for sizeof(off_t) >= 6.
|
||||
|
||||
|
||||
|
||||
CD-TEXT:
|
||||
- with SAO
|
||||
|
@ -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_4"
|
||||
libvers="-DCdrskin_libburn_1_3_0"
|
||||
|
||||
# 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_4"
|
||||
elif test "$i" = "-libburn_1_3_0"
|
||||
then
|
||||
libvers="-DCdrskin_libburn_1_2_4"
|
||||
libvers="-DCdrskin_libburn_1_3_0"
|
||||
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_5"
|
||||
libvers="-DCdrskin_libburn_1_3_1"
|
||||
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_4 set macro to match libburn-1.2.4"
|
||||
echo " -libburn_1_3_0 set macro to match libburn-1.3.0"
|
||||
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."
|
||||
|
48
configure.ac
48
configure.ac
@ -1,4 +1,4 @@
|
||||
AC_INIT([libburn], [1.2.4], [http://libburnia-project.org])
|
||||
AC_INIT([libburn], [1.3.0], [http://libburnia-project.org])
|
||||
AC_PREREQ([2.50])
|
||||
dnl AC_CONFIG_HEADER([config.h])
|
||||
|
||||
@ -98,6 +98,9 @@ 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
|
||||
dnl So LT_CURRENT, LT_REVISION and LT_AGE get set directly here.
|
||||
dnl SONAME of the emerging library is LT_CURRENT - LT_AGE.
|
||||
@ -122,8 +125,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=4
|
||||
BURN_MINOR_VERSION=3
|
||||
BURN_MICRO_VERSION=0
|
||||
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
|
||||
|
||||
AC_SUBST(BURN_MAJOR_VERSION)
|
||||
@ -134,14 +137,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.4
|
||||
dnl This is the release version libburn-1.3.0
|
||||
dnl ### This is the development version after above release version
|
||||
dnl LT_CURRENT++, LT_AGE++ has not yet happened.
|
||||
dnl ### LT_CURRENT++, LT_AGE++ has happened meanwhile.
|
||||
dnl
|
||||
dnl SONAME = 81 - 77 = 4 . Linux library name = libburn.so.4.77.0
|
||||
LT_CURRENT=81
|
||||
LT_AGE=77
|
||||
dnl SONAME = 87 - 83 = 4 . Linux library name = libburn.so.4.83.0
|
||||
LT_CURRENT=87
|
||||
LT_AGE=83
|
||||
LT_REVISION=0
|
||||
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`
|
||||
|
||||
@ -242,10 +245,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
|
||||
@ -262,12 +279,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.
|
||||
|
||||
|
||||
|
@ -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++)
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -347,6 +347,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])
|
||||
{
|
||||
|
@ -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;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@ -1955,7 +1974,7 @@ 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
|
||||
@return > 0 is the currently set CD track start number
|
||||
@ -3387,8 +3406,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 +3419,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 +3484,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 4
|
||||
#define burn_header_version_minor 3
|
||||
#define burn_header_version_micro 0
|
||||
/** Note:
|
||||
Above version numbers are also recorded in configure.ac because libtool
|
||||
wants them as parameters at build time.
|
||||
@ -3589,15 +3623,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
|
||||
@ -3767,6 +3810,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 +3825,50 @@ 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 A70904 */
|
||||
/** Inquire whether the drive object is a real MMC drive or a pseudo-drive
|
||||
created by a stdio: address.
|
||||
@ -3988,5 +4082,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;
|
||||
@ -86,6 +87,7 @@ burn_guess_manufacturer;
|
||||
burn_initialize;
|
||||
burn_is_aborting;
|
||||
burn_lba_to_msf;
|
||||
burn_list_sev_texts;
|
||||
burn_lookup_device_link;
|
||||
burn_msf_to_lba;
|
||||
burn_msf_to_sectors;
|
||||
@ -100,6 +102,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= "";
|
||||
|
@ -316,7 +316,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 +475,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 +596,9 @@ 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 with unknown character code
|
||||
|
||||
|
||||
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 */
|
||||
|
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 */
|
||||
|
||||
|
@ -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;
|
||||
|
@ -1003,6 +1003,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 +1462,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 +1589,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 */;
|
||||
|
||||
|
@ -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 - 2012 Thomas Schmitt <scdbackup@gmx.net>
|
||||
Provided under GPL version 2 or later.
|
||||
*/
|
||||
|
||||
@ -261,8 +261,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 +287,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 +388,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 *,
|
||||
|
@ -23,42 +23,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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
|
@ -1861,7 +1861,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 +1889,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 +1972,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;
|
||||
}
|
||||
|
136
test/telltoc.c
136
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 ---------------------------- */
|
||||
@ -464,12 +467,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 +515,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 +547,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 +620,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 +662,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 +709,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 +726,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 +738,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 +761,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 +868,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 +951,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