brasero r2008 - in trunk: . libbrasero-media



Author: philippr
Date: Thu Feb 26 19:27:23 2009
New Revision: 2008
URL: http://svn.gnome.org/viewvc/brasero?rev=2008&view=rev

Log:
2009-02-26  Philippe Rouquier  <bonfire-app wanadoo fr>

	Attempt at fixing #573158 â Brasero reports 0 byte free for blank dvd discs
	Add a fallback function for DVD-R and generally all blank media

	* libbrasero-media/brasero-medium.c
	(brasero_medium_track_set_leadout_DVDR_blank),
	(brasero_medium_set_write_mode_page),
	(brasero_medium_track_set_leadout):

Modified:
   trunk/ChangeLog
   trunk/libbrasero-media/brasero-medium.c

Modified: trunk/libbrasero-media/brasero-medium.c
==============================================================================
--- trunk/libbrasero-media/brasero-medium.c	(original)
+++ trunk/libbrasero-media/brasero-medium.c	Thu Feb 26 19:27:23 2009
@@ -1677,6 +1677,59 @@
 }
 
 static BraseroBurnResult
+brasero_medium_track_set_leadout_DVDR_blank (BraseroMedium *self,
+					     BraseroDeviceHandle *handle,
+					     BraseroMediumTrack *leadout,
+					     BraseroScsiErrCode *code)
+{
+	BraseroScsiFormatCapacitiesHdr *hdr = NULL;
+	BraseroScsiMaxCapacityDesc *current;
+	BraseroMediumPrivate *priv;
+	BraseroScsiResult result;
+	int size;
+
+	priv = BRASERO_MEDIUM_PRIVATE (self);
+
+	BRASERO_MEDIA_LOG ("Using fallback method for blank CDR to retrieve NWA and leadout information");
+
+	/* NWA is easy for blank DVD-Rs, it's 0. So far, so good... */
+	priv->next_wr_add = 0;
+
+	result = brasero_mmc2_read_format_capacities (handle,
+						      &hdr,
+						      &size,
+						      code);
+	if (result != BRASERO_SCSI_OK) {
+		g_free (hdr);
+
+		BRASERO_MEDIA_LOG ("READ FORMAT CAPACITIES failed");
+		return BRASERO_BURN_ERR;
+	}
+
+	/* See if the media is already formatted which means for -R media that 
+	 * they are blank. */
+	current = hdr->max_caps;
+	if (current->type & BRASERO_SCSI_DESC_FORMATTED) {
+		BRASERO_MEDIA_LOG ("Unformatted medium");
+		g_free (hdr);
+		return BRASERO_BURN_ERR;
+	}
+		
+	BRASERO_MEDIA_LOG ("Unformatted medium");
+
+	/* of course it starts at 0 since it's empty */
+	leadout->start = 0;
+	leadout->blocks_num = BRASERO_GET_32 (current->blocks_num);
+
+	BRASERO_MEDIA_LOG ("Leadout (through READ FORMAT CAPACITIES): start = %llu size = %llu",
+			  leadout->start,
+			  leadout->blocks_num);
+
+	g_free (hdr);
+	return BRASERO_BURN_OK;
+}
+
+static BraseroBurnResult
 brasero_medium_track_set_leadout_CDR_blank (BraseroMedium *self,
 					    BraseroDeviceHandle *handle,
 					    BraseroMediumTrack *leadout,
@@ -1717,29 +1770,21 @@
 }
 
 static BraseroBurnResult
-brasero_medium_track_set_leadout (BraseroMedium *self,
-				  BraseroDeviceHandle *handle,
-				  BraseroMediumTrack *leadout,
-				  BraseroScsiErrCode *code)
+brasero_medium_set_write_mode_page (BraseroMedium *self,
+				    BraseroDeviceHandle *handle,
+				    BraseroScsiErrCode *code)
 {
 	BraseroScsiModeData *data = NULL;
-	BraseroScsiTrackInfo track_info;
 	BraseroScsiWritePage *wrt_page;
 	BraseroMediumPrivate *priv;
 	BraseroScsiResult result;
-	gint track_num;
 	int size;
 
-	BRASERO_MEDIA_LOG ("Retrieving NWA and leadout information");
+	BRASERO_MEDIA_LOG ("Setting write mode page");
 
 	priv = BRASERO_MEDIUM_PRIVATE (self);
 
-	if (BRASERO_MEDIUM_RANDOM_WRITABLE (priv->info)) {
-		BRASERO_MEDIA_LOG ("Overwritable medium  => skipping");
-		return BRASERO_BURN_OK;
-	}
-
-	/* NOTE this works for CDR, DVDR+-, BDR-SRM */
+	/* NOTE: this works for CDR, DVDR+-, BDR-SRM */
 	/* make sure the current write mode is TAO. Otherwise the drive will
 	 * return the first sector of the pregap instead of the first user
 	 * accessible sector. */
@@ -1784,32 +1829,56 @@
 		if (result != BRASERO_SCSI_OK) {
 			BRASERO_MEDIA_LOG ("MODE SELECT failed");
 
-			/* This only for CD-R */
-			if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_CDR|BRASERO_MEDIUM_BLANK))
-				return brasero_medium_track_set_leadout_CDR_blank (self,
-										   handle,
-										   leadout,
-										   code);
-
 			/* This isn't necessarily a problem! we better try */
