patches/nautilus-cd-burner-04-cdda2wav.diff
author jyu_mit
Mon, 08 Sep 2008 11:00:12 +0000
changeset 13436 ca5e68491e88
parent 13426 7bb2b4660b64
child 13494 dd3231d12651
permissions -rw-r--r--
* patches/nautilus-cd-burner-04-cdda2wav.diff: Fix the problem about freeing a null pointer.

--- nautilus-cd-burner-2.23.90/src/nautilus-burn-recorder.c.orig	2008-09-05 17:17:24.839270000 +0800
+++ nautilus-cd-burner-2.23.90/src/nautilus-burn-recorder.c	2008-09-05 17:22:46.979166000 +0800
@@ -1213,86 +1213,6 @@
         return result;
 }
 
-static gboolean
-cdrdao_stderr_line (NautilusBurnProcess   *process,
-                    const char            *line,
-                    gpointer               data)
-{
-        NautilusBurnRecorder *recorder = data;
-        unsigned int          written, total;
-
-        if (line && process->debug) {
-                g_print ("cdrdao stderr: %s", line);
-        }
-
-        if (sscanf (line, "Wrote %u of %u", &written, &total) == 2) {
-                long    secs = -1;
-                gdouble fraction;
-
-                process->dangerous = TRUE;
-
-                fraction = (gdouble) written / total;
-
-                if (process->start_time == 0
-                    && written > 2) {
-                        /* let the speed regulate before keeping track */
-                        process->start_time = time (NULL);
-                        process->start_num = (gint64)written;
-                }
-
-                if (process->start_time > 0) {
-                        guint64 elapsed;
-                        gdouble rate;
-
-                        elapsed = time (NULL) - process->start_time;
-                        rate = (gdouble)(written - process->start_num) / (gdouble)elapsed;
-
-                        if (rate > 0) {
-                                secs = (total - written) / rate;
-                        }
-                }
-
-                g_signal_emit (recorder,
-                               nautilus_burn_recorder_table_signals [ACTION_CHANGED], 0,
-                               NAUTILUS_BURN_RECORDER_ACTION_WRITING,
-                               NAUTILUS_BURN_RECORDER_MEDIA_CD);
-                g_signal_emit (recorder,
-                               nautilus_burn_recorder_table_signals [PROGRESS_CHANGED], 0,
-                               fraction, secs);
-        }
-
-        if (strstr (line, "Writing track 01")) {
-                process->dangerous = TRUE;
-                process->start_time = 0;
-
-                g_signal_emit (recorder,
-                               nautilus_burn_recorder_table_signals [ACTION_CHANGED], 0,
-                               NAUTILUS_BURN_RECORDER_ACTION_WRITING,
-                               NAUTILUS_BURN_RECORDER_MEDIA_CD);
-                g_signal_emit (recorder,
-                               nautilus_burn_recorder_table_signals [PROGRESS_CHANGED], 0,
-                               0.0, (long)-1);
-
-        }
-
-        if (strstr (line, "Operation not permitted")) {
-                nautilus_burn_process_set_error (process,
-                                                 line,
-                                                 NAUTILUS_BURN_RECORDER_RESULT_ERROR);
-        }
-
-        if (strstr (line, "Writing finished successfully")) {
-                process->dangerous = FALSE;
-                process->result = NAUTILUS_BURN_RECORDER_RESULT_FINISHED;
-                g_signal_emit (recorder,
-                               nautilus_burn_recorder_table_signals [PROGRESS_CHANGED], 0,
-                               1.0, (long)-1);
-
-        }
-
-        return TRUE;
-}
-
 static int
 nautilus_burn_recorder_write_cdrecord (NautilusBurnRecorder          *recorder,
                                        NautilusBurnDrive             *drive,
@@ -1346,34 +1266,45 @@
         /* Turn the kB/s to a CD speed (for example 10 for "10x").
          * cdrecord supports only integer numbers for the speed. */
          speed = (int) NAUTILUS_BURN_DRIVE_CD_SPEED (speed);
+	
+	gchar *dir_name;
+	int i = 0;
+	GList *list = NULL;
 
         if (track->type ==  NAUTILUS_BURN_RECORDER_TRACK_TYPE_CUE) {
+		GDir *dir;
+                dev_str = g_strdup_printf ("dev=%s", nautilus_burn_drive_get_device (drive));
+
                 argv = g_ptr_array_new ();
-                g_ptr_array_add (argv, "cdrdao");
-                g_ptr_array_add (argv, "write");
-                g_ptr_array_add (argv, "--device");
-                g_ptr_array_add (argv, (char *)nautilus_burn_drive_get_device (drive));
-                g_ptr_array_add (argv, "--speed");
-                speed_str = g_strdup_printf ("%d", speed);
-                g_ptr_array_add (argv, speed_str);
+                g_ptr_array_add (argv, "cdrecord");
+                g_ptr_array_add (argv, dev_str);
+                g_ptr_array_add (argv, "-v");
+                g_ptr_array_add (argv, "-dao");
+                g_ptr_array_add (argv, "-useinfo");
+                g_ptr_array_add (argv, "-text");
 
-                if (flags & NAUTILUS_BURN_RECORDER_WRITE_DUMMY_WRITE) {
-                        g_ptr_array_add (argv, "--simulate");
-                }
                 if (flags & NAUTILUS_BURN_RECORDER_WRITE_EJECT) {
-                        g_ptr_array_add (argv, "--eject");
-                }
-                if (flags & NAUTILUS_BURN_RECORDER_WRITE_OVERBURN) {
-                        g_ptr_array_add (argv, "--overburn");
+                        g_ptr_array_add (argv, "-eject");
                 }
-                g_ptr_array_add (argv, "-v");
-                g_ptr_array_add (argv, "2");
 
-                g_ptr_array_add (argv, track->contents.cue.filename);
+		dir_name = g_path_get_dirname (track->contents.cue.filename);
+		dir = g_dir_open (dir_name, 0, NULL);
+		if (dir) {
+			const char *name;
+			
+			while ((name = g_dir_read_name (dir))) {
+				if (g_str_has_suffix (name, ".wav")) {
+					list = g_list_append(list, g_build_filename (dir_name, name, NULL));
+					g_ptr_array_add (argv, (char *)(g_list_nth_data(list, i++)));
+
+				}
+			}
+			g_dir_close (dir);
+		}
                 g_ptr_array_add (argv, NULL);
 
-                out_line_func = NULL;
-                err_line_func = cdrdao_stderr_line;
+                out_line_func = cdrecord_stdout_line;
+                err_line_func = cdrecord_stderr_line;
         } else {
                 argv = g_ptr_array_new ();
                 g_ptr_array_add (argv, "cdrecord");
@@ -1454,6 +1385,13 @@
         g_free (cue_str);
         g_free (speed_str);
         g_free (dev_str);
+	g_free (dir_name);
+	while (list) {
+		g_free (list->data);
+		list = list->next;
+	}
+	g_list_free (list);
+		
         g_ptr_array_free (argv, TRUE);
         argv = NULL;
 
--- nautilus-cd-burner-2.23.90/src/make-iso.c.orig	2008-09-08 17:13:59.189430000 +0800
+++ nautilus-cd-burner-2.23.90/src/make-iso.c	2008-09-08 16:36:59.016416000 +0800
@@ -774,61 +774,64 @@
 }
 
 static gboolean
-cdrdao_stderr_line (NautilusBurnProcess   *process,
-                    const char            *line,
-                    gpointer               data)
-{
-        NautilusBurnIso *iso = data;
-        int t1, t2, s1, s2, s3;
-        int min, sec, sub;
-
-        if (line && iso->priv->debug) {
-                g_print ("cdrdao stderr: %s", line);
-        }
-
-        if (sscanf (line, "Copying audio tracks %d-%d: start %d:%d:%d, length %d:%d:%d",
-                    &t1, &t2, &s1, &s2, &s3, &min, &sec, &sub) == 8) {
-                iso->priv->iso_size = (guint64) min * 60 + sec;
-        }
-
-        if (sscanf (line, "%d:%d:%d", &min, &sec, &sub) == 3) {
-                if (iso->priv->iso_size > 0) {
-                        gdouble fraction;
-                        guint64 secs = (guint64) min * 60 + sec;
-                        guint64 remaining;
-
-                        remaining = -1;
-                        if (process->start_time > 0) {
-                                guint64 elapsed;
-                                gdouble rate;
-
-                                elapsed = time (NULL) - process->start_time;
-                                rate = (gdouble)secs / (gdouble)elapsed;
-
-                                if (rate > 0) {
-                                        gdouble ave_rate;
-
-                                        ave_rate = get_average_rate (&process->rates, rate);
-                                        remaining = (iso->priv->iso_size - secs) / ave_rate;
-                                }
-                        }
-
-                        fraction = (gdouble) secs / iso->priv->iso_size;
-
-                        g_signal_emit (G_OBJECT (iso),
-                                       nautilus_burn_iso_table_signals [PROGRESS_CHANGED], 0,
-                                       fraction, (long)remaining);
-                }
-        }
-
-        if (strstr (line, "Operation not permitted")) {
-                process->result = NAUTILUS_BURN_ISO_RESULT_ERROR;
-                process_error (iso, line);
-        }
+cdda2wav_stderr_line (NautilusBurnProcess *process,
+			const char *line,
+			gpointer    data)
+{
+	NautilusBurnIso *iso = data;
+	int track, percent,start_n;
+	guint64 sector, sectors;
+
+	if (line && iso->priv->debug) {
+		g_print ("cdda2wav stderr: %s", line);
+	}
+
+
+	if (sscanf (line, "%d.(%d),", &track, &sector) == 2 && !(g_strrstr (line, ":"))) {
+		gchar** line_array = g_strsplit (line, ",", 5);
+	 	int i = 0;	
+		while (line_array[i]) {
+			if (sscanf (line_array[i], "%d.(%d)", &track, &sector) == 2) {
+				process->rates = g_list_append (process->rates, GINT_TO_POINTER (sector));
+			}
+			i++;
+		}
+		g_strfreev(line_array);
+	}
+	
+	if (sscanf (line, " lead-out(%d)", &sectors) == 1) {
+		iso->priv->iso_size = sectors;
+		process->rates = g_list_append (process->rates, GINT_TO_POINTER (sectors));
+	}
+
+ 	if (sscanf (line, "100%%  track  %d \'", &start_n) == 1) {
+		process->start_num = (gint64)start_n;
+	}
+
+	if (sscanf (line, "%d%%\\", &percent) == 1) {
+		gdouble fraction = 0.0;
+
+		gint readed, reading, num;
+		if (percent == 100) 
+			num = process->start_num - 1;
+		else
+			num = process->start_num;
+
+		readed = GPOINTER_TO_INT (g_list_nth_data (process->rates, num));
+		reading = GPOINTER_TO_INT (g_list_nth_data (process->rates, num + 1)) - readed;
+		fraction = ((gdouble)percent/100 *reading + readed) / (int)iso->priv->iso_size;
+
+		g_signal_emit (G_OBJECT (iso), nautilus_burn_iso_table_signals [PROGRESS_CHANGED], 0, fraction, (long)(-1));
+	}
+	
+	if (strstr (line, "cdda2wav.bin: I/O error.")) {
+		process->result = NAUTILUS_BURN_ISO_RESULT_ERROR;
+		process_error (iso, line);
+	}
 
-        if (strstr (line, "toc and track data finished successfully")) {
+	if (process->start_num == g_list_length (process->rates) - 1){
                 process->result = NAUTILUS_BURN_ISO_RESULT_FINISHED;
-        }
+	}
 
         return TRUE;
 }
@@ -1366,13 +1369,12 @@
                                                               &has_data,
                                                               &_has_audio);
         if (_has_audio) {
-                device_arg = g_strdup_printf ("%s", nautilus_burn_drive_get_device (drive));
+                device_arg = g_strdup_printf ("-dev=%s", nautilus_burn_drive_get_device (drive));
 
                 argv = g_ptr_array_new ();
-                g_ptr_array_add (argv, "cdrdao");
-                g_ptr_array_add (argv, "disk-info");
-                g_ptr_array_add (argv, "--device");
+                g_ptr_array_add (argv, "cdrecord");
                 g_ptr_array_add (argv, device_arg);
+                g_ptr_array_add (argv, "-minfo");
                 g_ptr_array_add (argv, NULL);
 
         } else {
@@ -1474,7 +1476,7 @@
         int                   res;
         gboolean              has_audio;
         char                 *filename_arg;
-        char                 *toc_filename_arg;
+        char                 *toc_filename_arg = NULL;
         char                 *dev_arg;
 
         if (toc_filename) {
@@ -1514,8 +1516,6 @@
                 size = 0;
         }
 
-        g_free (dirname);
-
         if (iso_size > (guint64)size) {
                 char *message;
 
@@ -1534,26 +1534,40 @@
 
         filename_arg = NULL;
         dev_arg = NULL;
-        toc_filename_arg = g_strdup_printf ("%s.toc", filename);
-        if (toc_filename) {
-                *toc_filename = g_strdup (toc_filename_arg);
-        }
+
         if (has_audio) {
+                dev_arg = g_strdup_printf ("dev=%s", nautilus_burn_drive_get_device (drive));
+
+		char *template = g_strdup_printf ("audio-%s-XXXXXX", g_get_user_name ());
+		char *template_dir = g_build_filename (dirname, template, NULL);
+		g_free (template);
+		char *temp_dir = mkdtemp (template_dir);
+		toc_filename_arg = g_strdup_printf("%s/audio.wav", temp_dir); 
+		g_free (temp_dir);
+
+		if (toc_filename) {
+			*toc_filename = g_strdup (toc_filename_arg);
+		}
+
+		if (iso->priv->filename) {
+			g_free (iso->priv->filename);
+			iso->priv->filename = g_strdup (toc_filename_arg);
+		}
+
                 argv = g_ptr_array_new ();
-                g_ptr_array_add (argv, "cdrdao");
-                g_ptr_array_add (argv, "read-cd");
-                g_ptr_array_add (argv, "--read-raw");
-                g_ptr_array_add (argv, "--datafile");
-                g_ptr_array_add (argv, (char *)filename);
-                g_ptr_array_add (argv, "--device");
-                g_ptr_array_add (argv, (char *)nautilus_burn_drive_get_device (drive));
-                g_ptr_array_add (argv, "-v");
-                g_ptr_array_add (argv, "2");
+                g_ptr_array_add (argv, "cdda2wav");
+                g_ptr_array_add (argv, (char *)dev_arg);
+                g_ptr_array_add (argv, "-vall");
+                g_ptr_array_add (argv, "cddb=0");
+                g_ptr_array_add (argv, "-paranoia");
+                g_ptr_array_add (argv, "paraopts=minoverlap=10");
+                g_ptr_array_add (argv, "-B");
+                g_ptr_array_add (argv, "-Owav");
                 g_ptr_array_add (argv, (char *)toc_filename_arg);
                 g_ptr_array_add (argv, NULL);
 
                 out_watch_func = NULL;
-                err_watch_func = cdrdao_stderr_line;
+                err_watch_func = cdda2wav_stderr_line;
         } else {
 
                 filename_arg = g_strdup_printf ("f=%s", filename);
@@ -1578,7 +1592,9 @@
         g_ptr_array_free (argv, TRUE);
         g_free (dev_arg);
         g_free (filename_arg);
-        g_free (toc_filename_arg);
+	g_free (dirname);
+	if (toc_filename_arg)
+		g_free (toc_filename_arg);
 
  cleanup: