[Goodies-commits] r5577 - xfburn/trunk/xfburn

David Mohr squisher at xfce.org
Sun Oct 12 05:37:41 CEST 2008


Author: squisher
Date: 2008-10-12 03:37:40 +0000 (Sun, 12 Oct 2008)
New Revision: 5577

Modified:
   xfburn/trunk/xfburn/xfburn-audio-composition.c
   xfburn/trunk/xfburn/xfburn-burn-audio-cd-composition-dialog.c
   xfburn/trunk/xfburn/xfburn-global.h
   xfburn/trunk/xfburn/xfburn-preferences-dialog.c
   xfburn/trunk/xfburn/xfburn-transcoder-basic.c
   xfburn/trunk/xfburn/xfburn-transcoder.c
   xfburn/trunk/xfburn/xfburn-transcoder.h
Log:
Moving code to get burn_tracks from wave files into TranscoderBasic, increasing maximum fifo size

Modified: xfburn/trunk/xfburn/xfburn-audio-composition.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-audio-composition.c	2008-10-12 00:53:33 UTC (rev 5576)
+++ xfburn/trunk/xfburn/xfburn-audio-composition.c	2008-10-12 03:37:40 UTC (rev 5577)
@@ -1159,7 +1159,6 @@
     else if (S_ISREG (s.st_mode)) {
       GError *error = NULL;
 
-      DBG ("foo1");
       if (!xfburn_transcoder_is_audio_file (priv->trans, path, &error)) {
         XfburnNotAddingReason reason;
 
@@ -1175,7 +1174,6 @@
         gdk_threads_leave ();
         return FALSE;
       }
-      DBG ("bar1");
 
       gdk_threads_enter ();
       if (insertion != NULL) {

Modified: xfburn/trunk/xfburn/xfburn-burn-audio-cd-composition-dialog.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-burn-audio-cd-composition-dialog.c	2008-10-12 00:53:33 UTC (rev 5576)
+++ xfburn/trunk/xfburn/xfburn-burn-audio-cd-composition-dialog.c	2008-10-12 03:37:40 UTC (rev 5577)
@@ -42,6 +42,7 @@
 #include "xfburn-progress-dialog.h"
 #include "xfburn-perform-burn.h"
 #include "xfburn-audio-composition.h"
+#include "xfburn-transcoder.h"
 
 #define XFBURN_BURN_AUDIO_CD_COMPOSITION_DIALOG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), XFBURN_TYPE_BURN_AUDIO_CD_COMPOSITION_DIALOG, XfburnBurnAudioCdCompositionDialogPrivate))
 
@@ -83,7 +84,6 @@
 static void cb_disc_refreshed (GtkWidget *device_box, XfburnDevice *device, XfburnBurnAudioCdCompositionDialog * dialog);
 static void cb_dialog_response (XfburnBurnAudioCdCompositionDialog * dialog, gint response_id,
                                 XfburnBurnAudioCdCompositionDialogPrivate * priv);
-static gboolean needs_swap (char header[44]);
 
 /* globals */
 static XfceTitledDialogClass *parent_class = NULL;
@@ -496,15 +496,6 @@
   burn_write_opts_free (burn_options);
 }
 
-static gboolean
-needs_swap (char header[44])
-{
-  if (header[0] == 'R' && header[1] == 'I' && header[2] == 'F' && header[3] == 'X')
-    return TRUE;
-  else 
-    return FALSE;
-}
-
 static void
 thread_burn_composition (ThreadBurnCompositionParams * params)
 {
@@ -513,12 +504,11 @@
   struct burn_disc *disc;
   struct burn_session *session;
   struct burn_track **tracks;
-  struct burn_source **srcs;
-  int *fds;
   int n_tracks;
   int i,j;
   GSList *track_list;
   gboolean abort = FALSE;
+  XfburnTranscoder *trans;
 
   struct burn_drive_info *drive_info = NULL;
 
@@ -534,56 +524,21 @@
 
   n_tracks = g_slist_length (params->tracks);
   tracks = g_new (struct burn_track *, n_tracks);
-  srcs = g_new (struct burn_source *, n_tracks);
-  fds = g_new (int, n_tracks);
+  trans = xfburn_transcoder_get_global ();
 
   track_list = params->tracks;
   for (i=0; i<n_tracks; i++) {
-    char header[44];
     XfburnAudioTrack *atrack = track_list->data;
+    GError *error = NULL;
 
-    fds[i] = open (atrack->inputfile, 0);
-    if (fds[i] == -1) {
-      gchar *str;
-      str = g_strdup_printf (_("Could not open %s!"), atrack->inputfile);
-      xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), str);
-      g_free (str);
+    tracks[i] = xfburn_transcoder_create_burn_track (trans, atrack, &error);
+    if (tracks[i] && error) {
+      xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), error->message);
+      g_error_free (error);
       abort = TRUE;
       break;
     }
 
-    /* perform a read so that libburn skips the wav header */
-    read (fds[i], header, 44);
-
-    srcs[i] = burn_fd_source_new (fds[i], -1 , 0);
-    if (srcs[i] == NULL) {
-      gchar *str;
-      str = g_strdup_printf (_("Could not create burn_source from %s!"), atrack->inputfile);
-      xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), str);
-      g_free (str);
-      close(fds[i]);
-      abort = TRUE;
-      break;
-    }
-
-    tracks[i] = burn_track_create ();
-    
-    if (burn_track_set_source (tracks[i], srcs[i]) != BURN_SOURCE_OK) {
-      gchar *str;
-      str = g_strdup_printf (_("Could not add source to track!"));
-      xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), str);
-      g_free (str);
-      close(fds[i]);
-      burn_source_free (srcs[i]);
-      abort = TRUE;
-      break;
-    }
-
-    if (needs_swap (header))
-      burn_track_set_byte_swap (tracks[i], TRUE);
-
-    burn_track_define_data (tracks[i], 0, 0, 1, BURN_AUDIO);
-
     track_list = g_slist_next (track_list);
   }
 
@@ -604,12 +559,12 @@
 
   for (j=0; j<i; j++) {
     burn_track_free (tracks[j]);
-    burn_source_free (srcs[j]);
-    close (fds[j]);
   }
-  g_free (srcs);
   g_free (tracks);
-  g_free (fds);
+
+  xfburn_transcoder_clear (trans, NULL);
+  g_object_unref (trans);
+
   burn_session_free (session);
   burn_disc_free (disc);
   burn_finish ();

Modified: xfburn/trunk/xfburn/xfburn-global.h
===================================================================
--- xfburn/trunk/xfburn/xfburn-global.h	2008-10-12 00:53:33 UTC (rev 5576)
+++ xfburn/trunk/xfburn/xfburn-global.h	2008-10-12 03:37:40 UTC (rev 5577)
@@ -42,7 +42,8 @@
 
 #define DATA_COMPOSITION_DEFAULT_NAME "Data composition"
 
-#define XFBURN_FIFO_DEFAULT_SIZE 4096 /* in kb/s */
+#define XFBURN_FIFO_DEFAULT_SIZE  4096    /* in kb, as int */
+#define XFBURN_FIFO_MAX_SIZE     16384.0  /* in kb, as float */
 
 #define PCM_BYTES_PER_SECS 176400
 

Modified: xfburn/trunk/xfburn/xfburn-preferences-dialog.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-preferences-dialog.c	2008-10-12 00:53:33 UTC (rev 5576)
+++ xfburn/trunk/xfburn/xfburn-preferences-dialog.c	2008-10-12 03:37:40 UTC (rev 5577)
@@ -326,7 +326,7 @@
   gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, BORDER);
   gtk_widget_show (frame);
 
-  priv->scale_fifo = gtk_hscale_new_with_range (0.0, 8192.0, 32.0);
+  priv->scale_fifo = gtk_hscale_new_with_range (0.0, XFBURN_FIFO_MAX_SIZE, 32.0);
   gtk_scale_set_value_pos (GTK_SCALE (priv->scale_fifo), GTK_POS_LEFT);
   gtk_range_set_value (GTK_RANGE (priv->scale_fifo), 0);
   gtk_box_pack_start (GTK_BOX (vbox3), priv->scale_fifo, FALSE, FALSE, BORDER/2);

Modified: xfburn/trunk/xfburn/xfburn-transcoder-basic.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-transcoder-basic.c	2008-10-12 00:53:33 UTC (rev 5576)
+++ xfburn/trunk/xfburn/xfburn-transcoder-basic.c	2008-10-12 03:37:40 UTC (rev 5577)
@@ -31,9 +31,13 @@
 #include <unistd.h>
 #include <fcntl.h>
 
