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

David Mohr squisher at xfce.org
Sun Oct 12 21:37:49 CEST 2008


Author: squisher
Date: 2008-10-12 19:37:49 +0000 (Sun, 12 Oct 2008)
New Revision: 5594

Modified:
   xfburn/trunk/xfburn/xfburn-audio-composition.c
   xfburn/trunk/xfburn/xfburn-audio-composition.h
   xfburn/trunk/xfburn/xfburn-burn-audio-cd-composition-dialog.c
   xfburn/trunk/xfburn/xfburn-error.h
   xfburn/trunk/xfburn/xfburn-transcoder-basic.c
   xfburn/trunk/xfburn/xfburn-transcoder.c
   xfburn/trunk/xfburn/xfburn-transcoder.h
Log:
Moving creation of XfburnAudioTrack into Transcoder

Modified: xfburn/trunk/xfburn/xfburn-audio-composition.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-audio-composition.c	2008-10-12 19:22:05 UTC (rev 5593)
+++ xfburn/trunk/xfburn/xfburn-audio-composition.c	2008-10-12 19:37:49 UTC (rev 5594)
@@ -69,6 +69,7 @@
   AUDIO_COMPOSITION_COLUMN_TITLE,
   AUDIO_COMPOSITION_COLUMN_PATH,
   AUDIO_COMPOSITION_COLUMN_TYPE,
+  AUDIO_COMPOSITION_COLUMN_TRACK,
   AUDIO_COMPOSITION_N_COLUMNS
 };
 
@@ -367,7 +368,7 @@
 
   priv->content = exo_tree_view_new ();
   model = gtk_tree_store_new (AUDIO_COMPOSITION_N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING,
-                              G_TYPE_UINT64, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT);
+                              G_TYPE_UINT64, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_POINTER);
 							  
   /*
   gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (model), AUDIO_COMPOSITION_COLUMN_POS,
@@ -487,6 +488,8 @@
     }
   }
 
+  /* FIXME: free XfburnAudioTracks */
+
   g_object_unref (priv->trans);
   priv->trans = NULL;
   
@@ -519,15 +522,21 @@
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->content));
   if (gtk_tree_model_get_iter_first (model, &iter)) {
     do {
-      XfburnAudioTrack *track = g_new0 (XfburnAudioTrack, 1);
+      XfburnAudioTrack *atrack;
+      gint pos;
 
       gtk_tree_model_get (model, &iter, 
-                          AUDIO_COMPOSITION_COLUMN_PATH, &track->inputfile,
-                          AUDIO_COMPOSITION_COLUMN_POS, &track->pos,
+                          AUDIO_COMPOSITION_COLUMN_POS, &pos,
+                          AUDIO_COMPOSITION_COLUMN_TRACK, &atrack,
                           -1);
 
-      list = g_slist_prepend (list, track);
+      g_assert (atrack != NULL);
 
+      /* update the track position, which might have changed */
+      atrack->pos = pos;
+
+      list = g_slist_prepend (list, atrack);
+
     } while (gtk_tree_model_iter_next (model, &iter));
   }
 
