[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--