+#include <errno.h>
+
 #include <libxfce4util/libxfce4util.h>
 #include <libxfcegui4/libxfcegui4.h>
 
+#include <libburn.h>
+
 #include "xfburn-global.h"
 #include "xfburn-error.h"
 
@@ -52,7 +56,11 @@
 static gboolean is_valid_wav (const gchar *path);
 static gboolean valid_wav_headers (guchar header[44]);
 
+static struct burn_track * create_burn_track (XfburnTranscoder *trans, XfburnAudioTrack *atrack, GError **error);
+static gboolean needs_swap (char header[44]);
 
+static gboolean clear (XfburnTranscoder *trans, GError **error);
+
 #define XFBURN_TRANSCODER_BASIC_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), XFBURN_TYPE_TRANSCODER_BASIC, XfburnTranscoderBasicPrivate))
 
 enum {
@@ -60,7 +68,8 @@
 }; 
 
 typedef struct {
-  gboolean dummy;
+  GSList *fds;
+  GSList *srcs;
 } XfburnTranscoderBasicPrivate;
 
 /*********************/
@@ -138,6 +147,8 @@
 transcoder_interface_init (XfburnTranscoderInterface *iface, gpointer iface_data)
 {
   iface->is_audio_file = is_audio_file;
+  iface->create_burn_track = create_burn_track;
+  iface->clear = clear;
 }
 /*           */
 /* internals */
@@ -245,6 +256,82 @@
   return TRUE;
 }
 
+static struct burn_track *
+create_burn_track (XfburnTranscoder *trans, XfburnAudioTrack *atrack, GError **error)
+{
+  XfburnTranscoderBasic *basic = XFBURN_TRANSCODER_BASIC (trans);
+  XfburnTranscoderBasicPrivate *priv= XFBURN_TRANSCODER_BASIC_GET_PRIVATE (basic);
+  
+  char header[44];
+  int fd;
+  struct burn_track *track;
+  struct burn_source *src;
+
+  fd = open (atrack->inputfile, 0);
+  if (fd == -1) {
+    g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_COULD_NOT_OPEN_FILE,
+                 _("Could not open %s: %s"), atrack->inputfile, g_strerror (errno));
+    return NULL;
+  }
+
+  /* perform a read so that libburn skips the wav header */
+  read (fd, header, 44);
+
+  src = burn_fd_source_new (fd, -1 , 0);
+  if (src == NULL) {
+    g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_BURN_SOURCE,
+                 _("Could not create burn_source from %s!"), atrack->inputfile);
+    return NULL;
+  }
+
+  track = burn_track_create ();
+  
+  if (burn_track_set_source (track, src) != BURN_SOURCE_OK) {
+    g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_BURN_SOURCE,
+                 _("Could not add source to track %s!"), atrack->inputfile);
+    return NULL;
+  }
+
+  if (needs_swap (header))
+    burn_track_set_byte_swap (track, TRUE);
+
+  burn_track_define_data (track, 0, 0, 1, BURN_AUDIO);
+
+  priv->fds = g_slist_prepend (priv->fds, GINT_TO_POINTER (fd));
+  priv->srcs = g_slist_prepend (priv->srcs, src);
+
+  return track;
+}
+
+static gboolean
+needs_swap (char header[44])
+{
+  if (header[0] == 'R' && header[1] == 'I' && header[2] == 'F' && header[3] == 'X')
+    return TRUE;
+  else 
+    return FALSE;
+}
+
+static gboolean
+clear (XfburnTranscoder *trans, GError **error)
+{
+  XfburnTranscoderBasic *basic = XFBURN_TRANSCODER_BASIC (trans);
+  XfburnTranscoderBasicPrivate *priv= XFBURN_TRANSCODER_BASIC_GET_PRIVATE (basic);
+  
+  while (priv->fds) {
+    close (GPOINTER_TO_INT (priv->fds->data));
+
+    priv->fds = g_slist_next (priv->fds);
+  }
+  while (priv->srcs) {
+    burn_source_free ( (struct burn_source *) priv->srcs->data);
+
+    priv->srcs= g_slist_next (priv->srcs);
+  }
+
+  return TRUE;
+}
+
 /*        */
 /* public */
 /*        */

