Compare commits

..

59 Commits

Author SHA1 Message Date
1612e037ca Mentioned bug fix and pl01 2013-05-31 09:02:04 +00:00
64baafc17e Bug fix: cdrskin -msinfo on DVD and BD reported old session start = next writable address. Regression introduced by version 1.2.8 (rev 4956). 2013-05-31 08:51:44 +00:00
b4c2f450d1 Branching for libburn bugfix release 1.3.0.pl01 2013-05-31 08:47:14 +00:00
ae0dd31ae6 libburn release 1.3.0 is ready 2013-05-17 18:36:57 +00:00
311d5347e1 Updated change log 2013-05-17 09:42:50 +00:00
da046bc232 Updated cdrskin tarball generator 2013-05-17 09:36:27 +00:00
5c1ef0d55a Made number transition to 1.3.0 2013-05-17 09:35:09 +00:00
5c2c4e3b40 Branching for libburn release 1.3.0 2013-05-17 08:12:20 +00:00
ac2bfec065 Updated change log 2013-05-10 07:30:48 +00:00
c566ea03cf Added new item to list of error codes 2013-05-10 07:26:11 +00:00
3632e1be4e Bug fix: DVD+R with damaged TOC were reported by -minfo with wrong end address 2013-05-10 06:41:53 +00:00
f18b832a82 Updated change log 2013-04-01 12:56:35 +00:00
1f92419cb4 Bug fix: Formatting of BD-RE used certification regardless of drive capabilities 2013-04-01 12:19:14 +00:00
d6e15a0139 Forgot to increment cdrskin version number 2013-04-01 12:17:05 +00:00
e0db790103 Updated change log 2013-03-18 21:21:35 +00:00
9bc362f59b Made number transition to 1.2.9 2013-03-18 21:09:13 +00:00
44d5f3ce4e Updated cdrskin tarball generator 2013-03-18 08:31:34 +00:00
0f43a39a45 Made number transition to 1.2.8 2013-03-18 08:29:37 +00:00
0a1a085471 Avoiding SYNCHRONIZE CACHE if DVD track preparation has failed 2013-03-12 11:48:07 +00:00
a1fdfe1519 Always considering mode page 2A when looking for min and max speed 2013-03-05 18:55:03 +00:00
bbb6315af0 Always considering mode page 2A when looking for min and max speed 2013-03-05 18:54:19 +00:00
40d83b2314 Updated change log 2013-03-05 12:51:03 +00:00
c82ac0a825 Mentioned --list_speeds in manual page 2013-03-05 12:47:56 +00:00
46b598abd2 New cdrskin option --list_speeds 2013-03-05 12:45:37 +00:00
c7784b79b7 Still correcting the bug fix of rev 4975 2013-03-05 12:42:41 +00:00
f1b3184531 Corrected previous bug fix which caused speed descriptors to appear twice 2013-03-04 23:25:27 +00:00
a18c862e84 Bug fix: On some drives the request for minimum speed yielded maximum speed 2013-03-04 21:13:32 +00:00
c2903ab717 Corrected wrong use of sizeof 2013-02-26 08:01:51 +00:00
04ccaebff7 Updated cdrskin copyright message 2013-01-16 18:12:41 +00:00
2e83dc554b Updated change log 2013-01-16 18:05:44 +00:00
3a17a8a014 Bug fix: All CD tracks were reported with the sizes of the tracks in the first session. Regression introduced with version 1.2.0 (rev 4552). 2013-01-15 10:42:21 +00:00
ffca3e89dd Made use of new API features to handle incomplete sessions 2013-01-12 19:54:59 +00:00
676231c362 New API call burn_disc_get_incomplete_sessions(), new burn_toc_entry.track_status_bits 2013-01-12 19:51:21 +00:00
d76c715df7 Updated change log 2013-01-08 14:56:13 +00:00
9aa47792e0 Updated cdrskin tarball generator 2013-01-08 14:53:46 +00:00
f4cfe9b267 Made number transition to 1.2.7 2013-01-08 14:52:30 +00:00
6f19122672 Small change to burn cookbook about ISO multi-session emulation 2012-12-14 15:33:09 +00:00
057f24d5b9 New API call burn_list_sev_texts() 2012-12-14 14:51:46 +00:00
a843727bc7 Made telltoc ready for reading CD audio 2012-11-30 19:40:37 +00:00
bb409500ed New API call burn_read_audio 2012-11-30 19:34:33 +00:00
1a74a05965 Let mmc_format_unit issue failure message on SCSI error 2012-11-29 11:26:53 +00:00
2df7f3d5d5 Forgot mcc.c with the previous commit 2012-11-29 11:25:54 +00:00
0728d855d5 Beginning to create new API call burn_read_audio 2012-11-29 11:14:33 +00:00
100be5078c Better reaction on non-plausible ATIP info from CD-ROM 2012-11-24 18:14:36 +00:00
5139bf922a Preserving an immature sketch of media quality scanning 2012-11-18 18:47:09 +00:00
a2b4361d69 Preserving an immature sketch of media quality scanning 2012-11-18 18:46:05 +00:00
d216764867 Corrected error handling which was spoiled by rev 4852 2012-10-25 17:35:10 +00:00
4c74cbf7b3 New flag bit4 of burn_read_data() for better handling of TAO end blocks 2012-10-25 12:39:50 +00:00
7ed8619a9e Reporting (still cryptic) details about refusal to blank 2012-10-24 09:58:25 +00:00
fa2508bfd5 Configuration for use of libcdio on cygwin. Thanks Rocky Bernstein. 2012-10-02 13:49:26 +00:00
72ae8e3b5a Updated change log 2012-09-13 08:59:00 +00:00
fa95326bac Bug fix: Speed setting had no effect on BD media. Thanks to Dennis Vshivkov. 2012-09-13 08:57:31 +00:00
eb86e5298a Removed buggy burn_strdup() and burn_strndup(). Thanks to Rich Felker. 2012-08-28 16:20:45 +00:00
4cfa8170ee Small grammatical correction in CD-TEXT documentaion 2012-08-01 06:36:53 +00:00
d885d9a408 Updated change log 2012-07-26 19:48:05 +00:00
6a23213113 New option --no_load 2012-07-26 12:30:06 +00:00
89edfaf875 Updated change log 2012-07-20 16:53:09 +00:00
1297525889 Updated cdrskin tarball generator 2012-07-20 16:51:22 +00:00
5397f85d38 Made number transition to 1.2.5 2012-07-20 16:49:40 +00:00
37 changed files with 2018 additions and 264 deletions