@@ -1164,8 +1173,10 @@
     /* new file */
     else if (S_ISREG (s.st_mode)) {
       GError *error = NULL;
+      XfburnAudioTrack *atrack = NULL;
 
-      if (!xfburn_transcoder_is_audio_file (priv->trans, path, &error)) {
+      atrack = xfburn_transcoder_get_audio_track (priv->trans, path, &error);
+      if (atrack == NULL) {
         XfburnNotAddingReason reason;
 
         if (error->code == XFBURN_ERROR_NOT_AUDIO_EXT)
@@ -1194,7 +1205,7 @@
       gdk_threads_leave ();
 
       /* (filesize - header_size) / bytes_per_seconds */
-      secs = (s.st_size - 44) / PCM_BYTES_PER_SECS;
+      secs = atrack->length;
       humanlength = g_strdup_printf ("%2d:%2d", secs / 60, secs % 60);
 
       if (priv->n_tracks == 99) {
@@ -1204,6 +1215,8 @@
         return FALSE;
       }
 
+      /* pos does not yet get recorded into atrack here, because it might
+       * change still and is easier updated inside the model for now */
       gdk_threads_enter ();
       gtk_tree_store_set (GTK_TREE_STORE (model), iter,
                           AUDIO_COMPOSITION_COLUMN_POS, ++priv->n_tracks,
@@ -1214,6 +1227,7 @@
                           AUDIO_COMPOSITION_COLUMN_HUMANLENGTH, humanlength,
                           AUDIO_COMPOSITION_COLUMN_ARTIST, "",
                           AUDIO_COMPOSITION_COLUMN_TITLE, "",
+                          AUDIO_COMPOSITION_COLUMN_TRACK, atrack,
                           AUDIO_COMPOSITION_COLUMN_TYPE, AUDIO_COMPOSITION_TYPE_RAW, -1);
       gdk_threads_leave ();
 
@@ -1374,6 +1388,7 @@
   gchar *path = NULL;
   gchar *humanlength;
   AudioCompositionEntryType type;
+  XfburnAudioTrack *atrack;
 
   GtkTreePath *path_level = NULL;
   
@@ -1389,6 +1404,7 @@
                       AUDIO_COMPOSITION_COLUMN_SIZE, &size,
                       AUDIO_COMPOSITION_COLUMN_PATH, &path, 
                       AUDIO_COMPOSITION_COLUMN_HUMANLENGTH, &humanlength, 
+                      AUDIO_COMPOSITION_COLUMN_TRACK, &atrack,
                       AUDIO_COMPOSITION_COLUMN_TYPE, &type,
                       -1);
   
@@ -1431,6 +1447,7 @@
                       AUDIO_COMPOSITION_COLUMN_SIZE, size,
                       AUDIO_COMPOSITION_COLUMN_PATH, path, 
                       AUDIO_COMPOSITION_COLUMN_HUMANLENGTH, humanlength, 
+                      AUDIO_COMPOSITION_COLUMN_TRACK, atrack,
                       AUDIO_COMPOSITION_COLUMN_TYPE, type,
                       -1);
     

Modified: xfburn/trunk/xfburn/xfburn-audio-composition.h
===================================================================
--- xfburn/trunk/xfburn/xfburn-audio-composition.h	2008-10-12 19:22:05 UTC (rev 5593)
+++ xfburn/trunk/xfburn/xfburn-audio-composition.h	2008-10-12 19:37:49 UTC (rev 5594)
@@ -26,6 +26,8 @@
 
 #include <gtk/gtk.h>
 
+#include "xfburn-transcoder.h"
+
 G_BEGIN_DECLS
 
 #define XFBURN_TYPE_AUDIO_COMPOSITION            (xfburn_audio_composition_get_type ())
@@ -52,15 +54,6 @@
   AUDIO_COMPOSITION_DND_TARGET_TEXT_URI_LIST,
 };
 
-typedef struct
-{
-  gchar *inputfile;
-  gint pos;
-  gchar *artist;
-  gchar *title;
-  gboolean swap;
-} XfburnAudioTrack;
-
 GtkType xfburn_audio_composition_get_type (void);
 
 GtkWidget *xfburn_audio_composition_new (void);

Modified: xfburn/trunk/xfburn/xfburn-burn-audio-cd-composition-dialog.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-burn-audio-cd-composition-dialog.c	2008-10-12 19:22:05 UTC (rev 5593)
+++ xfburn/trunk/xfburn/xfburn-burn-audio-cd-composition-dialog.c	2008-10-12 19:37:49 UTC (rev 5594)
@@ -532,7 +532,7 @@
     GError *error = NULL;
 
     tracks[i] = xfburn_transcoder_create_burn_track (trans, atrack, &error);
