[Libburn] New erase progress patch
Tiago Cogumbreiro
cogumbreiro@linus.uac.pt
Fri, 05 Dec 2003 01:42:59 -0100
--=-Vtq0xgSq9MkJuzQ9N1Vf
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
Here is the new erase progress patch.
--=-Vtq0xgSq9MkJuzQ9N1Vf
Content-Disposition: attachment; filename=erase_progress.diff
Content-Type: text/x-patch; name=erase_progress.diff; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
? libburn/.drive.c.swp
? libburn/.libburn.h.swp
? libburn/.spc.c.swp
? test/.blank.c.swp
Index: libburn/drive.c
===================================================================
RCS file: /cvs/burn/burn/libburn/drive.c,v
retrieving revision 1.229
diff -p -u -r1.229 drive.c
--- libburn/drive.c 4 Dec 2003 23:47:53 -0000 1.229
+++ libburn/drive.c 5 Dec 2003 02:39:07 -0000
@@ -145,6 +145,7 @@ void libburn_wait_all()
void libburn_erase_disc_sync(struct drive *d, int fast)
{
+ int p;
libburn_message_clear_queue();
libburn_print(1, "erasing drive %s %s\n", d->idata->vendor,
@@ -152,10 +153,32 @@ void libburn_erase_disc_sync(struct driv
if (d->status != LIBBURN_STATUS_FULL)
return;
-
d->cancel = 0;
d->busy = LIBBURN_BUSY_ERASING;
d->erase(d, fast);
+ /* reset the progress */
+ d->progress.session = 1;
+ d->progress.sessions = 1;
+ d->progress.track = 1;
+ d->progress.tracks = 1;
+ d->progress.index = 1;
+ d->progress.indices = 1;
+ d->progress.abs_sectors = 0x10000;
+ d->progress.rel_sectors = 0x10000;
+ d->progress.rel_sector = 0;
+ d->progress.abs_sector = 0;
+ /* read the initial 0 stage */
+ while(d->get_erase_progress(d) == 0)
+ usleep(1000);
+
+ while((p = d->get_erase_progress(d)) > 0) {
+ d->progress.abs_sector = p;
+ d->progress.rel_sector = p;
+ usleep(1000);
+ }
+
+ d->progress.abs_sector = 0x10000;
+ d->progress.rel_sector = 0x10000;
d->busy = LIBBURN_BUSY_NO;
}
@@ -168,7 +191,8 @@ enum libburn_drive_status libburn_drive_
int libburn_drive_get_progress(struct drive *d, struct libburn_progress *p)
{
if (p) {
- /* this is where we do stuff! */
+ memcpy(p, &(d->progress), sizeof(struct libburn_progress));
+ /* TODO: add mutex */
}
return d->busy != LIBBURN_BUSY_NO;
}
Index: libburn/mmc.c
===================================================================
RCS file: /cvs/burn/burn/libburn/mmc.c,v
retrieving revision 1.114
diff -p -u -r1.114 mmc.c
--- libburn/mmc.c 2 Dec 2003 02:23:29 -0000 1.114
+++ libburn/mmc.c 5 Dec 2003 02:39:08 -0000
@@ -307,8 +307,8 @@ void mmc_erase(struct drive *d, int fast
struct command c;
memcpy(c.opcode, MMC_ERASE, sizeof(MMC_ERASE));
-
- c.opcode[1] = !!fast;
+ c.opcode[1] = 16; /* IMMED set to 1 */
+ c.opcode[1] |= !!fast;
c.oplen = sizeof(MMC_ERASE);
c.page = NULL;
c.dir = NO_TRANSFER;
Index: libburn/sg.c
===================================================================
RCS file: /cvs/burn/burn/libburn/sg.c,v
retrieving revision 1.106
diff -p -u -r1.106 sg.c
--- libburn/sg.c 2 Dec 2003 00:02:12 -0000 1.106
+++ libburn/sg.c 5 Dec 2003 02:39:08 -0000
@@ -112,6 +112,7 @@ static void enumerate_common(char *fname
out.lock = spc_prevent;
out.unlock = spc_allow;
out.read_disc_info = spc_sense_write_params;
+ out.get_erase_progress = spc_get_erase_progress;
out.read_toc = mmc_read_toc;
out.write = mmc_write;
out.erase = mmc_erase;
Index: libburn/spc.c
===================================================================
RCS file: /cvs/burn/burn/libburn/spc.c,v
retrieving revision 1.75
diff -p -u -r1.75 spc.c
--- libburn/spc.c 4 Dec 2003 22:24:34 -0000 1.75
+++ libburn/spc.c 5 Dec 2003 02:39:09 -0000
@@ -42,6 +42,13 @@ void spc_request_sense(struct drive *d,
d->issue_command(d, &c);
}
+int spc_get_erase_progress(struct drive *d)
+{
+ struct buffer b;
+ spc_request_sense(d, &b);
+ return (b.data[16] << 8) | b.data[17];
+}
+
void spc_inquiry(struct drive *d)
{
struct buffer buf;
Index: libburn/spc.h
===================================================================
RCS file: /cvs/burn/burn/libburn/spc.h,v
retrieving revision 1.20
diff -p -u -r1.20 spc.h
--- libburn/spc.h 4 Dec 2003 22:24:34 -0000 1.20
+++ libburn/spc.h 5 Dec 2003 02:39:09 -0000
@@ -15,5 +15,6 @@ void spc_select_write_params(struct driv
void spc_try_write_modes(struct drive *);
void spc_request_sense(struct drive *d, struct buffer *buf);
int spc_block_type(enum libburn_block_types b);
+int spc_get_erase_progress(struct drive *d);
#endif /*__SPC*/
Index: libburn/transport.h
===================================================================
RCS file: /cvs/burn/burn/libburn/transport.h,v
retrieving revision 1.87
diff -p -u -r1.87 transport.h
--- libburn/transport.h 2 Dec 2003 03:04:17 -0000 1.87
+++ libburn/transport.h 5 Dec 2003 02:39:09 -0000
@@ -105,6 +105,7 @@ unsigned char mediacatalog[13];
int write_type;
int block_type;
struct buffer *buffer;
+ struct libburn_progress progress;
volatile int cancel;
volatile int busy;
@@ -135,6 +136,8 @@ unsigned char mediacatalog[13];
void (*send_write_parameters) (struct drive *,
const struct libburn_write_opts *);
void (*sync_cache) (struct drive *);
+ int (*get_erase_progress) (struct drive *);
+
struct params params;
struct scsi_inquiry_data *idata;
struct scsi_mode_data *mdata;
Index: test/blank.c
===================================================================
RCS file: /cvs/burn/burn/test/blank.c,v
retrieving revision 1.13
diff -p -u -r1.13 blank.c
--- test/blank.c 4 Dec 2003 23:47:53 -0000 1.13
+++ test/blank.c 5 Dec 2003 02:39:10 -0000
@@ -14,14 +14,16 @@ static unsigned int n_drives;
static void blank_disc(struct drive *drive)
{
enum libburn_drive_status s;
+ struct libburn_progress p;
if (libburn_drive_grab(drive, 1) != LIBBURN_GRAB_OK) {
fprintf(stderr, "Unable to open the drive!\n");
return;
}
- while (libburn_drive_get_progress(drive, NULL))
+ while (libburn_drive_get_progress(drive, NULL)) {
usleep(1000);
+ }
while ((s = libburn_drive_get_status(drive)) == LIBBURN_STATUS_UNREADY)
usleep(1000);
@@ -35,8 +37,10 @@ static void blank_disc(struct drive *dri
fprintf(stderr, "Blanking disc...");
libburn_erase_disc(drive, 1);
- while (libburn_drive_get_progress(drive, NULL))
+ while (libburn_drive_get_progress(drive, &p)) {
+ printf("%d\n", p.abs_sector);
usleep(1000);
+ }
fprintf(stderr, "Done\n");
libburn_drive_release(drive, 0);
Index: test/burniso.c
===================================================================
RCS file: /cvs/burn/burn/test/burniso.c,v
retrieving revision 1.37
diff -p -u -r1.37 burniso.c
--- test/burniso.c 4 Dec 2003 23:47:53 -0000 1.37
+++ test/burniso.c 5 Dec 2003 02:39:10 -0000
@@ -57,7 +57,7 @@ void burn_iso(struct drive *drive, const
o->perform_opc = 1;
o->write_type = LIBBURN_WRITE_RAW;
o->block_type = LIBBURN_BLOCK_RAW16;
- o->simulate = 1;
+ o->simulate = 0;
o->underrun_proof = 0;
libburn_structure_print_disc(disc);
--=-Vtq0xgSq9MkJuzQ9N1Vf--