Compare commits

..

22 Commits
1.2.6 ... 1.2.8

Author SHA1 Message Date
85b55e3f41 Updated change log 2013-03-18 08:39:22 +00:00
850c222954 Updated cdrskin tarball generator 2013-03-18 08:35:17 +00:00
c7bd0d4afb Made number transition to 1.2.8 2013-03-18 08:34:17 +00:00
f35a3e4582 Branching for libburn release 1.2.8 2013-03-18 07:54:06 +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
21 changed files with 632 additions and 117 deletions

View File

@ -1,3 +1,13 @@
libburn-1.2.8.tar.gz Mon Mar 08 2013
===============================================================================
* 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
* 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
libburn-1.2.6.tar.gz Tue Jan 08 2013
===============================================================================
* New cdrskin option --no_load

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 - B30318
cdrskin_cdrskin_CPPFLAGS = -Ilibburn
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_2_6
cdrskin_cdrskin_CFLAGS = -DCdrskin_libburn_1_2_8
# cdrskin_cdrskin_LDADD = $(libburn_libburn_la_OBJECTS) $(LIBBURN_EXTRALIBS)
# ts A80123, change proposed by Simon Huggins to cause dynamic libburn linking

13
README
View File

@ -11,7 +11,7 @@ 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.6.tar.gz
http://files.libburnia-project.org/releases/libburn-1.2.8.tar.gz
------------------------------------------------------------------------------
@ -19,10 +19,10 @@ Copyright (C) 2002-2006 Derek Foreman and Ben Jansens
From tarball
Obtain libburn-1.2.6.tar.gz, take it to a directory of your choice and do:
Obtain libburn-1.2.8.tar.gz, take it to a directory of your choice and do:
tar xzf libburn-1.2.6.tar.gz
cd libburn-1.2.6
tar xzf libburn-1.2.8.tar.gz
cd libburn-1.2.8
./configure --prefix=/usr
make
@ -692,6 +692,11 @@ Project history as far as known to me:
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.
------------------------------------------------------------------------------

View File

@ -4,7 +4,7 @@
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.6.tar.gz
http://scdbackup.sourceforge.net/cdrskin-1.2.8.tar.gz
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.6.tar.gz, take it to a directory of your choice and do:
Obtain cdrskin-1.2.8.tar.gz, take it to a directory of your choice and do:
tar xzf cdrskin-1.2.6.tar.gz
cd cdrskin-1.2.6
tar xzf cdrskin-1.2.8.tar.gz
cd cdrskin-1.2.8
Within that directory execute:

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.6"
skin_release="1.2.8"
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.7"
skin_release="1.2.9"
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.6, Jan 08, 2013"
.TH CDRSKIN 1 "Version 1.2.8, Mar 18, 2013"
.\" Please adjust this date whenever revising the manpage.
.\"
.\" Some roff macros, for reference:
@ -1243,6 +1243,27 @@ 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 ...".

View File

