--- /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, §or) == 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, §or) == 2) {
++ process->rates = g_list_append (process->rates, GINT_TO_POINTER (sector));
++ }
++ i++;
++ }
++ g_strfreev(line_array);
++ }
++
++ if (sscanf (line, " lead-out(%d)", §ors) == 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:
+