Made use of 4 MB fifo
This commit is contained in:
parent
e2479d6088
commit
f3966e5fee
@ -370,7 +370,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
char source_adr[][4096], int source_adr_count,
|
char source_adr[][4096], int source_adr_count,
|
||||||
int multi, int simulate_burn, int all_tracks_type)
|
int multi, int simulate_burn, int all_tracks_type)
|
||||||
{
|
{
|
||||||
struct burn_source *data_src;
|
struct burn_source *data_src, *fifo_src[99];
|
||||||
struct burn_disc *target_disc;
|
struct burn_disc *target_disc;
|
||||||
struct burn_session *session;
|
struct burn_session *session;
|
||||||
struct burn_write_opts *burn_options;
|
struct burn_write_opts *burn_options;
|
||||||
@ -379,6 +379,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
struct burn_progress progress;
|
struct burn_progress progress;
|
||||||
time_t start_time;
|
time_t start_time;
|
||||||
int last_sector = 0, padding = 0, trackno, unpredicted_size = 0, fd;
|
int last_sector = 0, padding = 0, trackno, unpredicted_size = 0, fd;
|
||||||
|
int fifo_chunksize = 2352, fifo_chunks = 1783; /* ~ 4 MB fifo */
|
||||||
off_t fixed_size;
|
off_t fixed_size;
|
||||||
char *adr, reasons[BURN_REASONS_LEN];
|
char *adr, reasons[BURN_REASONS_LEN];
|
||||||
struct stat stbuf;
|
struct stat stbuf;
|
||||||
@ -387,6 +388,8 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
all_tracks_type = BURN_MODE1;
|
all_tracks_type = BURN_MODE1;
|
||||||
/* a padding of 300 kiB helps to avoid the read-ahead bug */
|
/* a padding of 300 kiB helps to avoid the read-ahead bug */
|
||||||
padding = 300*1024;
|
padding = 300*1024;
|
||||||
|
fifo_chunksize = 2048;
|
||||||
|
fifo_chunks = 2048; /* 4 MB fifo */
|
||||||
}
|
}
|
||||||
|
|
||||||
target_disc = burn_disc_create();
|
target_disc = burn_disc_create();
|
||||||
@ -397,6 +400,7 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
tracklist[trackno] = track = burn_track_create();
|
tracklist[trackno] = track = burn_track_create();
|
||||||
burn_track_define_data(track, 0, padding, 1, all_tracks_type);
|
burn_track_define_data(track, 0, padding, 1, all_tracks_type);
|
||||||
|
|
||||||
|
/* Open file descriptor to source of track data */
|
||||||
adr = source_adr[trackno];
|
adr = source_adr[trackno];
|
||||||
fixed_size = 0;
|
fixed_size = 0;
|
||||||
if (adr[0] == '-' && adr[1] == 0) {
|
if (adr[0] == '-' && adr[1] == 0) {
|
||||||
@ -410,6 +414,8 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
}
|
}
|
||||||
if (fixed_size==0)
|
if (fixed_size==0)
|
||||||
unpredicted_size = 1;
|
unpredicted_size = 1;
|
||||||
|
|
||||||
|
/* Convert this filedescriptor into a burn_source object */
|
||||||
data_src = NULL;
|
data_src = NULL;
|
||||||
if (fd>=0)
|
if (fd>=0)
|
||||||
data_src = burn_fd_source_new(fd, -1, fixed_size);
|
data_src = burn_fd_source_new(fd, -1, fixed_size);
|
||||||
@ -421,14 +427,28 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
strerror(errno));
|
strerror(errno));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (burn_track_set_source(track, data_src) != BURN_SOURCE_OK) {
|
/* Install a fifo object on top of that data source object */
|
||||||
|
fifo_src[trackno] = burn_fifo_source_new(data_src,
|
||||||
|
fifo_chunksize, fifo_chunks, 0);
|
||||||
|
if (fifo_src[trackno] == NULL) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"FATAL: Could not create fifo object of 4 MB\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Use the fifo object as data source for the track */
|
||||||
|
if (burn_track_set_source(track, fifo_src[trackno])
|
||||||
|
!= BURN_SOURCE_OK) {
|
||||||
printf("FATAL: Cannot attach source object to track object\n");
|
printf("FATAL: Cannot attach source object to track object\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
burn_session_add_track(session, track, BURN_POS_END);
|
burn_session_add_track(session, track, BURN_POS_END);
|
||||||
printf("Track %d : source is '%s'\n", trackno+1, adr);
|
printf("Track %d : source is '%s'\n", trackno+1, adr);
|
||||||
|
|
||||||
|
/* Give up local reference to the data burn_source object */
|
||||||
burn_source_free(data_src);
|
burn_source_free(data_src);
|
||||||
|
|
||||||
} /* trackno loop end */
|
} /* trackno loop end */
|
||||||
|
|
||||||
/* Evaluate drive and media */
|
/* Evaluate drive and media */
|
||||||
@ -470,23 +490,40 @@ int libburner_payload(struct burn_drive *drive,
|
|||||||
while (burn_drive_get_status(drive, NULL) == BURN_DRIVE_SPAWNING)
|
while (burn_drive_get_status(drive, NULL) == BURN_DRIVE_SPAWNING)
|
||||||
usleep(1002);
|
usleep(1002);
|
||||||
while (burn_drive_get_status(drive, &progress) != BURN_DRIVE_IDLE) {
|
while (burn_drive_get_status(drive, &progress) != BURN_DRIVE_IDLE) {
|
||||||
if( progress.sectors <= 0 || progress.sector == last_sector)
|
if( progress.sectors <= 0)
|
||||||
printf(
|
printf(
|
||||||
"Thank you for being patient since %d seconds.\n",
|
"Thank you for being patient since %d seconds.",
|
||||||
(int) (time(0) - start_time));
|
(int) (time(0) - start_time));
|
||||||
else if(unpredicted_size)
|
else if(unpredicted_size)
|
||||||
printf("Track %d : sector %d\n", progress.track+1,
|
printf("Track %d : sector %d", progress.track+1,
|
||||||
progress.sector);
|
progress.sector);
|
||||||
else
|
else
|
||||||
printf("Track %d : sector %d of %d\n",progress.track+1,
|
printf("Track %d : sector %d of %d",progress.track+1,
|
||||||
progress.sector, progress.sectors);
|
progress.sector, progress.sectors);
|
||||||
last_sector = progress.sector;
|
last_sector = progress.sector;
|
||||||
|
if (progress.track >= 0 && progress.track < source_adr_count) {
|
||||||
|
int size, free_bytes, ret;
|
||||||
|
static char ind[8][16] = {
|
||||||
|
"-", "active", "ending", "input error",
|
||||||
|
"-", "no reader", "ended", "aborted"};
|
||||||
|
|
||||||
|
ret = burn_fifo_inquire_status(
|
||||||
|
fifo_src[progress.track], &size, &free_bytes);
|
||||||
|
if (ret > 0 && ret <8)
|
||||||
|
printf(" [fifo %s, %2d%% fill]", ind[ret],
|
||||||
|
(int) (100.0 - 100.0 *
|
||||||
|
((double) free_bytes) /
|
||||||
|
(double) size));
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
sleep(1);
|
sleep(1);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
for (trackno = 0 ; trackno < source_adr_count; trackno++)
|
for (trackno = 0 ; trackno < source_adr_count; trackno++) {
|
||||||
|
burn_source_free(fifo_src[trackno]);
|
||||||
burn_track_free(tracklist[trackno]);
|
burn_track_free(tracklist[trackno]);
|
||||||
|
}
|
||||||
burn_session_free(session);
|
burn_session_free(session);
|
||||||
burn_disc_free(target_disc);
|
burn_disc_free(target_disc);
|
||||||
if (multi && current_profile != 0x1a && current_profile != 0x13 &&
|
if (multi && current_profile != 0x1a && current_profile != 0x13 &&
|
||||||
|
Loading…
Reference in New Issue
Block a user