@ -87,7 +87,7 @@ or
/** The official program version */
#ifndef Cdrskin_prog_versioN
#define Cdrskin_prog_versioN "1.2.6"
#define Cdrskin_prog_versioN "1.2.8"
#endif
/** The official libburn interface revision to use.
@ -100,7 +100,7 @@ or
#define Cdrskin_libburn_minoR 2
#endif
#ifndef Cdrskin_libburn_micrO
#define Cdrskin_libburn_micrO 6
#define Cdrskin_libburn_micrO 8
#endif
@ -120,20 +120,20 @@ or
#undef Cdrskin_libburn_versioN
#endif
#ifdef Cdrskin_libburn_1_2_6
#define Cdrskin_libburn_versioN "1.2.6"
#ifdef Cdrskin_libburn_1_2_8
#define Cdrskin_libburn_versioN "1.2.8"
#endif
#ifdef Cdrskin_libburn_1_2_7
#define Cdrskin_libburn_versioN "1.2.7"
#ifdef Cdrskin_libburn_1_2_9
#define Cdrskin_libburn_versioN "1.2.9"
#endif
#ifndef Cdrskin_libburn_versioN
#define Cdrskin_libburn_1_2_6
#define Cdrskin_libburn_versioN "1.2.6"
#define Cdrskin_libburn_1_2_8
#define Cdrskin_libburn_versioN "1.2.8"
#endif
#ifdef Cdrskin_libburn_1_2_6
#ifdef Cdrskin_libburn_1_2_8
#undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO
@ -141,7 +141,7 @@ or
#define Cdrskin_libburn_minoR 2
#define Cdrskin_libburn_micrO 6
#endif
#ifdef Cdrskin_libburn_1_2_7
#ifdef Cdrskin_libburn_1_2_9
#undef Cdrskin_libburn_majoR
#undef Cdrskin_libburn_minoR
#undef Cdrskin_libburn_micrO
@ -2862,6 +2862,7 @@ 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");
@ -3110,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];
@ -3343,6 +3344,7 @@ struct CdrskiN {
char msifile[Cdrskin_strleN];
int do_atip;
int do_list_speeds;
int do_list_formats;
#ifdef Libburn_develop_quality_scaN
@ -3593,6 +3595,7 @@ 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
@ -4915,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;
@ -4951,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",
@ -4998,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);
@ -5039,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);
@ -5067,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;
@ -5079,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;
@ -5138,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)
@ -5157,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);
@ -5187,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;
@ -5233,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)
@ -5250,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, lba + size - 1, size);
}
}
}
printf("\n");
@ -5284,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)
@ -5563,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;
@ -7388,7 +7551,7 @@ int Cdrskin_qcheck(struct CdrskiN *skin, int flag)
*/
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;
@ -7428,7 +7591,8 @@ 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;
@ -8160,6 +8324,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() */;
@ -8924,14 +9092,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)

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.6</DT>
<DT>libburn-1.2.8</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.6.tar.gz">cdrskin-1.2.6.tar.gz</A>
(940 KB).
<DD><A HREF="cdrskin-1.2.8.tar.gz">cdrskin-1.2.8.tar.gz</A>
(945 KB).
</DD>
<DD><A HREF="cdrskin-1.2.6.tar.gz.sig">cdrskin-1.2.6.tar.gz.sig</A></DD>
<DD><A HREF="cdrskin-1.2.8.tar.gz.sig">cdrskin-1.2.8.tar.gz.sig</A></DD>
<DD>
(detached GPG signature for verification by
<KBD>gpg --verify cdrskin-1.2.6.tar.gz.sig cdrskin-1.2.6.tar.gz</KBD>
<KBD>gpg --verify cdrskin-1.2.8.tar.gz.sig cdrskin-1.2.8.tar.gz</KBD>
<BR>
after <KBD>gpg --keyserver keys.gnupg.net --recv-keys ABC0A854</KBD>).
</DD>
@ -257,17 +257,28 @@ 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.4:
Enhancements towards previous stable version cdrskin-1.2.6:
<UL>
<LI>New option --no_load</LI>
<LI>
-toc and -minfo now report about tracks in the incomplete session
</LI>
<LI>
New cdrskin option --list_speeds
</LI>
<!--
<LI>none</LI>
-->
</UL>
Bug fixes towards cdrskin-1.2.4:
Bug fixes towards cdrskin-1.2.6:
<UL>
<LI>Speed setting had no effect on BD media</LI>
<LI>
All CD tracks were reported with the sizes of the tracks in the
first session. Regression introduced with version 1.2.0
</LI>
<LI>
On some drives the request for minimum speed yielded maximum speed
</LI>
<!--
<LI>none</LI>
-->
@ -277,29 +288,31 @@ Bug fixes towards cdrskin-1.2.4:
<P>
<DL>
<DT><H3>Development snapshot, version 1.2.7 :</H3></DT>
<DD>Enhancements towards current stable version 1.2.6:
<DT><H3>Development snapshot, version 1.2.9 :</H3></DT>
<DD>Enhancements towards current stable version 1.2.8:
<UL>
<LI>none yet</LI>
<!--
<LI>none yet</LI>
-->
</UL>
</DD>
<DD>Bug fixes towards cdrskin-1.2.6:
<DD>Bug fixes towards cdrskin-1.2.8:
<UL>
<LI>none yet</LI>
<!--
<LI>none yet</LI>
-->
</UL>
</DD>
<DD>&nbsp;</DD>
<DD><A HREF="README_cdrskin_devel">README 1.2.7</A>
<DD><A HREF="cdrskin__help_devel">cdrskin-1.2.7 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin-1.2.7 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.2.7)</A></DD>
<DD><A HREF="README_cdrskin_devel">README 1.2.9</A>
<DD><A HREF="cdrskin__help_devel">cdrskin-1.2.9 --help</A></DD>
<DD><A HREF="cdrskin_help_devel">cdrskin-1.2.9 -help</A></DD>
<DD><A HREF="man_1_cdrskin_devel.html">man cdrskin (as of 1.2.9)</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>
@ -319,8 +332,8 @@ admins with full system souvereignty.</DT>
<A HREF="README_cdrskin_devel">upcoming README</A> ):
</DD>
<DD>
<A HREF="cdrskin-1.2.7.tar.gz">cdrskin-1.2.7.tar.gz</A>
(940 KB).
<A HREF="cdrskin-1.2.9.tar.gz">cdrskin-1.2.9.tar.gz</A>
(945 KB).
</DD>
<!-- This is not offered any more since spring 2008

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2013.01.08.090001"
#define Cdrskin_timestamP "2013.03.18.080001"