View File

@ -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
===============================================================================

View File

@ -118,9 +118,9 @@ test_structest_CPPFLAGS = -Ilibburn
test_structest_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
test_structest_SOURCES = test/structest.c
## cdrskin construction site - ts A60816 - 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
View File

@ -6,12 +6,12 @@ This all is under GPL.
------------------------------------------------------------------------------
libburnia-project.org
By Mario Danic <mario.danic@gmail.com> and Thomas Schmitt <scdbackup@gmx.net>
Copyright (C) 2006-2012 Mario Danic, Thomas Schmitt
Copyright (C) 2006-2013 Mario Danic, Thomas Schmitt
Still containing parts of Libburn. By Derek Foreman <derek@signalmarketing.com>
and Ben Jansens <xor@orodu.net>
Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
http://files.libburnia-project.org/releases/libburn-1.2.2.tar.gz
http://files.libburnia-project.org/releases/libburn-1.3.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.
------------------------------------------------------------------------------

View File

@ -4,9 +4,9 @@
cdrskin. By Thomas Schmitt <scdbackup@gmx.net>
Integrated sub project of libburnia-project.org but also published via:
http://scdbackup.sourceforge.net/cdrskin_eng.html
http://scdbackup.sourceforge.net/cdrskin-1.2.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

View File

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

View File

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

View File

@ -2,7 +2,7 @@
.\" First parameter, NAME, should be all caps
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
.\" other parameters are allowed: see man(7), man(1)
.TH CDRSKIN 1 "Version 1.2.3, Jan 13, 2012"
.TH CDRSKIN 1 "Version 1.3.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.

View File

@ -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 */

View File

@ -65,7 +65,7 @@ connected via SCSI, PATA (aka IDE, ATA), USB, or SATA.
GPL software included:<BR>
</H2>
<DL>
<DT>libburn-1.2.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>&nbsp;</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>&nbsp;</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>

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2012.07.20.113001"
#define Cdrskin_timestamP "2013.05.31.080001"

View File

@ -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

View File

@ -1,14 +1,14 @@
#!/bin/sh
# compile_cdrskin.sh
# Copyright 2005 - 2012 Thomas Schmitt, scdbackup@gmx.net, GPL
# Copyright 2005 - 2013 Thomas Schmitt, scdbackup@gmx.net, GPL v2 or later
# to be executed within ./libburn-* resp ./cdrskin-*
debug_opts="-O2"
def_opts=
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
fifo_opts=""
libvers="-DCdrskin_libburn_1_2_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."

View File

@ -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

View File

@ -180,7 +180,7 @@ the next text of the same pack type. If no text of the same type follows,
then the remaining text bytes are set to 0.
The CRC algorithm uses divisor 0x11021. The resulting 16-bit residue of the
polynomial division get inverted and written as big-endian number to bytes
polynomial division gets inverted and written as big-endian number to bytes
16 and 17 of the pack.

View File

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

View File

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

View File

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

View File

