Made use of formatting of DVD-RW

This commit is contained in:
Thomas Schmitt 2007-01-02 12:57:47 +00:00
parent bee5484d46
commit 441c2a32cd
2 changed files with 68 additions and 14 deletions

View File

@ -7,7 +7,7 @@
Libburnia is an open-source project for reading, mastering and writing Libburnia is an open-source project for reading, mastering and writing
optical discs. For now this means only CD-R and CD-RW. optical discs. For now this means only CD-R and CD-RW.
Support for DVD+RW is emerging. Support for DVD+RW and DVD-RW is emerging.
The project comprises of several more or less interdependent parts which The project comprises of several more or less interdependent parts which
@ -84,7 +84,7 @@ libburner is a minimal demo application for the library libburn
(see: libburn/libburn.h) as provided on http://libburn.pykix.org . (see: libburn/libburn.h) as provided on http://libburn.pykix.org .
It can list the available devices, can blank a CD-RW and It can list the available devices, can blank a CD-RW and
can burn to CD-R or CD-RW. can burn to CD-R or CD-RW.
New: burning to DVD+RW (single data track, single session only). New: burning to DVD+/-RW (single data track, single session only).
It's main purpose, nevertheless, is to show you how to use libburn and also It's main purpose, nevertheless, is to show you how to use libburn and also
to serve the libburnia team as reference application. libburner does indeed to serve the libburnia team as reference application. libburner does indeed

View File