-			//	return BRASERO_BURN_ERR;
+			return BRASERO_BURN_ERR;
 		}
 	}
 	else {
 		BRASERO_MEDIA_LOG ("MODE SENSE failed");
+		/* This isn't necessarily a problem! we better try the rest */
+		return BRASERO_BURN_ERR;
+	}
 
-		/* This only for CD-R */
-		if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_CDR|BRASERO_MEDIUM_BLANK))
+	return BRASERO_BURN_OK;
+}
+
+static BraseroBurnResult
+brasero_medium_track_set_leadout (BraseroMedium *self,
+				  BraseroDeviceHandle *handle,
+				  BraseroMediumTrack *leadout,
+				  BraseroScsiErrCode *code)
+{
+	BraseroScsiTrackInfo track_info;
+	BraseroMediumPrivate *priv;
+	BraseroScsiResult result;
+	gint track_num;
+	int size;
+
+	BRASERO_MEDIA_LOG ("Retrieving NWA and leadout information");
+
+	priv = BRASERO_MEDIUM_PRIVATE (self);
+
+	if (BRASERO_MEDIUM_RANDOM_WRITABLE (priv->info)) {
+		BRASERO_MEDIA_LOG ("Overwritable medium  => skipping");
+		return BRASERO_BURN_OK;
+	}
+
+	if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_CDR)) {
+		/* This is necessary to make sure nwa won't be the start of the
+		 * pregap if the current write mode is SAO with blank CDR.
+		 * Carry on even if it fails.
+		 * This can work with CD-R/W and DVD-R/W. + media don't use the
+		 * write mode page anyway. */
+		result = brasero_medium_set_write_mode_page (self, handle, code);
+		if (result == BRASERO_BURN_ERR
+		&&  BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_CDR|BRASERO_MEDIUM_BLANK))
 			return brasero_medium_track_set_leadout_CDR_blank (self,
 									   handle,
 									   leadout,
 									   code);
-
-		/* This isn't necessarily a problem! we better try the rest */
-		//	return BRASERO_BURN_ERR;
 	}
 
-	/* at this point we know the type of the disc that's why we set the 
+	/* At this point we know the type of the disc that's why we set the 
 	 * size according to this type. That may help to avoid outrange address
 	 * errors. */
 	if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_DUAL_L|BRASERO_MEDIUM_WRITABLE))
@@ -1837,14 +1906,20 @@
 					       &size,
 					       code);
 	if (result != BRASERO_SCSI_OK) {
+		BRASERO_MEDIA_LOG ("READ TRACK INFO failed");
+
 		/* This only for CD-R */
 		if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_CDR|BRASERO_MEDIUM_BLANK))
 			return brasero_medium_track_set_leadout_CDR_blank (self,
 									   handle,
 									   leadout,
 									   code);
-
-		BRASERO_MEDIA_LOG ("READ TRACK INFO failed");
+		else if (BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_BLANK))
+			return brasero_medium_track_set_leadout_DVDR_blank (self,
+									    handle,
+									    leadout,
+									    code);
+			 
 		return BRASERO_BURN_ERR;
 	}
 
@@ -1863,6 +1938,13 @@
 		BRASERO_MEDIA_LOG ("Using track size %d", leadout->blocks_num);
 	}
 
+	if (!leadout->blocks_num
+	&&   BRASERO_MEDIUM_IS (priv->info, BRASERO_MEDIUM_BLANK))
+		return brasero_medium_track_set_leadout_DVDR_blank (self,
+								    handle,
+								    leadout,
+								    code);
+
 	BRASERO_MEDIA_LOG ("Leadout: start = %llu size = %llu",
 			  leadout->start,
 			  leadout->blocks_num);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]