@ -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])
{

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2012 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 2013 Thomas Schmitt <scdbackup@gmx.net>
Provided under GPL version 2 or later.
This is the official API definition of libburn.
@ -343,7 +343,6 @@ enum burn_drive_status
"session", "point", "pmin", ...
Do not rely on the current size of a burn_toc_entry.
ts A70201 : DVD extension, see below
*/
struct burn_toc_entry
{
@ -372,6 +371,8 @@ struct burn_toc_entry
older elements in this structure:
bit0= DVD extension is valid @since 0.3.2
@since 0.5.2 : DVD extensions are made valid for CD too
bit1= LRA extension is valid @since 0.7.2
bit2= Track status bits extension is valid @since 1.2.8
*/
unsigned char extensions_valid;
@ -393,6 +394,24 @@ struct burn_toc_entry
This would mean profiles: 0x11, 0x15, 0x13, 0x14, 0x51, 0x41, 0x42
*/
int last_recorded_address;
/* ts B30112 : Track status bits extension. extensions_valid:bit2 */
/* @since 1.2.8 */
/* Names as of READ TRACK INFORMATION, MMC-5 6.27.3 :
bit0 - bit3 = Track Mode
bit4 = Copy
bit5 = Damage
bit6 - bit7 = LJRS
bit8 - bit11 = Data Mode
bit12 = FP
bit13 = Packet/Inc
bit14 = Blank
bit15 = RT
bit16 = NWA_V
bit17 = LRA_V
*/
int track_status_bits;
};
@ -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*/

View File

@ -19,6 +19,7 @@ burn_disc_get_bd_spare_info;
burn_disc_get_cd_info;
burn_disc_get_format_descr;
burn_disc_get_formats;
burn_disc_get_incomplete_sessions;
burn_disc_get_leadin_text;
burn_disc_get_media_id;
burn_disc_get_msc1;
@ -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;

View File

@ -289,7 +289,7 @@ int libdax_msgs__sev_to_text(int severity, char **severity_name,
int flag)
{
if(flag&1) {
*severity_name= "NEVER\nABORT\nFATAL\nFAILURE\nMISHAP\nSORRY\nWARNING\nHINT\nNOTE\nUPDATE\nDEBUG\nERRFILE\nALL";
*severity_name= "ALL ERRFILE DEBUG UPDATE NOTE HINT WARNING SORRY MISHAP FAILURE FATAL ABORT NEVER";
return(1);
}
*severity_name= "";

View File

@ -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:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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;

View File

@ -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 */;

View File

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

View File

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

View File

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

View File

@ -1,7 +1,7 @@
/* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */
/* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens
Copyright (c) 2006 - 2011 Thomas Schmitt <scdbackup@gmx.net>
Copyright (c) 2006 - 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 *,

View File

@ -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)
{

View File

@ -1,10 +1,6 @@
#ifndef __UTIL
#define __UTIL
char *burn_strdup(char *s);
char *burn_strndup(char *s, int n);
/* ts A90905 */
int burn_util_make_printable_word(char **text, int flag);

View File

@ -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;
}

View File

@ -7,8 +7,9 @@
telltoc is a minimal demo application for the library libburn as provided
on http://libburnia-project.org . It can list the available devices, can
display some drive properties, the type of media, eventual table of content
and multisession info for mkisofs option -C .
display some drive properties, the type of media, eventual table of content,
multisession info for mkisofs option -C, and can read audio or data tracks.
It's main purpose, nevertheless, is to show you how to use libburn and also
to serve the libburn team as reference application. telltoc.c does indeed
define the standard way how above gestures can be implemented and stay upward
@ -25,8 +26,9 @@
telltoc_media() prints some information about the media in a drive
telltoc_toc() prints a table of content (if there is content)
telltoc_msinfo() prints parameters for mkisofs option -C
telltoc_read_and_print() reads from data CD or from DVD and prints 7-bit
to stdout (encodings 0,2) or 8-bit to file (encoding 1)
telltoc_read_and_print() reads from audio or data CD or from DVD or BD
and prints 7-bit to stdout (encodings 0,2) or 8-bit to
file (encoding 1)
When everything is done, main() releases the drive and shuts down libburn:
burn_drive_release();
burn_finish()
@ -75,9 +77,10 @@ int telltoc_aquire_by_adr(char *drive_adr);
int telltoc_aquire_by_driveno(int *drive_no, int silent);
/* A message from --toc to --read_and_print (CD tracksize is a bit tricky) */
/* Messages from --toc to --read_and_print (CD tracksize is a bit tricky) */
static int last_track_start = 0, last_track_size = -1;
static int media_is_cd_profile = 0;
static int medium_is_cd_profile = 0; /* 0 = undecided , -1 = no , 1 = yes */
static int cd_is_audio = 0; /* 0 = undecided , -1 = no , 1 = yes */
/* ------------------------------- API gestures ---------------------------- */
@ -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);