[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