@ -8,7 +8,8 @@
libburner is a minimal demo application for the library libburn as provided libburner is a minimal demo application for the library libburn as provided
on http://libburnia.pykix.org . It can list the available devices, can on http://libburnia.pykix.org . It can list the available devices, can
blank a CD-RW and can burn to CD-R, CD-RW or DVD+RW. blank a CD-RW, can format a DVD-RW, and can burn to CD-R, CD-RW, DVD+RW
or DVD-RW.
It's main purpose, nevertheless, is to show you how to use libburn and also It's main purpose, nevertheless, is to show you how to use libburn and also
to serve the libburnia team as reference application. libburner.c does indeed to serve the libburnia team as reference application. libburner.c does indeed
define the standard way how above three gestures can be implemented and define the standard way how above three gestures can be implemented and
@ -25,7 +26,9 @@
libburner_aquire_by_driveno() demonstrates a scan-and-choose approach libburner_aquire_by_driveno() demonstrates a scan-and-choose approach
With that aquired drive you can blank a CD-RW With that aquired drive you can blank a CD-RW
libburner_blank_disc() libburner_blank_disc()
With the aquired drive you can burn to CD-R, blank CD-RW or DVD+RW or you can format a DVD-RW to profile "Restricted Overwrite" (needed once)
libburner_format_row()
With the aquired drive you can burn to CD-R, CD-RW, DVD+RW, DVD-RW
libburner_payload() libburner_payload()
When everything is done, main() releases the drive and shuts down libburn: When everything is done, main() releases the drive and shuts down libburn:
burn_drive_release(); burn_drive_release();
@ -68,7 +71,8 @@ static unsigned int drive_count;
finally released */ finally released */
static int drive_is_grabbed = 0; static int drive_is_grabbed = 0;
/** A text describing the type of media in aquired drive */ /** A number and a text describing the type of media in aquired drive */
static int current_profile= -1;
static char current_profile_name[80]= {""}; static char current_profile_name[80]= {""};
@ -93,7 +97,7 @@ int libburner_aquire_by_driveno(int *drive_no);
*/ */
int libburner_aquire_drive(char *drive_adr, int *driveno) int libburner_aquire_drive(char *drive_adr, int *driveno)
{ {
int ret, x; int ret;
if(drive_adr != NULL && drive_adr[0] != 0) if(drive_adr != NULL && drive_adr[0] != 0)
ret = libburner_aquire_by_adr(drive_adr); ret = libburner_aquire_by_adr(drive_adr);
@ -101,7 +105,8 @@ int libburner_aquire_drive(char *drive_adr, int *driveno)
ret = libburner_aquire_by_driveno(driveno); ret = libburner_aquire_by_driveno(driveno);
if (ret <= 0) if (ret <= 0)
return ret; return ret;
burn_disc_get_profile(drive_list[0].drive, &x, current_profile_name); burn_disc_get_profile(drive_list[0].drive, &current_profile,
current_profile_name);
if (current_profile_name[0]) if (current_profile_name[0])
printf("Detected media type: %s\n", current_profile_name); printf("Detected media type: %s\n", current_profile_name);
return 1; return 1;
@ -274,7 +279,7 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
return 0; return 0;
} else { } else {
fprintf(stderr, fprintf(stderr,
"FATAL: Cannot recognize drive and media state\n"); "FATAL: Unsuitable drive and media state\n");
return 0; return 0;
} }
if(!burn_disc_erasable(drive)) { if(!burn_disc_erasable(drive)) {
@ -298,6 +303,46 @@ int libburner_blank_disc(struct burn_drive *drive, int blank_fast)
} }
/** Persistently changes DVD-RW profile 0014h "Sequential Recording"
to profile 0013h "Restricted Overwrite" which is usable with libburner.
Expect a behavior similar to blanking with unusual noises from the drive.
*/
int libburner_format_row(struct burn_drive *drive)
{
struct burn_progress p;
int percent = 1;
if (current_profile == 0x13) {
fprintf(stderr, "IDLE: DVD-RW media is already formatted\n");
return 2;
} else if (current_profile != 0x14) {
fprintf(stderr, "FATAL: Can only format DVD-RW\n");
return 0;
}
printf("Beginning to format media.\n");
burn_disc_format(drive, 0);
sleep(1);
while (burn_drive_get_status(drive, &p) != BURN_DRIVE_IDLE) {
if(p.sectors>0 && p.sector>=0) /* display 1 to 99 percent */
percent = 1.0 + ((double) p.sector+1.0)
/ ((double) p.sectors) * 98.0;
printf("Formatting ( %d%% done )\n", percent);
sleep(1);
}
burn_disc_get_profile(drive_list[0].drive, &current_profile,
current_profile_name);
printf("Media type now: %4.4xh \"%s\"\n",
current_profile, current_profile_name);
if (current_profile != 0x13) {
fprintf(stderr,
"FATAL: Failed to change media profile to desired value\n");
return 0;
}
return 1;
}
/** Brings preformatted track images (ISO 9660, audio, ...) onto media. /** Brings preformatted track images (ISO 9660, audio, ...) onto media.
To make sure a data image is fully readable on any Linux machine, this To make sure a data image is fully readable on any Linux machine, this
function adds 300 kB of padding to the (usualy single) track. function adds 300 kB of padding to the (usualy single) track.
@ -431,7 +476,8 @@ int libburner_payload(struct burn_drive *drive,
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 && strcmp(current_profile_name, "DVD+RW") != 0) if (multi && strcmp(current_profile_name, "DVD+RW") != 0 &&
current_profile != 0x13)
printf("NOTE: Media left appendable.\n"); printf("NOTE: Media left appendable.\n");
if (simulate_burn) if (simulate_burn)
printf("\n*** Did TRY to SIMULATE burning ***\n\n"); printf("\n*** Did TRY to SIMULATE burning ***\n\n");
@ -490,6 +536,9 @@ int libburner_setup(int argc, char **argv)
} }
strcpy(drive_adr, argv[i]); strcpy(drive_adr, argv[i]);
} }
} else if (!strcmp(argv[i], "--format_overwrite")) {
do_blank = 101;
} else if (!strcmp(argv[i], "--multi")) { } else if (!strcmp(argv[i], "--multi")) {
do_multi = 1; do_multi = 1;
@ -528,7 +577,8 @@ int libburner_setup(int argc, char **argv)
if (print_help || insuffient_parameters ) { if (print_help || insuffient_parameters ) {
printf("Usage: %s\n", argv[0]); printf("Usage: %s\n", argv[0]);
printf(" [--drive <address>|<driveno>|\"-\"] [--audio]\n"); printf(" [--drive <address>|<driveno>|\"-\"] [--audio]\n");
printf(" [--blank_fast|--blank_full] [--try_to_simulate]\n"); printf(" [--blank_fast|--blank_full|--format_overwrite]\n");
printf(" [--try_to_simulate]\n");
printf(" [--multi] [<one or more imagefiles>|\"-\"]\n"); printf(" [--multi] [<one or more imagefiles>|\"-\"]\n");
printf("Examples\n"); printf("Examples\n");
printf("A bus scan (needs rw-permissions to see a drive):\n"); printf("A bus scan (needs rw-permissions to see a drive):\n");
@ -539,7 +589,9 @@ int libburner_setup(int argc, char **argv)
printf(" %s --drive /dev/hdc my_image_file\n", argv[0]); printf(" %s --drive /dev/hdc my_image_file\n", argv[0]);
printf("Blank a used CD-RW (is combinable with burning in one run):\n"); printf("Blank a used CD-RW (is combinable with burning in one run):\n");
printf(" %s --drive /dev/hdc --blank_fast\n",argv[0]); printf(" %s --drive /dev/hdc --blank_fast\n",argv[0]);
printf("Burn two audio tracks\n"); printf("Format a DVD-RW once before first use with libburner:\n");
printf(" %s --drive /dev/hdc --format_overwrite\n", argv[0]);
printf("Burn two audio tracks:\n");
printf(" lame --decode -t /path/to/track1.mp3 track1.cd\n"); printf(" lame --decode -t /path/to/track1.mp3 track1.cd\n");
printf(" test/dewav /path/to/track2.wav -o track2.cd\n"); printf(" test/dewav /path/to/track2.wav -o track2.cd\n");
printf(" %s --drive /dev/hdc --audio track1.cd track2.cd\n", argv[0]); printf(" %s --drive /dev/hdc --audio track1.cd track2.cd\n", argv[0]);
@ -547,7 +599,6 @@ int libburner_setup(int argc, char **argv)
printf(" ( cd my_directory ; find . -print | afio -oZ - ) | \\\n"); printf(" ( cd my_directory ; find . -print | afio -oZ - ) | \\\n");
printf(" %s --drive /dev/hdc -\n", argv[0]); printf(" %s --drive /dev/hdc -\n", argv[0]);
printf("To be read from *not mounted* media via: afio -tvZ /dev/hdc\n"); printf("To be read from *not mounted* media via: afio -tvZ /dev/hdc\n");
printf("Program tar would need a clean EOF which our media cannot deliver.\n");
if (insuffient_parameters) if (insuffient_parameters)
return 6; return 6;
} }
@ -588,8 +639,11 @@ int main(int argc, char **argv)
if (ret == 2) if (ret == 2)
{ ret = 0; goto release_drive; } { ret = 0; goto release_drive; }
if (do_blank) { if (do_blank) {
ret = libburner_blank_disc(drive_list[driveno].drive, if (do_blank > 100)
do_blank == 1); ret = libburner_format_row(drive_list[driveno].drive);
else
ret = libburner_blank_disc(drive_list[driveno].drive,
do_blank == 1);
if (ret<=0) if (ret<=0)
{ ret = 36; goto release_drive; } { ret = 36; goto release_drive; }
} }