-    if (tracks[i] && error) {
+    if (tracks[i] == NULL) {
       xfburn_progress_dialog_burning_failed (XFBURN_PROGRESS_DIALOG (dialog_progress), error->message);
       g_error_free (error);
       abort = TRUE;
@@ -562,7 +562,8 @@
   }
   g_free (tracks);
 
-  xfburn_transcoder_clear (trans, NULL);
+  for (track_list = params->tracks; track_list; track_list = g_slist_next (track_list))
+    xfburn_transcoder_free_burning_resources (trans, (XfburnAudioTrack *) track_list->data, NULL);
   g_object_unref (trans);
 
   burn_session_free (session);

Modified: xfburn/trunk/xfburn/xfburn-error.h
===================================================================
--- xfburn/trunk/xfburn/xfburn-error.h	2008-10-12 19:22:05 UTC (rev 5593)
+++ xfburn/trunk/xfburn/xfburn-error.h	2008-10-12 19:37:49 UTC (rev 5594)
@@ -29,6 +29,7 @@
 typedef enum 
 {
   XFBURN_ERROR_NOT_IMPLEMENTED,
+  XFBURN_ERROR_STAT,
   XFBURN_ERROR_NOT_AUDIO_EXT,
   XFBURN_ERROR_NOT_AUDIO_FORMAT,
   XFBURN_ERROR_COULD_NOT_OPEN_FILE,

Modified: xfburn/trunk/xfburn/xfburn-transcoder-basic.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-transcoder-basic.c	2008-10-12 19:22:05 UTC (rev 5593)
+++ xfburn/trunk/xfburn/xfburn-transcoder-basic.c	2008-10-12 19:37:49 UTC (rev 5594)
@@ -51,7 +51,7 @@
 static void transcoder_interface_init (XfburnTranscoderInterface *iface, gpointer iface_data);
 
 /* internals */
-static gboolean is_audio_file (XfburnTranscoder *trans, const gchar *fn, GError **error);
+static XfburnAudioTrack * get_audio_track (XfburnTranscoder *trans, const gchar *fn, GError **error);
 static gboolean has_audio_ext (const gchar *path);
 static gboolean is_valid_wav (const gchar *path);
 static gboolean valid_wav_headers (guchar header[44]);
@@ -59,7 +59,7 @@
 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);
+static gboolean free_burning_resources (XfburnTranscoder *trans, XfburnAudioTrack *atrack, GError **error);
 
 #define XFBURN_TRANSCODER_BASIC_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), XFBURN_TYPE_TRANSCODER_BASIC, XfburnTranscoderBasicPrivate))
 
@@ -68,8 +68,7 @@
 }; 
 
 typedef struct {
-  GSList *fds;
-  GSList *srcs;
+  gboolean dummy;
 } XfburnTranscoderBasicPrivate;
 
 /*********************/
@@ -146,29 +145,44 @@
 static void
 transcoder_interface_init (XfburnTranscoderInterface *iface, gpointer iface_data)
 {
-  iface->is_audio_file = is_audio_file;
+  iface->get_audio_track = get_audio_track;
   iface->create_burn_track = create_burn_track;
-  iface->clear = clear;
+  iface->free_burning_resources = free_burning_resources;
 }
 /*           */
 /* internals */
 /*           */
 
-static gboolean
-is_audio_file (XfburnTranscoder *trans, const gchar *fn, GError **error)
+static XfburnAudioTrack *
+get_audio_track (XfburnTranscoder *trans, const gchar *fn, GError **error)
 {
+  XfburnAudioTrack *atrack;
+  struct stat s;
+
   if (!has_audio_ext (fn)) {
     g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_NOT_AUDIO_EXT,
                  "File %s does not have a .wav extension", fn);
-    return FALSE;
+    return NULL;
   }
   if (!is_valid_wav (fn)) {
     g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_NOT_AUDIO_FORMAT,
                  "File %s does not contain uncompressed PCM wave audio", fn);
-    return FALSE;
+    return NULL;
   }
 
-  return TRUE;
+  if (stat (fn, &s) != 0) {
+    g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_STAT,
+                 "Could not stat %s", fn);
+    return NULL;
+  }
+
+  atrack = g_new0 (XfburnAudioTrack, 1);
+  /* FIXME: when do we free inputfile?? */
+  atrack->inputfile = g_strdup (fn);
+  atrack->pos = -1;
+  atrack->length = (s.st_size - 44) / PCM_BYTES_PER_SECS;
+
+  return atrack;
 }
 
 static gboolean 
