diff --git a/libisoburn/trunk/src/burn_wrap.c b/libisoburn/trunk/src/burn_wrap.c index ad35b117..1361aeaa 100644 --- a/libisoburn/trunk/src/burn_wrap.c +++ b/libisoburn/trunk/src/burn_wrap.c @@ -9,7 +9,7 @@ Copyright 2007 Thomas Schmitt, */ -/* <<< A70929 : hardcoded CD-RW with fabricated -msinfo = 0,1600 +/* <<< A70929 : hardcoded CD-RW with fabricated -msinfo #define Hardcoded_cd_rW 1 #define Hardcoded_cd_rw_c1 12999 #define Hardcoded_cd_rw_nwA 152660 @@ -289,20 +289,41 @@ void isoburn_disc_write(struct burn_write_opts *opts, struct burn_disc *disc) int ret, multi= 1; struct isoburn *o; struct burn_drive *drive; + char reasons[BURN_REASONS_LEN]; + enum burn_write_types write_type; drive= burn_write_opts_get_drive(opts); ret= isoburn_find_emulator(&o, drive, 0); if(ret<0) return; if(o!=NULL) { + o->wrote_well= -1; if(o->emulation_mode!=0) { multi= 0; if(o->emulation_mode>0 && o->nwa >= 0) burn_write_opts_set_start_byte(opts, ((off_t) o->nwa) * (off_t) 2048); } } + + /* fprintf(stderr, "isoburn_EXPERIMENTAL: multi = %d\n", multi); */ + /* burn_write_opts_set_simulate(opts, 1); */ + burn_write_opts_set_multi(opts, multi); + write_type= burn_write_opts_auto_write_type(opts, disc, reasons, 0); + if (write_type == BURN_WRITE_NONE) { + fprintf(stderr, "Failed to find a suitable write mode:\n%s\n", reasons); + o->wrote_well= 0; + return; + } + +/* + sprintf(reasons, "%d", (int) write_type); + fprintf(stderr, "isoburn_EXPERIMENTAL: write_type = %s\n", + (write_type == BURN_WRITE_SAO ? "SAO" : + (write_type == BURN_WRITE_TAO ? "TAO" : reasons))); +*/ + #ifdef Hardcoded_cd_rW /* <<< A70929 : hardcoded CD-RW with fabricated -msinfo */ fprintf(stderr, "Setting write address to LBA %d\n", Hardcoded_cd_rw_nwA); @@ -380,24 +401,37 @@ ex: } -#ifdef Libburn_obsoleted_on_its_way_ouT - -void isoburn_write_opts_set_start_byte(struct burn_write_opts *opts, - off_t value) +int isoburn_drive_wrote_well(struct burn_drive *d) { int ret; struct isoburn *o; - struct burn_drive *drive; - drive= burn_write_opts_get_drive(opts); - ret= isoburn_find_emulator(&o, drive, 0); - if(ret<=0) /* no emulation, no burn_write_opts_set_start_byte() */ - return; - ret = isoburn_set_start_byte(o, value, 0); - if(ret<=0) - return; - burn_write_opts_set_start_byte(opts, ((off_t) o->nwa) * (off_t) 2048); + ret= isoburn_find_emulator(&o, d, 0); + if(ret<0) + return(-1); + if(ret>0) + if(o->wrote_well>=0) + return(o->wrote_well); + ret= burn_drive_wrote_well(d); + return ret; +} + + +int isoburn_get_fifo_status(struct burn_drive *d, int *size, int *free_bytes, + char **status_text) +{ + int ret; + struct isoburn *o; + + ret= isoburn_find_emulator(&o, d, 0); + if(ret<0) + return(-1); + if(o==NULL) + return(0); + if(o->fifo==NULL) + return(0); + ret= burn_fifo_inquire_status(o->fifo, size, free_bytes, status_text); + return(ret); } -#endif /* Libburn_obsoleted_on_its_way_ouT */ diff --git a/libisoburn/trunk/src/isoburn.c b/libisoburn/trunk/src/isoburn.c index 2d00135a..012694ea 100644 --- a/libisoburn/trunk/src/isoburn.c +++ b/libisoburn/trunk/src/isoburn.c @@ -49,6 +49,8 @@ int isoburn_new(struct isoburn **objpt, int flag) o->emulation_mode= 0; o->min_start_byte= 0; o->nwa= 0; + o->fifo= NULL; + o->wrote_well= -1; o->src= NULL; o->fabricated_disc_status= BURN_DISC_UNREADY; for(i=0;i<65536;i++) @@ -83,6 +85,8 @@ int isoburn_destroy(struct isoburn **objpt, int flag) if(o->target_volset!=NULL) iso_volset_free(o->target_volset); + if(o->fifo!=NULL) + burn_source_free(o->fifo); free((char *) o); *objpt= NULL; @@ -228,7 +232,7 @@ static int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc, struct isoburn_source_opts *opts, int new_img) { - struct burn_source *wsrc, *fifo_src; + struct burn_source *wsrc; struct burn_session *session; struct burn_track *track; struct isoburn *o; @@ -237,8 +241,10 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc, int ret; ret= isoburn_find_emulator(&o, d, 0); - if(ret<0) + if(ret<0 || o==NULL) return -1; + o->wrote_well= 0; /* early end will be registered as failure */ + state = isoburn_disc_get_status(d); if (state != BURN_DISC_BLANK && state != BURN_DISC_APPENDABLE @@ -287,10 +293,11 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc, if (wsrc == NULL) return -1; - // TODO check return values for failure. propertly clean-up on error + /* TODO check return values for failure. propertly clean-up on error */ - fifo_src = burn_fifo_source_new(wsrc, 2048, 2000, 0); - if (fifo_src == NULL) { + o->fifo = burn_fifo_source_new(wsrc, 2048, 2000, 0); + burn_source_free(wsrc); + if (o->fifo == NULL) { fprintf(stderr, "Cannot attach fifo\n"); return -1; } @@ -298,9 +305,10 @@ int isoburn_prepare_disc_aux(struct burn_drive *d, struct burn_disc **disc, session = burn_session_create(); burn_disc_add_session(*disc, session, BURN_POS_END); track = burn_track_create(); - burn_track_set_source(track, fifo_src); + burn_track_set_source(track, o->fifo); burn_session_add_track(session, track, BURN_POS_END); - + + o->wrote_well= -1; /* neutral */ return 1; } diff --git a/libisoburn/trunk/src/isoburn.h b/libisoburn/trunk/src/isoburn.h index 9fc66ed9..b72ee2d6 100644 --- a/libisoburn/trunk/src/isoburn.h +++ b/libisoburn/trunk/src/isoburn.h @@ -46,6 +46,17 @@ struct isoburn { */ enum burn_disc_status fabricated_disc_status; + /* The fifo which is installed between track and libisofs burn_source + */ + struct burn_source *fifo; + + /* Indicator wether the most recent burn run worked : + -1 = undetermined, ask libburn , 0 = failure , 1 = success + To be inquired by isoburn_drive_wrote_well() + */ + int wrote_well; + + /* --- Vreixo's part --- */ /* The data source for reading the old image */ diff --git a/libisoburn/trunk/src/libisoburn.h b/libisoburn/trunk/src/libisoburn.h index 97e2172c..d4c2ab9f 100644 --- a/libisoburn/trunk/src/libisoburn.h +++ b/libisoburn/trunk/src/libisoburn.h @@ -233,6 +233,35 @@ int isoburn_prepare_new_image(struct burn_drive *d, struct burn_disc **disc, void isoburn_disc_write(struct burn_write_opts *o, struct burn_disc *disc); +/** Inquire state and fill parameters of the fifo which is attached to + the emerging track. This should be done in the pacifier loop while + isoburn_disc_write() or burn_disc_write() are active. + Hint: If only burn_write_opts and not burn_drive is known, then the drive + can be obtained by burn_write_opts_get_drive(). + @parm d The drive to which the track with the fifo gets burned. + @param size The total size of the fifo + @param free_bytes The current free capacity of the fifo + @param status_text Returns a pointer to a constant text, see below + @return <0 reply invalid, >=0 fifo status code: + bit0+1=input status, bit2=consumption status, i.e: + 0="standby" : data processing not started yet + 1="active" : input and consumption are active + 2="ending" : input has ended without error + 3="failing" : input had error and ended, + 4="unused" : ( consumption has ended before processing start ) + 5="abandoned" : consumption has ended prematurely + 6="ended" : consumption has ended without input error + 7="aborted" : consumption has ended after input error +*/ +int isoburn_get_fifo_status(struct burn_drive *d, int *size, int *free_bytes, + char **status_text); + + +/** Inquire whether the most recent write run was successful. + Wrapper for: burn_drive_wrote_well() +*/ +int isoburn_drive_wrote_well(struct burn_drive *d); + /** Call this after isoburn_disc_write has finished and burn_drive_wrote_well() indicates success. It will eventually complete the emulation of multi-session functionality, if needed at all. Let libisoburn decide. @@ -246,7 +275,7 @@ int isoburn_activate_session(struct burn_drive *drive); @param pacifier_func If not NULL: a function to produce appeasing messages. See burn_abort_pacifier() in libburn.h for an example. */ -// TODO implement this +/* TODO implement this */ int isoburn_perform_write(struct burn_write_opts *o, int (*pacifier_func)(void *handle, int patience, int elapsed));