Counting post-gap as part of track with burn_track_get_sectors()

This commit is contained in:
Thomas Schmitt 2012-01-23 09:30:48 +00:00
parent c481ccde85
commit b7c4ad2a90
5 changed files with 56 additions and 22 deletions

View File

@ -1 +1 @@
#define Cdrskin_timestamP "2012.01.18.141954" #define Cdrskin_timestamP "2012.01.22.194131"

View File

@ -2619,7 +2619,15 @@ struct burn_source *burn_fd_source_new(int datafd, int subfd, off_t size);
@param start The byte address where to start reading bytes for the @param start The byte address where to start reading bytes for the
consumer. inp bytes may get skipped to reach this address. consumer. inp bytes may get skipped to reach this address.
@param size The number of bytes to be delivered to the consumer. @param size The number of bytes to be delivered to the consumer.
@param flag Bitfield for control purposes (unused yet, submit 0). If size is <= 0 then it may be set later by a call of method
set_size(). If it is >= 0, then it can only be changed if
flag bit0 was set with burn_offst_source_new().
@param flag Bitfield for control purposes
bit0 = Prevent set_size() from overriding interval sizes > 0.
If such a size is already set, then the new one will
only affect the reply of get_size().
See also above struct burn_source.
@since 1.2.0
@return Pointer to a burn_source object, later to be freed by @return Pointer to a burn_source object, later to be freed by
burn_source_free(). NULL indicates failure. burn_source_free(). NULL indicates failure.
@since 0.8.8 @since 0.8.8
@ -2779,8 +2787,9 @@ int burn_fifo_fill(struct burn_source *fifo, int fill, int flag);
int burn_track_set_size(struct burn_track *t, off_t size); int burn_track_set_size(struct burn_track *t, off_t size);
/** Tells how long a track will be on disc /** Tells how many sectors a track will have on disc, resp. already has on
>>> NOTE: Not reliable with tracks of undefined length disc. This includes offset, payload, tail, and post-gap, but not pre-gap.
The result is NOT RELIABLE with tracks of undefined length
*/ */
int burn_track_get_sectors(struct burn_track *); int burn_track_get_sectors(struct burn_track *);
@ -3613,12 +3622,17 @@ typedef int (*burn_abort_handler_t)(void *handle, int signum, int flag);
@param handle Opaque handle eventually pointing to an application @param handle Opaque handle eventually pointing to an application
provided memory object provided memory object
@param handler A function to be called on signals. It will get handle as @param handler A function to be called on signals, if the handling bits
argument. flag will be 0. in parameter mode are set 0.
It will get parameter handle as argument. flag will be 0.
It should finally call burn_abort(). See there. It should finally call burn_abort(). See there.
@param mode : bit0 - bit3: If the handler function returns 2 or -2, then the wrapping
Receiving signals: signal handler of libburn will return and let the program
0 Call handler(handle, signum, 0) on nearly all signals continue its operations. Any other return value causes
exit(1).
@param mode : bit0 - bit3: Handling of received signals:
0 Install libburn wrapping signal handler, which will call
handler(handle, signum, 0) on nearly all signals
1 Enable system default reaction on all signals 1 Enable system default reaction on all signals
2 Try to ignore nearly all signals 2 Try to ignore nearly all signals
10 like mode 2 but handle SIGABRT like with mode 0 10 like mode 2 but handle SIGABRT like with mode 0

View File