@@ -256,29 +270,31 @@
   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) {
+  atrack->fd = open (atrack->inputfile, 0);
+  if (atrack->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);
+  /* advance the fd so that libburn skips the header,
+   * also allows us to check for byte swapping */
+  read (atrack->fd, header, 44);
 
-  src = burn_fd_source_new (fd, -1 , 0);
-  if (src == NULL) {
+  atrack->src = burn_fd_source_new (atrack->fd, -1 , 0);
+  if (atrack->src == NULL) {
     g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_BURN_SOURCE,
                  _("Could not create burn_source from %s!"), atrack->inputfile);
     return NULL;
@@ -286,7 +302,7 @@
 
   track = burn_track_create ();
   
-  if (burn_track_set_source (track, src) != BURN_SOURCE_OK) {
+  if (burn_track_set_source (track, atrack->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;
@@ -297,9 +313,6 @@
 
   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;
 }
 
@@ -313,22 +326,16 @@
 }
 
 static gboolean
-clear (XfburnTranscoder *trans, GError **error)
+free_burning_resources (XfburnTranscoder *trans, XfburnAudioTrack *atrack, 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));
+  close (atrack->fd);
+  burn_source_free (atrack->src);
 
-    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;
 }
 

Modified: xfburn/trunk/xfburn/xfburn-transcoder.c
===================================================================
--- xfburn/trunk/xfburn/xfburn-transcoder.c	2008-10-12 19:22:05 UTC (rev 5593)
+++ xfburn/trunk/xfburn/xfburn-transcoder.c	2008-10-12 19:37:49 UTC (rev 5594)
@@ -44,7 +44,7 @@
 GType
 xfburn_transcoder_get_type ()
 {
-  static GtkType type = 0;
+  static GType type = 0;
 
   if (type == 0) {
     static const GTypeInfo our_info = {
@@ -91,16 +91,16 @@
 /* public */
 /*        */
 
-gboolean
-xfburn_transcoder_is_audio_file (XfburnTranscoder *trans, const gchar *fn, GError **error)
+XfburnAudioTrack *
+xfburn_transcoder_get_audio_track (XfburnTranscoder *trans, const gchar *fn, GError **error)
 {
   XfburnTranscoderInterface *iface = XFBURN_TRANSCODER_GET_INTERFACE (trans);
-  if (iface->is_audio_file)
-    return iface->is_audio_file (trans, fn, error);
+  if (iface->get_audio_track)
+    return iface->get_audio_track (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;
+  g_warning ("Falling back to base implementation for xfburn_transcoder_get_audio_track, which always says false.");
+  g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_NOT_IMPLEMENTED, "xfburn_transcoder_get_audio_track is not implemented");
+  return NULL;
 }
 
 struct burn_track *
@@ -116,14 +116,14 @@
 }
 
 gboolean
-xfburn_transcoder_clear (XfburnTranscoder *trans, GError **error)
+xfburn_transcoder_free_burning_resources (XfburnTranscoder *trans, XfburnAudioTrack *atrack, GError **error)
 {
   XfburnTranscoderInterface *iface = XFBURN_TRANSCODER_GET_INTERFACE (trans);
-  if (iface->clear)
-    return iface->clear (trans, error);
+  if (iface->free_burning_resources)
+    return iface->free_burning_resources (trans, atrack, 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");
+  g_warning ("Falling back to empty base implementation for xfburn_transcoder_free_burning_resources.");
+  g_set_error (error, XFBURN_ERROR, XFBURN_ERROR_NOT_IMPLEMENTED, "xfburn_transcoder_free_burning_resources is not implemented");
   return FALSE;
 }
 

Modified: xfburn/trunk/xfburn/xfburn-transcoder.h
===================================================================
--- xfburn/trunk/xfburn/xfburn-transcoder.h	2008-10-12 19:22:05 UTC (rev 5593)
+++ xfburn/trunk/xfburn/xfburn-transcoder.h	2008-10-12 19:37:49 UTC (rev 5594)
@@ -28,8 +28,6 @@
 #include <glib-object.h>
 #include <libburn.h>
 
-#include "xfburn-audio-composition.h"
-
 G_BEGIN_DECLS
 
 #define XFBURN_TYPE_TRANSCODER         (xfburn_transcoder_get_type ())
@@ -39,15 +37,29 @@
 //#define XFBURN_IS_TRANSCODER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), XFBURN_TYPE_TRANSCODER))
 #define XFBURN_TRANSCODER_GET_INTERFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), XFBURN_TYPE_TRANSCODER, XfburnTranscoderInterface))
 
+typedef struct
+{
+  const gchar *inputfile;
+  gint pos;
+  gchar *artist;
+  gchar *title;
+  gboolean swap;
+
+  gint length;
+
+  int fd;
+  struct burn_source *src;
+} XfburnAudioTrack;
+
 typedef struct {} XfburnTranscoder; /* dummy struct */
 
 typedef struct
 {
   GTypeInterface parent;
 
-  gboolean (*is_audio_file) (XfburnTranscoder *trans, const gchar *fn, GError **error);
+  XfburnAudioTrack * (*get_audio_track) (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);
+  gboolean (*free_burning_resources) (XfburnTranscoder *trans, XfburnAudioTrack *atrack, GError **error);
   
 } XfburnTranscoderInterface;
 
@@ -56,9 +68,9 @@
 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);
+XfburnAudioTrack * xfburn_transcoder_get_audio_track (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);
+gboolean xfburn_transcoder_free_burning_resources (XfburnTranscoder *trans, XfburnAudioTrack *atrack, GError **error);
 
 G_END_DECLS
 




More information about the Goodies-commits mailing list