diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 71b4ab3..984a9f9 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2024.02.27.194737" +#define Cdrskin_timestamP "2024.03.01.185046" diff --git a/configure.ac b/configure.ac index e0e3522..2681362 100644 --- a/configure.ac +++ b/configure.ac @@ -152,12 +152,12 @@ LT_RELEASE=$BURN_MAJOR_VERSION.$BURN_MINOR_VERSION.$BURN_MICRO_VERSION dnl dnl ### This is the release version libburn-1.5.6 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 ### LT_CURRENT++, LT_AGE++ has not yet happened. +dnl LT_CURRENT++, LT_AGE++ has happened meanwhile. dnl -dnl SONAME = 113 - 109 = 4 . Linux library name = libburn.so.4.109.0 -LT_CURRENT=113 -LT_AGE=109 +dnl SONAME = 114 - 110 = 4 . Linux library name = libburn.so.4.110.0 +LT_CURRENT=114 +LT_AGE=110 LT_REVISION=0 LT_CURRENT_MINUS_AGE=`expr $LT_CURRENT - $LT_AGE` diff --git a/libburn/async.c b/libburn/async.c index 42f24da..926aa24 100644 --- a/libburn/async.c +++ b/libburn/async.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2017 Thomas Schmitt + Copyright (c) 2006 - 2024 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -279,7 +279,7 @@ static void *scan_worker_func(struct w_list *w) } static void reset_progress(struct burn_drive *d, int sessions, int tracks, - int indices, int sectors, int flag) + int indices, off_t sectors, int flag) { /* reset the progress indicator */ d->progress.session = 0; @@ -412,7 +412,7 @@ void burn_disc_erase(struct burn_drive *drive, int fast) return; } - reset_progress(drive, 1, 1, 1, 0x10000, 0); + reset_progress(drive, 1, 1, 1, (off_t) 0x10000, 0); /* A70103 : will be set to 0 by burn_disc_erase_sync() */ drive->cancel = 1; @@ -494,7 +494,7 @@ void burn_disc_format(struct burn_drive *drive, off_t size, int flag) int ok = 0, ret; char msg[40]; - reset_progress(drive, 1, 1, 1, 0x10000, 0); + reset_progress(drive, 1, 1, 1, (off_t) 0x10000, 0); if ((SCAN_GOING()) || find_worker(drive) != NULL) { libdax_msgs_submit(libdax_messenger, drive->global_index, @@ -652,7 +652,7 @@ void burn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc) } reset_progress(d, disc->sessions, disc->session[0]->tracks, - disc->session[0]->track[0]->indices, 0, 0); + disc->session[0]->track[0]->indices, (off_t) 0, 0); /* For the next lines any return indicates failure */ d->cancel = 1; diff --git a/libburn/drive.c b/libburn/drive.c index 99be0db..1ff182b 100644 --- a/libburn/drive.c +++ b/libburn/drive.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2021 Thomas Schmitt + Copyright (c) 2006 - 2024 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -1136,12 +1136,13 @@ int burn_disc_erasable(struct burn_drive *d) { return d->erasable; } -enum burn_drive_status burn_drive_get_status(struct burn_drive *d, - struct burn_progress *p) + + +void burn_drive_get_status_sig_handling(void) { /* --- Part of asynchronous signal handling --- */ - /* This frequently used call may be used to react on messages from - the libburn built-in signal handler. + /* The frequently used callx burn_drive_get_status*() may be used + to react on messages from the libburn built-in signal handler. */ /* ts B00225 : @@ -1165,11 +1166,61 @@ enum burn_drive_status burn_drive_get_status(struct burn_drive *d, } /* --- End of asynchronous signal handling --- */ +} +enum burn_drive_status burn_drive_get_status(struct burn_drive *d, + struct burn_progress *p) +{ + burn_drive_get_status_sig_handling(); + if (p != NULL) { - memcpy(p, &(d->progress), sizeof(struct burn_progress)); /* TODO: add mutex */ + + p->sessions = d->progress.sessions; + p->session = d->progress.session; + p->tracks = d->progress.tracks; + p->track = d->progress.track; + p->indices = d->progress.indices; + p->index = d->progress.index; + if(d->progress.start_sector < 0x80000000) + p->start_sector = d->progress.start_sector; + else + p->start_sector = 0x7fffffff; + if(d->progress.sectors < 0x80000000) + p->sectors = d->progress.sectors; + else + p->sectors = 0x7fffffff; + if(d->progress.sector < 0x80000000) + p->sector = d->progress.sector; + else + p->sector = 0x7fffffff; + if(d->progress.buffer_capacity < 0x100000000) + p->buffer_capacity = d->progress.buffer_capacity; + else + p->buffer_capacity = 0xffffffff; + if(d->progress.buffer_available < 0x100000000) + p->buffer_available = d->progress.buffer_available; + else + p->buffer_available = 0xffffffff; + p->buffered_bytes = d->progress.buffered_bytes; + if(d->progress.buffer_min_fill < 0x100000000) + p->buffer_min_fill = d->progress.buffer_min_fill; + else + p->buffer_min_fill = 0xffffffff; + } + return d->busy; +} + + +enum burn_drive_status burn_drive_get_status_v2(struct burn_drive *d, + struct burn_progress_v2 *p) +{ + burn_drive_get_status_sig_handling(); + if (p != NULL) { + /* TODO: add mutex */ + + memcpy(p, &(d->progress), sizeof(struct burn_progress_v2)); } return d->busy; } diff --git a/libburn/libburn.h b/libburn/libburn.h index c604be8..151d3fc 100644 --- a/libburn/libburn.h +++ b/libburn/libburn.h @@ -680,7 +680,8 @@ struct burn_drive_info /** Operation progress report. All values are 0 based indices. - * */ + Handed out by burn_drive_get_status(). + **/ struct burn_progress { /** The total number of sessions */ int sessions; @@ -722,6 +723,52 @@ struct burn_progress { }; +/** Operation progress report with long block numbers. + All values are 0 based indices. + Handed out by burn_drive_get_status_v2(). + @since 1.5.8 + **/ +struct burn_progress_v2 { + /** Revision of the struct format. + 0= Elements up to .buffer_min_fill */ + int revision; + + /** The total number of sessions */ + int sessions; + /** Current session.*/ + int session; + /** The total number of tracks */ + int tracks; + /** Current track. */ + int track; + /** The total number of indices */ + int indices; + /** Current index. */ + int index; + /** The starting logical block address */ + off_t start_sector; + /** On write: The number of sectors. + On blank: 0x10000 as upper limit for relative progress steps */ + off_t sectors; + /** On write: The current sector being processed. + On blank: Relative progress steps 0 to 0x10000 */ + off_t sector; + + /** The capacity of the drive buffer */ + off_t buffer_capacity; + /** The free space in the drive buffer (might be slightly outdated) */ + off_t buffer_available; + + /** The number of bytes sent to the drive buffer */ + off_t buffered_bytes; + /** The minimum number of bytes stored in buffer during write. + (Caution: Before surely one buffer size of bytes was processed, + this value is 0xffffffffffffffff.) + */ + off_t buffer_min_fill; +}; + + /* ts A61226 */ /* @since 0.3.0 */ /** Description of a speed capability as reported by the drive in conjunction @@ -1667,6 +1714,15 @@ int burn_disc_erasable(struct burn_drive *d); enum burn_drive_status burn_drive_get_status(struct burn_drive *drive, struct burn_progress *p); +/** Returns the progress with long block numbers and the status of the drive. + @param drive The drive to query busy state for. + @param p Returns the progress of the operation, NULL if you don't care + @return the current status of the drive. See also burn_drive_status. + @since 1.5.8 +*/ +enum burn_drive_status burn_drive_get_status_v2(struct burn_drive *drive, + struct burn_progress_v2 *p); + /** Creates a write_opts struct for burning to the specified drive. The returned object must later be freed with burn_write_opts_free(). @param drive The drive to write with diff --git a/libburn/libburn.ver b/libburn/libburn.ver index 7a52e5e..458842d 100644 --- a/libburn/libburn.ver +++ b/libburn/libburn.ver @@ -213,3 +213,8 @@ libdax_audioxtr_new; libdax_audioxtr_read; local: *; }; + +LIBBURN4_1.5.8 { +burn_drive_get_status_v2; +} LIBBURN4; + diff --git a/libburn/mmc.c b/libburn/mmc.c index 5946d9c..c100301 100644 --- a/libburn/mmc.c +++ b/libburn/mmc.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2016 Thomas Schmitt + Copyright (c) 2006 - 2024 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -766,7 +766,8 @@ ex:; */ static int mmc_wait_for_buffer_free(struct burn_drive *d, struct buffer *buf) { - int usec= 0, need, reported_3s = 0, first_wait = 1; + int usec= 0, reported_3s = 0, first_wait = 1; + off_t need; struct timeval t0,tnow; double max_fac, min_fac, waiting; @@ -1065,7 +1066,7 @@ fprintf(stderr, "libburn_DEBUG: buffer sectors= %d bytes= %d\n", */ if (d->current_profile == 0x14 && d->write_opts != NULL && (d->progress.buffer_capacity == 0 || - start < (int) d->progress.buffer_capacity / 2048) && + start < (off_t) d->progress.buffer_capacity / 2048) && key == 5 && asc == 0x64 && ascq == 0) { if (d->write_opts->write_type == BURN_WRITE_TAO) { d->was_feat21h_failure = 1 + (start == 0); @@ -3706,7 +3707,7 @@ int mmc_read_buffer_capacity(struct burn_drive *d) d->pessimistic_buffer_free = d->progress.buffer_available; d->pbf_altered = 0; if (d->progress.buffered_bytes >= d->progress.buffer_capacity){ - double fill; + off_t fill; fill = d->progress.buffer_capacity - d->progress.buffer_available; diff --git a/libburn/mmc.h b/libburn/mmc.h index 89eee85..0aa214f 100644 --- a/libburn/mmc.h +++ b/libburn/mmc.h @@ -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 - 2014 Thomas Schmitt + Copyright (c) 2006 - 2024 Thomas Schmitt Provided under GPL version 2 or later. */ diff --git a/libburn/transport.h b/libburn/transport.h index 43552a6..eea4cb4 100644 --- a/libburn/transport.h +++ b/libburn/transport.h @@ -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 - 2020 Thomas Schmitt + Copyright (c) 2006 - 2024 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -394,7 +394,7 @@ struct burn_drive struct burn_disc *disc; /* disc structure */ int block_types[4]; struct buffer *buffer; - struct burn_progress progress; + struct burn_progress_v2 progress; /* To be used by mmc.c, sbc.c, spc.c for SCSI commands where the struct content surely does not have to persist while another command gets diff --git a/libburn/write.c b/libburn/write.c index 8c86769..c0433bb 100644 --- a/libburn/write.c +++ b/libburn/write.c @@ -1,7 +1,7 @@ /* -*- indent-tabs-mode: t; tab-width: 8; c-basic-offset: 8; -*- */ /* Copyright (c) 2004 - 2006 Derek Foreman, Ben Jansens - Copyright (c) 2006 - 2021 Thomas Schmitt + Copyright (c) 2006 - 2024 Thomas Schmitt Provided under GPL version 2 or later. */ @@ -1358,7 +1358,7 @@ int burn_disc_init_write_status(struct burn_write_opts *o, d->progress.buffer_capacity = 0; d->progress.buffer_available = 0; d->progress.buffered_bytes = 0; - d->progress.buffer_min_fill = 0xffffffff; + d->progress.buffer_min_fill = 0x7fffffffffffffff; /* ts A70711 */ d->pessimistic_buffer_free = 0; @@ -1897,7 +1897,7 @@ int burn_dvd_write_track(struct burn_write_opts *o, struct buffer *out = d->buffer; int sectors; 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; + off_t first_buf_cap = 0, further_cap = 0, buf_cap_step = 1024; /* ts A70213 : eventually expand size of track to max */ burn_track_apply_fillup(t, d->media_capacity_remaining, 0); @@ -2836,7 +2836,8 @@ int burn_stdio_write_track(struct burn_write_opts *o, struct burn_session *s, struct burn_track *t = s->track[tnum]; struct burn_drive *d = o->drive; char *buf = NULL; - int i, prev_sync_sector = 0, us_corr = 0, max_corr = 250000; + int i, us_corr = 0, max_corr = 250000; + off_t prev_sync_sector = 0; struct buffer *out = d->buffer; struct timeval prev_time;