@ -496,7 +496,10 @@ int burn_track_set_postgap_size(struct burn_track *t, int size, int flag)
return 1; return 1;
} }
int burn_track_get_sectors(struct burn_track *t) /* ts B20119: outsourced from burn_track_get_sectors()
@param flag bit0= do not add post-gap
*/
int burn_track_get_sectors_2(struct burn_track *t, int flag)
{ {
/* ts A70125 : was int */ /* ts A70125 : was int */
off_t size = 0; off_t size = 0;
@ -508,9 +511,12 @@ int burn_track_get_sectors(struct burn_track *t)
/* ts A90911 : will read blocks of 2056 bytes and write 2048 */ /* ts A90911 : will read blocks of 2056 bytes and write 2048 */
seclen += 8; seclen += 8;
if (t->source != NULL) /* ts A80808 : mending sigsegv */ if (t->source != NULL) { /* ts A80808 : mending sigsegv */
size = t->offset + t->source->get_size(t->source) + t->tail; size = t->offset + t->source->get_size(t->source) + t->tail;
else if(t->entry != NULL) { /* ts B20119 : adding post-gap */
if (t->postgap && !(flag & 1))
size += t->postgap_size;
} else if(t->entry != NULL) {
/* ts A80808 : all burn_toc_entry of track starts should now /* ts A80808 : all burn_toc_entry of track starts should now
have (extensions_valid & 1), even those from CD. have (extensions_valid & 1), even those from CD.
*/ */
@ -524,6 +530,11 @@ int burn_track_get_sectors(struct burn_track *t)
} }
int burn_track_get_sectors(struct burn_track *t)
{
return burn_track_get_sectors_2(t, 0);
}
/* ts A70125 */ /* ts A70125 */
int burn_track_set_sectors(struct burn_track *t, int sectors) int burn_track_set_sectors(struct burn_track *t, int sectors)
{ {
@ -1773,7 +1784,7 @@ overlapping_ba:;
else else
inp_src = crs->file_source; inp_src = crs->file_source;
src = burn_offst_source_new(inp_src, crs->offst_source, src = burn_offst_source_new(inp_src, crs->offst_source,
(off_t) (file_ba * crs->block_size), (off_t) 0, 0); (off_t) (file_ba * crs->block_size), (off_t) 0, 1);
if (src == NULL) if (src == NULL)
goto out_of_mem; goto out_of_mem;
@ -2040,8 +2051,10 @@ cannot_open:;
0, 0); 0, 0);
ret = 0; goto ex; ret = 0; goto ex;
} }
burn_track_set_size(crs->track, crs->source_size - ret = burn_track_set_size(crs->track, crs->source_size -
(off_t) (crs->current_file_ba * crs->block_size)); (off_t) (crs->current_file_ba * crs->block_size));
if (ret <= 0)
goto ex;
ret = cue_attach_track(session, crs, 0); ret = cue_attach_track(session, crs, 0);
if (ret <= 0) if (ret <= 0)

View File

@ -176,5 +176,10 @@ int burn_disc_cd_toc_extensions(struct burn_drive *drive, int flag);
struct burn_cdtext *burn_cdtext_create(void); struct burn_cdtext *burn_cdtext_create(void);
void burn_cdtext_free(struct burn_cdtext **cdtext); void burn_cdtext_free(struct burn_cdtext **cdtext);
/* ts B20119 */
/* @param flag bit0= do not add post-gap
*/
int burn_track_get_sectors_2(struct burn_track *t, int flag);
#endif /* BURN__STRUCTURE_H */ #endif /* BURN__STRUCTURE_H */

View File

