patches/nautilus-cd-burner-04-cdda2wav.diff
changeset 13426 7bb2b4660b64
child 13436 ca5e68491e88
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/patches/nautilus-cd-burner-04-cdda2wav.diff	Fri Sep 05 09:59:59 2008 +0000
@@ -0,0 +1,379 @@
+--- 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-05 17:15:38.939817000 +0800
++++ nautilus-cd-burner-2.23.90/src/make-iso.c	2008-09-05 17:15:38.855522000 +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 {
+@@ -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,8 @@
+         g_ptr_array_free (argv, TRUE);
+         g_free (dev_arg);
+         g_free (filename_arg);
+-        g_free (toc_filename_arg);
++	g_free (dirname);
++	g_free (toc_filename_arg);
+ 
+  cleanup:
+