Modified: xfburn/trunk/xfburn/xfburn-transcoder.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-transcoder.c	2008-10-12 00:53:33 UTC (rev 5576)
+++ xfburn/trunk/xfburn/xfburn-transcoder.c	2008-10-12 03:37:40 UTC (rev 5577)
@@ -24,6 +24,7 @@
 #include "xfburn-global.h"
 
 #include "xfburn-transcoder.h"
+#include "xfburn-error.h"
 
 static void xfburn_transcoder_base_init (XfburnTranscoderInterface * iface);
 
@@ -40,7 +41,7 @@
 /*************************/
 //static guint signals[LAST_SIGNAL];
 
-GtkType
+GType
 xfburn_transcoder_get_type ()
 {
   static GtkType type = 0;
@@ -98,10 +99,35 @@
     return iface->is_audio_file (trans, fn, error);
   
   g_warning ("Falling back to base implementation for xfburn_transcoder_is_audio_file, which always says false.");
+  g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_NOT_IMPLEMENTED, "xfburn_transcoder_is_audio_file is not implemented");
   return FALSE;
 }
 
+struct burn_track *
+xfburn_transcoder_create_burn_track (XfburnTranscoder *trans, XfburnAudioTrack *atrack, GError **error)
+{
+  XfburnTranscoderInterface *iface = XFBURN_TRANSCODER_GET_INTERFACE (trans);
+  if (iface->create_burn_track)
+    return iface->create_burn_track (trans, atrack, error);
+  
+  g_warning ("Falling back to empty base implementation for xfburn_transcoder_create_burn_track.");
+  g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_NOT_IMPLEMENTED, "xfburn_transcoder_create_burn_track is not implemented");
+  return NULL;
+}
 
+gboolean
+xfburn_transcoder_clear (XfburnTranscoder *trans, GError **error)
+{
+  XfburnTranscoderInterface *iface = XFBURN_TRANSCODER_GET_INTERFACE (trans);
+  if (iface->clear)
+    return iface->clear (trans, error);
+  
+  g_warning ("Falling back to empty base implementation for xfburn_transcoder_clear.");
+  g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_NOT_IMPLEMENTED, "xfburn_transcoder_clear is not implemented");
+  return FALSE;
+}
+
+
 void 
 xfburn_transcoder_set_global (XfburnTranscoder *trans)
 {

Modified: xfburn/trunk/xfburn/xfburn-transcoder.h
===================================================================
--- xfburn/trunk/xfburn/xfburn-transcoder.h	2008-10-12 00:53:33 UTC (rev 5576)
+++ xfburn/trunk/xfburn/xfburn-transcoder.h	2008-10-12 03:37:40 UTC (rev 5577)
@@ -24,8 +24,12 @@
 #include <config.h>
 #endif /* !HAVE_CONFIG_H */
 
-#include <gtk/gtk.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <libburn.h>
 
+#include "xfburn-audio-composition.h"
+
 G_BEGIN_DECLS
 
 #define XFBURN_TYPE_TRANSCODER         (xfburn_transcoder_get_type ())
@@ -42,15 +46,20 @@
   GTypeInterface parent;
 
   gboolean (*is_audio_file) (XfburnTranscoder *trans, const gchar *fn, GError **error);
+  struct burn_track * (*create_burn_track) (XfburnTranscoder *trans, XfburnAudioTrack *atrack, GError **error);
+  gboolean (*clear) (XfburnTranscoder *trans, GError **error);
   
 } XfburnTranscoderInterface;
 
-GtkType xfburn_transcoder_get_type ();
-gboolean xfburn_transcoder_is_audio_file (XfburnTranscoder *trans, const gchar *fn, GError **error);
+GType xfburn_transcoder_get_type ();
 
 void xfburn_transcoder_set_global (XfburnTranscoder *trans);
 XfburnTranscoder *xfburn_transcoder_get_global ();
 
+gboolean xfburn_transcoder_is_audio_file (XfburnTranscoder *trans, const gchar *fn, GError **error);
+struct burn_track *xfburn_transcoder_create_burn_track (XfburnTranscoder *trans, XfburnAudioTrack *atrack, GError **error);
+gboolean xfburn_transcoder_clear (XfburnTranscoder *trans, GError **error);
+
 G_END_DECLS
 
 #endif /* __XFBURN_TRANSCODER_H__ */




More information about the Goodies-commits mailing list