View File

@ -11554,7 +11554,7 @@ Made number transition to 1.2.6
+ cdrskin/add_ts_changes_to_libburn_1_2_7
Updated cdrskin tarball generator
08 Jan 2013 []
08 Jan 2013 [4938]
ChangeLog
cdrskin/changelog.txt
Updated change log
@ -11566,7 +11566,7 @@ Bug fix: Speed setting had no effect on BD media. Thanks to Dennis Vshivkov.
* New cdrskin option --no_load
[]
2013.01.08.144634 []
Makefile.am
configure.ac
README
@ -11579,11 +11579,131 @@ 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
[]
@ -11591,12 +11711,15 @@ ChangeLog
cdrskin/changelog.txt
Updated change log
[]
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
----------------------------------- 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
------------------------------------ cycle - cdrskin-1.2.7 -
[]
ChangeLog
@ -11604,15 +11727,7 @@ cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.2.7 -
[]
ChangeLog
cdrskin/cdrskin_eng.html
cdrskin/changelog.txt
Updated change log
------------------------------------ cycle - cdrskin-1.2.7 -
------------------------------------ cycle - cdrskin-1.2.9 -

View File

@ -8,7 +8,7 @@ debug_opts="-O2"
def_opts=
largefile_opts="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE=1"
fifo_opts=""
libvers="-DCdrskin_libburn_1_2_6"
libvers="-DCdrskin_libburn_1_2_8"
# 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_6"
elif test "$i" = "-libburn_1_2_8"
then
libvers="-DCdrskin_libburn_1_2_6"
libvers="-DCdrskin_libburn_1_2_8"
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_7"
libvers="-DCdrskin_libburn_1_2_9"
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_6 set macro to match libburn-1.2.6"
echo " -libburn_1_2_8 set macro to match libburn-1.2.8"
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.6], [http://libburnia-project.org])
AC_INIT([libburn], [1.2.8], [http://libburnia-project.org])
AC_PREREQ([2.50])
dnl AC_CONFIG_HEADER([config.h])
@ -99,6 +99,7 @@ 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
dnl So LT_CURRENT, LT_REVISION and LT_AGE get set directly here.
dnl SONAME of the emerging library is LT_CURRENT - LT_AGE.
@ -124,7 +125,7 @@ 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=6
BURN_MICRO_VERSION=8
BURN_VERSION=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION
AC_SUBST(BURN_MAJOR_VERSION)
@ -135,14 +136,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.6
dnl This is the release version libburn-1.2.8
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 = 83 - 79 = 4 . Linux library name = libburn.so.4.79.0
LT_CURRENT=83
LT_AGE=79
dnl SONAME = 85 - 81 = 4 . Linux library name = libburn.so.4.81.0
LT_CURRENT=85
LT_AGE=81
LT_REVISION=0
LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE`

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

@ -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
@ -3451,7 +3485,7 @@ 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 6
#define burn_header_version_micro 8
/** Note:
Above version numbers are also recorded in configure.ac because libtool
wants them as parameters at build time.
@ -4048,6 +4082,12 @@ 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

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;

View File

@ -1126,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,
@ -1253,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) {
@ -1279,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);
@ -1333,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,
@ -1341,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]);
@ -1359,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]);
@ -2029,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. */
@ -2713,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;
@ -4020,8 +4091,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;
@ -4104,7 +4177,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++) {
@ -4179,15 +4252,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;
}
@ -5014,6 +5097,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

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

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

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