@ -301,6 +301,7 @@ int burn_write_close_session(struct burn_write_opts *o)
This is useful only when changes about CD SAO get tested. This is useful only when changes about CD SAO get tested.
# define Libburn_write_with_function_print_cuE yes # define Libburn_write_with_function_print_cuE yes
*/ */
#define Libburn_write_with_function_print_cuE yes
#ifdef Libburn_write_with_function_print_cuE #ifdef Libburn_write_with_function_print_cuE
@ -608,7 +609,7 @@ struct cue_sheet *burn_create_toc_entries(struct burn_write_opts *o,
i decided to at least enforce the MMC specs' minimum i decided to at least enforce the MMC specs' minimum
track length. track length.
*/ */
track_length = burn_track_get_sectors(tar[i]); track_length = burn_track_get_sectors_2(tar[i], 1);
if (track_length < 300 && !burn_track_is_open_ended(tar[i])) { if (track_length < 300 && !burn_track_is_open_ended(tar[i])) {
track_length = 300; track_length = 300;
if (!tar[i]->pad) if (!tar[i]->pad)
@ -1151,7 +1152,8 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
/* <<< */ /* <<< */
sprintf(msg, sprintf(msg,
"TAO pre-track %2.2d : get_nwa(%d)=%d, d=%d , demand=%.f , cap=%.f\n", "TAO pre-track %2.2d : get_nwa(%d)=%d, d=%d , demand=%.f , cap=%.f\n",
tnum+1, nwa, ret, d->nwa, (double) burn_track_get_sectors(t) * 2048.0, tnum+1, nwa, ret, d->nwa,
(double) burn_track_get_sectors_2(t, 1) * 2048.0,
(double) d->media_capacity_remaining); (double) d->media_capacity_remaining);
libdax_msgs_submit(libdax_messenger, d->global_index, libdax_msgs_submit(libdax_messenger, d->global_index,
0x00000002, 0x00000002,
@ -1174,7 +1176,7 @@ int burn_write_track(struct burn_write_opts *o, struct burn_session *s,
/* user data */ /* user data */
sectors = burn_track_get_sectors(t); sectors = burn_track_get_sectors_2(t, 1);
open_ended = burn_track_is_open_ended(t); open_ended = burn_track_is_open_ended(t);
burn_disc_init_track_status(o, s, t, tnum, sectors); burn_disc_init_track_status(o, s, t, tnum, sectors);
@ -1539,7 +1541,7 @@ int burn_disc_open_track_dvd_minus_r(struct burn_write_opts *o,
#endif #endif
if (o->write_type == BURN_WRITE_SAO) { /* DAO */ if (o->write_type == BURN_WRITE_SAO) { /* DAO */
size = ((off_t) burn_track_get_sectors(s->track[tnum])) size = ((off_t) burn_track_get_sectors_2(s->track[tnum], 1))
* (off_t) 2048; * (off_t) 2048;
/* Eventually round track size up to write chunk */ /* Eventually round track size up to write chunk */
@ -1588,7 +1590,7 @@ int burn_disc_open_track_dvd_plus_r(struct burn_write_opts *o,
if (o->write_type == BURN_WRITE_SAO && if (o->write_type == BURN_WRITE_SAO &&
! burn_track_is_open_ended(s->track[tnum])) { ! burn_track_is_open_ended(s->track[tnum])) {
/* Round track size up to write chunk size and reserve track */ /* Round track size up to write chunk size and reserve track */
size = ((off_t) burn_track_get_sectors(s->track[tnum])) size = ((off_t) burn_track_get_sectors_2(s->track[tnum], 1))
* (off_t) 2048; * (off_t) 2048;
/* o->obs should be 32k or 64k already. But 32k alignment /* o->obs should be 32k or 64k already. But 32k alignment
was once performed in d->reserve_track() */ was once performed in d->reserve_track() */
@ -1862,7 +1864,7 @@ int burn_dvd_write_track(struct burn_write_opts *o,
goto ex; goto ex;
} }
sectors = burn_track_get_sectors(t); sectors = burn_track_get_sectors_2(t, 1);
open_ended = burn_track_is_open_ended(t); open_ended = burn_track_is_open_ended(t);
/* (offset padding is done within sector_data()) */ /* (offset padding is done within sector_data()) */
@ -2705,7 +2707,7 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s,
BURN_ALLOC_MEM(buf, char, bufsize); BURN_ALLOC_MEM(buf, char, bufsize);
sectors = burn_track_get_sectors(t); sectors = burn_track_get_sectors_2(t, 1);
burn_disc_init_track_status(o, s, t, tnum, sectors); burn_disc_init_track_status(o, s, t, tnum, sectors);
open_ended = burn_track_is_open_ended(t); open_ended = burn_track_is_open_ended(t);