Update of /cvsroot/gtkpod/gtkpod/src
In directory sc8-pr-cvs2.sourceforge.net:/tmp/cvs-serv1398/src
Modified Files:
Makefile.am display_itdb.h file.h file_convert.c
file_convert.h file_itunesdb.c prefs.c prefs_window.c
Log Message:
* src/details.c
gtkpod.glade: small fixes for "Edit Details Window" by Mario Rossi.
* gtkpod.glade
scripts/convert-flac2m4a.sh
scripts/convert-flac2mp3.sh
scripts/convert-ogg2m4a.sh
scripts/convert-ogg2mp3.sh
scripts/Makefile.am
src/display_itdb.h
src/file.h
src/file_convert.c
src/file_convert.h
src/file_itunesdb.c
src/prefs_window.c
src/prefs.c: display of conversion progress and improved
conversion scripts (receive meta tags by command line
arguments). Thanks to Simon Naunton!
scripts/convert-m4a2mp3.sh
scripts/convert-mp32m4a.sh
scripts/convert-wav2m4a.sh
scripts/convert-wav2mp3.sh: new scripts for mp3, m4a and wav
conversion.
Index: Makefile.am
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/Makefile.am,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -d -r1.60 -r1.61
--- Makefile.am 16 Jan 2007 09:44:59 -0000 1.60
+++ Makefile.am 5 Feb 2007 08:45:56 -0000 1.61
@@ -38,8 +38,10 @@
display_itdb.c display_itdb.h \
display_spl.c display_tracks.c \
file.c file.h file_export.c \
+ file_convert.c file_convert.h \
file_itunesdb.c \
fileselection.h fileselection.c \
+ flacfile.c flacfile.h \
info.c info.h \
ipod_init.c ipod_init.h \
itdb.h \
@@ -52,6 +54,7 @@
misc_track.c misc_track.h \
mp3file.c mp3file.h \
mp4file.c mp4file.h \
+ oggfile.c oggfile.h \
podcast.c podcast.h \
prefs.c prefs.h \
prefs_window.c prefs_window.h \
@@ -59,10 +62,7 @@
sha1.c sha1.h \
syncdir.c syncdir.h \
tools.c tools.h \
- wavfile.c wavfile.h \
- oggfile.c oggfile.h \
- flacfile.c flacfile.h \
- file_convert.c file_convert.h
+ wavfile.c wavfile.h
gtkpod_LDADD = @PACKAGE_LIBS@ $(INTLLIBS) @LIBOBJS@
Index: display_itdb.h
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/display_itdb.h,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- display_itdb.h 18 Jan 2007 16:16:43 -0000 1.38
+++ display_itdb.h 5 Feb 2007 08:45:56 -0000 1.39
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-19 00:55:02 jcs>
+/* Time-stamp: <2007-02-05 15:49:25 jcs>
|
| Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
| Part of the gtkpod project.
@@ -36,7 +36,7 @@
#include <gtk/gtk.h>
#include "itdb.h"
-#include "file.h"
+#include "file_convert.h"
struct itdbs_head
{
Index: file.h
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/file.h,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- file.h 18 Jan 2007 16:16:43 -0000 1.57
+++ file.h 5 Feb 2007 08:45:56 -0000 1.58
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-19 00:59:21 jcs>
+/* Time-stamp: <2007-02-05 12:53:44 jcs>
|
| Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
| Part of the gtkpod project.
@@ -98,6 +98,8 @@
gboolean gp_eject_ipod(iTunesDB *itdb);
gboolean gp_save_itdb (iTunesDB *itdb);
void handle_export (void);
+void details_log_clear (void);
+void details_log_append (gchar *text);
void data_changed (iTunesDB *itdb);
void data_unchanged (iTunesDB *itdb);
gboolean files_are_saved (void);
Index: file_convert.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/file_convert.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- file_convert.c 18 Jan 2007 16:16:43 -0000 1.2
+++ file_convert.c 5 Feb 2007 08:46:00 -0000 1.3
@@ -70,26 +70,26 @@
*/
extern GError *file_convert_pre_copy (TrackConv *converter)
{
- ExtraTrackData *etr=NULL;
- GError *error=NULL; /* error if any */
- const gchar *type=NULL; /* xxx (ogg) */
- gchar *convert_command=NULL; /* from prefs */
- gchar **argv; /* for conversion external process */
+ Track *track = NULL;
+ ExtraTrackData *etr = NULL;
+ GError *error = NULL; /* error if any */
+ const gchar *type = NULL; /* xxx (ogg) */
+ gchar *convert_command = NULL; /* from prefs */
+ gchar **argv; /* for conversion external process */
+ gint i;
/* sanity checks */
g_return_val_if_fail (converter, NULL);
g_return_val_if_fail (converter->track, NULL);
- etr=converter->track->userdata;
+ track = converter->track;
+ etr = track->userdata;
g_return_val_if_fail (etr, NULL);
/* Find the correct script for conversion */
switch (converter->type) {
case FILE_TYPE_UNKNOWN:
- case FILE_TYPE_MP3:
- case FILE_TYPE_M4A:
case FILE_TYPE_M4P:
case FILE_TYPE_M4B:
- case FILE_TYPE_WAV:
case FILE_TYPE_M4V:
case FILE_TYPE_MP4:
case FILE_TYPE_MOV:
@@ -100,6 +100,15 @@
case FILE_TYPE_DIRECTORY:
return NULL; /*FIXME: error? */
break;
+ case FILE_TYPE_M4A:
+ convert_command = prefs_get_string ("path_conv_m4a");
+ break;
+ case FILE_TYPE_WAV:
+ convert_command = prefs_get_string ("path_conv_wav");
+ break;
+ case FILE_TYPE_MP3:
+ convert_command = prefs_get_string ("path_conv_mp3");
+ break;
case FILE_TYPE_OGG:
convert_command = prefs_get_string ("path_conv_ogg");
break;
@@ -118,15 +127,60 @@
type);
}
/* FIXME: check that %s is present (at least) */
-
+
/* Build the command args */
- argv = g_malloc0(sizeof(gchar*) * 3);
- argv[0] = convert_command;
- argv[1] = etr->pc_path_locale;
+ argv = g_malloc0(sizeof(gchar*) * 17);
- /* Convert the file */
+ argv[0] = g_strdup (convert_command);
+ i = 1;
+ if (track->artist) {
+ argv[i] = g_strdup ("-a");
+ ++i;
+ argv[i] = g_strdup (track->artist);
+ ++i;
+ }
+ if (track->album) {
+ argv[i] = g_strdup ("-A");
+ ++i;
+ argv[i] = g_strdup (track->album);
+ ++i;
+ }
+ if (track->track_nr) {
+ argv[i] = g_strdup ("-T");
+ ++i;
+ argv[i] = g_strdup_printf("%d", track->track_nr);
+ ++i;
+ }
+ if (track->title) {
+ argv[i] = g_strdup ("-t");
+ ++i;
+ argv[i] = g_strdup (track->title);
+ ++i;
+ }
+ if (track->genre) {
+ argv[i] = g_strdup ("-g");
+ ++i;
+ argv[i] = g_strdup (track->genre);
+ ++i;
+ }
+ if (track->year) {
+ argv[i] = g_strdup ("-y");
+ ++i;
+ argv[i] = g_strdup_printf("%d", track->year);
+ ++i;
+ }
+ if (track->comment) {
+ argv[i] = g_strdup ("-c");
+ ++i;
+ argv[i] = g_strdup (track->comment);
+ ++i;
+ }
+ argv[i] = g_strdup (etr->pc_path_locale);
- error=execute_conv (argv, converter); /* frees all cmdline strings */
+ argv = g_realloc(argv, (i + 1) * sizeof(gchar*));
+
+ /* Convert the file */
+ error = execute_conv (argv, converter); /* frees all cmdline strings */
return error;
}
@@ -145,6 +199,7 @@
GPid wait;
gchar *error_msg=NULL;
GError *error=NULL;
+ gboolean aborted = FALSE;
/* sanity checks */
g_return_val_if_fail (converter, NULL);
@@ -174,8 +229,11 @@
}
}else if (WIFSIGNALED(exit_status)) {
debug(":0x%X -> %d\n",exit_status,WTERMSIG(exit_status));
+ aborted = TRUE;
+/*
error_msg = g_strdup_printf ("Execution failed. Received signal %d
(%s)",
WTERMSIG(exit_status),(error?error->message:""));
+*/
}else if (WIFSTOPPED(exit_status)) {
debug(":0x%X -> %d\n",exit_status,WSTOPSIG(exit_status));
error_msg = g_strdup_printf ("Execution stopped. Received signal
%d (%s)",
@@ -192,24 +250,34 @@
}
debug("Error: %s\n",(error_msg?error_msg:"N/A"));
- /* Getting filename from child's STDOUT */
- if (!error_msg)
- error_msg = get_filename_from_stdout (converter);
+ if(aborted) error = conv_error(_("Aborted.\n"));
+ else {
+ /* Getting filename from child's STDOUT */
+ if (!error_msg)
+ error_msg = get_filename_from_stdout (converter);
- /* Checking file exists */
- if (!error_msg)
- error_msg = checking_converted_file (converter);
+ /* Checking file exists */
+ if (!error_msg)
+ error_msg = checking_converted_file (converter);
- /* Checking errors */
- if (error_msg){
- error=conv_error(_("Cannot convert '%s'.\nExecuting `%s'\nGave error:
%s\n\n"),
- etr->pc_path_locale,
- converter->command_line,
- error_msg);
- g_free (error_msg);
+ /* Checking errors */
+ if (error_msg){
+ error=conv_error(_("Cannot convert '%s'.\nExecuting `%s'\nGave
error: %s\n\n"),
+ etr->pc_path_locale,
+ converter->command_line,
+ error_msg);
+ g_free (error_msg);
+ }
}
+
/* Freeing data */
if (converter->child_pid) {
+ details_log_clear ();
+
+ if (!g_source_remove (converter->source_id)) {
+ error = conv_error(_("Failed to remove watch\n\n"));
+ }
+
g_spawn_close_pid(converter->child_pid);
converter->child_pid=0;
}
@@ -263,9 +331,40 @@
*
*/
+/*
+ * Called by watch on stderr to update details log
+ */
+static gboolean execute_conv_cb(GIOChannel *source, GIOCondition condition,
TrackConv *converter)
+{
+ GIOStatus status;
+ gchar buf[255];
+ gsize bytes_read;
+
+ if (converter->aborted) return FALSE;
+
+ while (1) {
+ status = g_io_channel_read_chars (source, buf, sizeof(buf) - 1,
&bytes_read, NULL);
+ buf[bytes_read] = '\0';
+ switch (status) {
+
+ case G_IO_STATUS_ERROR :
+ return FALSE;
+
+ case G_IO_STATUS_EOF :
+ details_log_append(buf);
+ return FALSE;
+ case G_IO_STATUS_NORMAL :
+ details_log_append(buf);
+ break;
+ case G_IO_STATUS_AGAIN :
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
/*
@@ -273,13 +372,15 @@
*/
static GError *execute_conv (gchar **argv, TrackConv *converter)
{
- ExtraTrackData *etr=NULL;
- GError *error=NULL;
- gchar *command_line=NULL;
- GError *spawn_error=NULL;
- guint i=0;
+ ExtraTrackData *etr = NULL;
+ GError *error = NULL;
+ gchar *command_line = NULL;
+ GError *spawn_error = NULL;
+ guint i = 0;
GPid child_pid;
gint child_stdout;
+ gint child_stderr;
+ GIOChannel *gio_channel;
/* sanity checks */
g_return_val_if_fail (converter, NULL);
@@ -290,13 +391,14 @@
g_return_val_if_fail (argv, NULL);
/* Building command_line string (for output only) */
- for(i=0; argv[i]!=NULL; ++i)
+ for (i = 0; argv[i] != NULL; ++i)
{
- gchar *p=command_line;
+
+ gchar *p = command_line;
if (!p)
- command_line=g_strdup(argv[i]); /* program
name (1st token) */
+ command_line = g_strdup(argv[i]); /* program
name (1st token) */
else {
- command_line=g_strdup_printf("%s \"%s\"",p,argv[i]); /* arg (other
tokens) */
+ command_line = g_strdup_printf("%s \"%s\"",p,argv[i]); /* arg
(other tokens) */
g_free(p);
}
}
@@ -314,22 +416,33 @@
&child_pid, /* child's PID */
NULL, /* child's stdin */
&child_stdout, /* child's stdout
*/
- NULL, /* child's stderr
FIXME: get this for "debug" (result?) */
- &spawn_error)==FALSE){ /* error */
+ &child_stderr, /* child's stderr
FIXME: get this for "debug" (result?) */
+ &spawn_error)==FALSE)
+ { /* error */
debug("error: error:%p (message:%s)",error,
(error?error->message:"NoErrorMessage"));
error = conv_error(_("Cannot convert '%s'.\nExecuting `%s'\nGave
error: %s\n\n"),
- etr->pc_path_locale,
- command_line,
-
(spawn_error&&spawn_error->message)?spawn_error->message:"no explanation.
Please report.");
+ etr->pc_path_locale,
+ command_line,
+
(spawn_error&&spawn_error->message)?spawn_error->message:"no explanation.
Please report.");
if (spawn_error)
- g_free (spawn_error); /* FIXME: memory leak i guess (at least
for message if any). */
+ {
+ g_free (spawn_error); /* FIXME: memory leak i guess (at
+ * least for message if any). */
+ }
g_free (command_line);
- } else {
- converter->child_pid=child_pid;
- converter->child_stdout=child_stdout;
- converter->command_line=command_line;
}
-
+ else
+ {
+ converter->child_pid = child_pid;
+ converter->child_stdout = child_stdout;
+ converter->command_line = command_line;
+ gio_channel = g_io_channel_unix_new (child_stderr);
+ g_io_channel_set_flags (gio_channel, G_IO_FLAG_NONBLOCK, NULL);
+ converter->source_id = g_io_add_watch (gio_channel, G_IO_IN,
(GIOFunc)execute_conv_cb, converter);
+ g_io_channel_set_close_on_unref (gio_channel, TRUE);
+ g_io_channel_unref (gio_channel);
+ converter->aborted = FALSE;
+ }
/* Freeing data */
for(i=0; argv[i]!=NULL; ++i){
g_free (argv[i]);
Index: file_convert.h
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/file_convert.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- file_convert.h 18 Jan 2007 16:16:43 -0000 1.2
+++ file_convert.h 5 Feb 2007 08:46:00 -0000 1.3
@@ -6,18 +6,21 @@
#endif
#include <gtk/gtk.h>
-#include "display_itdb.h"
+#include <itdb.h>
+#include <file.h>
typedef struct
{
- Track *track; /* Track to convert */
- gchar *converted_file; /* PC filename of the "mp3" file
- != NULL if the file exists */
- gint32 old_size; /* size of the original file */
- FileType type; /* type of the original file */
- GPid child_pid; /* PID of conversion process */
- gint child_stdout; /* STDOUT of conversion process */
- gchar *command_line; /* used for conversion */
+ Track *track; /* Track to convert */
+ gchar *converted_file; /* PC filename of the "mp3" file
+ != NULL if the file exists */
+ gint32 old_size; /* size of the original file */
+ FileType type; /* type of the original file */
+ GPid child_pid; /* PID of conversion process */
+ gint child_stdout; /* STDOUT of conversion process */
+ gchar *command_line; /* used for conversion */
+ gint source_id;
+ gboolean aborted;
} TrackConv;
Index: file_itunesdb.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/file_itunesdb.c,v
retrieving revision 1.106
retrieving revision 1.107
diff -u -d -r1.106 -r1.107
--- file_itunesdb.c 18 Jan 2007 16:54:07 -0000 1.106
+++ file_itunesdb.c 5 Feb 2007 08:46:00 -0000 1.107
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-19 01:52:28 jcs>
+/* Time-stamp: <2007-02-05 17:27:00 jcs>
|
| Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
| Part of the gtkpod project.
@@ -33,6 +33,7 @@
#include <string.h>
#include <stdlib.h>
+#include <signal.h>
#include "charset.h"
#include "display.h"
#include "file.h"
@@ -79,9 +80,17 @@
gboolean transferred;
};
+typedef struct {
+ GMutex *mutex; /* lock when modifying struct! */
+ gboolean abort; /* TRUE = abort */
+ Track *track; /* Current track */
+ GPid converter_pid; /* Converter used for track */
+} TransferData;
+
+
#ifdef G_THREADS_ENABLED
/* Thread specific */
-static GMutex *mutex = NULL;
+static GMutex *mutex = NULL;
static GCond *cond = NULL;
static gboolean mutex_data = FALSE;
#endif
@@ -92,10 +101,50 @@
static GList *extendeddeletion = NULL;
static float extendedinfoversion = 0.0;
+static volatile GtkWidget *details_log; /* Details log on file dialog */
/* Some declarations */
static gboolean gp_write_itdb (iTunesDB *itdb);
+void details_log_append(gchar *text)
+{
+ GtkTextBuffer *buf;
+ GtkTextIter start, end;
+ gchar *ptr = text, *next;
+
+ g_return_if_fail (GTK_IS_TEXT_VIEW(details_log));
+
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (details_log));
+ gtk_text_buffer_get_end_iter (buf, &end);
+ while (*ptr) {
+ if (!details_log) return;
+ next = g_utf8_find_next_char (ptr, NULL);
+ if (*ptr == '\b') {
+ start = end;
+ if (gtk_text_iter_backward_char (&start))
+ gtk_text_buffer_delete (buf, &start, &end);
+ }
+ else if(*ptr == '\r') {
+ start = end;
+ gtk_text_iter_set_line_offset (&start, 0);
+ gtk_text_buffer_delete (buf, &start, &end);
+ }
+ else gtk_text_buffer_insert (buf, &end, ptr, next - ptr);
+ ptr = next;
+ }
+ gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (details_log), &end, 0.0, FALSE,
0.0, 0.0);
+}
+
+void details_log_clear(void)
+{
+ GtkTextBuffer *buf;
+
+ g_return_if_fail (GTK_IS_TEXT_VIEW(details_log));
+
+ buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (details_log));
+ gtk_text_buffer_set_text (buf, "", -1);
+}
+
/* fills in extended info if available */
/* num/total are used to give updates in case the md5 checksums have
@@ -1155,6 +1204,20 @@
}
+TransferData *transfer_data_new (void)
+{
+ TransferData *transfer_data;
+ transfer_data = g_new0 (TransferData, 1);
+ transfer_data->mutex = g_mutex_new ();
+ transfer_data->converter_pid = -1;
+ return transfer_data;
+}
+
+void transfer_data_free (TransferData *transfer_data)
+{
+ if (transfer_data->mutex) g_mutex_free (transfer_data->mutex);
+ g_free (transfer_data);
+}
#ifdef G_THREADS_ENABLED
/* Threaded remove file */
@@ -1172,31 +1235,31 @@
}
#endif
-
/* Threaded copy of ipod track */
/* Returns: GError *error */
static gpointer th_copy (gpointer data)
{
- Track *track = data;
+ TransferData *transfer_data = data;
+ Track *track;
ExtraTrackData *etr;
FileType type;
TrackConv *converter = NULL;
GError *error = NULL;
+ g_return_val_if_fail (transfer_data, NULL);
+ track = transfer_data->track;
g_return_val_if_fail (track, NULL);
etr = track->userdata;
g_return_val_if_fail (etr, NULL);
const gchar *file_to_transfer=etr->pc_path_locale;
+ gboolean convert = FALSE;
/* check if we need to convert the file */
type = determine_file_type (file_to_transfer);
switch (type)
{
case FILE_TYPE_UNKNOWN:
- case FILE_TYPE_MP3:
- case FILE_TYPE_M4A:
case FILE_TYPE_M4P:
case FILE_TYPE_M4B:
- case FILE_TYPE_WAV:
case FILE_TYPE_M4V:
case FILE_TYPE_MP4:
case FILE_TYPE_MOV:
@@ -1205,21 +1268,45 @@
case FILE_TYPE_PLS:
case FILE_TYPE_IMAGE:
case FILE_TYPE_DIRECTORY:
- converter = NULL;
break;
+ case FILE_TYPE_M4A:
+ convert = prefs_get_int ("convert_m4a");
+ break;
+ case FILE_TYPE_WAV:
+ convert = prefs_get_int ("convert_wav");
+ break;
+ case FILE_TYPE_MP3:
+ convert = prefs_get_int ("convert_mp3");
+ break;
case FILE_TYPE_OGG:
+ convert = prefs_get_int ("convert_ogg");
+ break;
case FILE_TYPE_FLAC:
+ convert = prefs_get_int ("convert_flac");
+ break;
+ }
+
+ if (convert)
+ {
converter = g_new0 (TrackConv, 1);
converter->type = type;
converter->track = track;
error = file_convert_pre_copy (converter);
if (!error)
{
+ g_mutex_lock (transfer_data->mutex);
+ transfer_data->converter_pid = converter->child_pid;
+ g_mutex_unlock (transfer_data->mutex);
+
error = file_convert_wait_for_conversion (converter);
+
+ g_mutex_lock (transfer_data->mutex);
+ transfer_data->converter_pid = -1;
+ g_mutex_unlock (transfer_data->mutex);
+
if (!error)
file_to_transfer = converter->converted_file;
}
- break;
}
if (error == NULL)
@@ -1246,11 +1333,22 @@
/* This function is called when the user presses the abort button
* during flush_tracks() */
-static void file_dialog_abort (gboolean *abort_flag)
+static void file_dialog_abort (TransferData *transfer_data)
{
- *abort_flag = TRUE;
-}
+ g_return_if_fail (transfer_data);
+
+ g_mutex_lock (transfer_data->mutex);
+
+ transfer_data->abort = TRUE;
+
+ /* kill conversion if in progress */
+ if (transfer_data->converter_pid != -1)
+ {
+ kill (transfer_data->converter_pid, SIGTERM);
+ }
+ g_mutex_unlock (transfer_data->mutex);
+}
/* check if iPod directory stucture is present */
static gboolean ipod_dirs_present (const gchar *mountpoint)
@@ -1282,9 +1380,10 @@
static GtkWidget *create_file_dialog (GtkWidget **progress_bar,
- gboolean *abort_flag)
+ GtkWidget **text_view,
+ TransferData *transfer_data)
{
- GtkWidget *dialog, *label, *image, *hbox;
+ GtkWidget *dialog, *label, *image, *hbox, *expander, *scrolled_window;
/* create the dialog window */
dialog = gtk_dialog_new_with_buttons (_("Information"),
@@ -1310,20 +1409,32 @@
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
/* Create the progress bar */
- if (progress_bar)
+ if (progress_bar) {
*progress_bar = gtk_progress_bar_new ();
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+ *progress_bar, FALSE, FALSE, 0);
+ }
+
+ /* Create details log */
+ if (text_view) {
+ expander = gtk_expander_new (_("Details..."));
+ scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+ *text_view = gtk_text_view_new();
+ gtk_container_add (GTK_CONTAINER (scrolled_window), *text_view);
+ gtk_container_add (GTK_CONTAINER (expander), scrolled_window);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+ expander, TRUE, TRUE, 0);
+ }
/* Indicate that user wants to abort */
g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
G_CALLBACK (file_dialog_abort),
- abort_flag);
+ transfer_data);
/* Add the image/label + progress bar to dialog */
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
hbox, FALSE, FALSE, 0);
- if (progress_bar)
- gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
- *progress_bar, FALSE, FALSE, 0);
+
gtk_widget_show_all (dialog);
return dialog;
@@ -1339,7 +1450,7 @@
GtkWidget *dialog, *progress_bar;
gchar *progtext = NULL;
gboolean result = TRUE;
- static gboolean abort_flag;
+ TransferData *transfer_data;
ExtraiTunesDBData *eitdb;
#ifdef G_THREADS_ENABLED
GThread *thread = NULL;
@@ -1348,8 +1459,6 @@
if (!cond) cond = g_cond_new ();
#endif
-
-
g_return_val_if_fail (itdb, FALSE);
eitdb = itdb->userdata;
g_return_val_if_fail (eitdb, FALSE);
@@ -1364,16 +1473,16 @@
g_return_val_if_fail (itdb_get_mountpoint (itdb), FALSE);
}
- abort_flag = FALSE;
+ transfer_data = transfer_data_new ();
- dialog = create_file_dialog (&progress_bar, &abort_flag);
+ dialog = create_file_dialog (&progress_bar, NULL, transfer_data);
progtext = g_strdup (_("deleting..."));
gtk_progress_bar_set_text(GTK_PROGRESS_BAR (progress_bar), progtext);
while (widgets_blocked && gtk_events_pending ()) gtk_main_iteration ();
g_free (progtext);
/* lets clean up those pending deletions */
- while (!abort_flag && eitdb->pending_deletion)
+ while (!transfer_data->abort && eitdb->pending_deletion)
{
gchar *filename = NULL;
Track *track = eitdb->pending_deletion->data;
@@ -1407,6 +1516,10 @@
g_get_current_time (>ime);
g_time_val_add (>ime, 20000);
g_cond_timed_wait (cond, mutex, >ime);
+ /* Waits until this thread is woken up on cond, but
+ not longer than until the time specified by
+ abs_time. The mutex is unlocked before falling
+ asleep and locked again before resuming. */
} while(!mutex_data);
g_mutex_unlock (mutex);
rmres = GPOINTER_TO_UINT(g_thread_join (thread));
@@ -1432,7 +1545,8 @@
gtk_main_iteration ();
}
gtk_widget_destroy (dialog);
- if (abort_flag) result = FALSE;
+ if (transfer_data->abort) result = FALSE;
+ transfer_data_free (transfer_data);
return result;
}
@@ -1447,7 +1561,7 @@
GList *gl;
gint count, n;
gboolean result = TRUE;
- static gboolean abort_flag;
+ TransferData *transfer_data;
GtkWidget *dialog, *progress_bar;
time_t start;
gchar *progtext = NULL;
@@ -1465,33 +1579,42 @@
n = itdb_tracks_number_nontransferred (itdb);
- if (n==0) return TRUE;
+ if (n == 0) return TRUE;
+
+ transfer_data = transfer_data_new ();
- abort_flag = FALSE;
/* create the dialog window */
- dialog = create_file_dialog (&progress_bar, &abort_flag);
+ dialog = create_file_dialog (&progress_bar,
+ (GtkWidget**)&details_log,
+ transfer_data);
progtext = g_strdup (_("preparing to copy..."));
gtk_progress_bar_set_text (GTK_PROGRESS_BAR (progress_bar), progtext);
while (widgets_blocked && gtk_events_pending ()) gtk_main_iteration ();
g_free (progtext);
+ transfer_data->abort = FALSE;
+
/* count number of tracks to be transferred */
count = 0; /* tracks transferred */
start = time (NULL);
- for (gl=itdb->tracks; gl && !abort_flag; gl=gl->next)
+ for (gl=itdb->tracks; gl && !transfer_data->abort; gl=gl->next)
{
time_t diff, fullsecs, hrs, mins, secs;
Track *track = gl->data;
g_return_val_if_fail (track, FALSE); /* this will hang the
application :-( */
+ g_mutex_lock (transfer_data->mutex);
+ transfer_data->track = track;
+ g_mutex_unlock (transfer_data->mutex);
+
if (!track->transferred) /* but this would crash
it otherwise... */
{
GError *error = NULL;
#ifdef G_THREADS_ENABLED
mutex_data = FALSE;
- thread = g_thread_create (th_copy, track, TRUE, NULL);
+ thread = g_thread_create (th_copy, transfer_data, TRUE, NULL);
if (thread)
{
g_mutex_lock (mutex);
@@ -1509,18 +1632,20 @@
}
else {
g_warning ("Thread creation failed, falling back to default.\n");
- error = th_copy (track);
+ error = th_copy (transfer_data);
}
#else
- error = th_copy (track);
+ error = th_copy (transfer_data);
#endif
if (error)
{ /* an error occurred */
- result = FALSE;
- if (error->message)
- gtkpod_warning ("%s\n\n", error->message);
- else
- g_warning ("error->message == NULL!\n");
+ if(!transfer_data->abort) {
+ result = FALSE;
+ if (error->message)
+ gtkpod_warning ("%s\n\n", error->message);
+ else
+ g_warning ("error->message == NULL!\n");
+ }
g_error_free (error);
}
data_changed (itdb); /* otherwise new free space status from
@@ -1561,12 +1686,14 @@
while (widgets_blocked && gtk_events_pending ()) gtk_main_iteration ();
} /* for (.;.;.) */
- if (abort_flag) result = FALSE; /* negative result if user aborted */
+ if (transfer_data->abort) result = FALSE; /* negative result if user
aborted */
if (result == FALSE)
gtkpod_statusbar_message (_("Some tracks were not written to iPod.
Export aborted!"));
gtkpod_statusbar_timeout (0);
gtk_widget_destroy (dialog);
while (widgets_blocked && gtk_events_pending ()) gtk_main_iteration ();
+
+ g_free (transfer_data);
return result;
}
Index: prefs.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/prefs.c,v
retrieving revision 1.273
retrieving revision 1.274
diff -u -d -r1.273 -r1.274
--- prefs.c 16 Jan 2007 09:45:00 -0000 1.273
+++ prefs.c 5 Feb 2007 08:46:00 -0000 1.274
@@ -1,4 +1,4 @@
-/* Time-stamp: <2007-01-16 18:34:24 jcs>
+/* Time-stamp: <2007-02-05 17:42:24 jcs>
|
| Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
| Copyright (C) 2006 James Liggett <jrliggett at cox.net>
@@ -160,10 +160,17 @@
str = g_build_filename (SCRIPTDIR, "convert-ogg2mp3.sh", NULL);
prefs_set_string ("path_conv_ogg", str);
g_free (str);
+ prefs_set_int ("convert_ogg", TRUE);
str = g_build_filename (SCRIPTDIR, "convert-flac2mp3.sh", NULL);
prefs_set_string ("path_conv_flac", str);
g_free (str);
+ prefs_set_int ("convert_flac", TRUE);
+
+ str = g_build_filename (SCRIPTDIR, "convert-wav2mp3.sh", NULL);
+ prefs_set_string ("path_conv_wav", str);
+ g_free (str);
+ prefs_set_int ("convert_wav", FALSE);
/* Set sorting tab defaults */
Index: prefs_window.c
===================================================================
RCS file: /cvsroot/gtkpod/gtkpod/src/prefs_window.c,v
retrieving revision 1.189
retrieving revision 1.190
diff -u -d -r1.189 -r1.190
--- prefs_window.c 16 Jan 2007 09:45:00 -0000 1.189
+++ prefs_window.c 5 Feb 2007 08:46:00 -0000 1.190
@@ -67,7 +67,18 @@
static void standard_toggle_toggled (GtkToggleButton *togglebutton,
const gchar *key);
+static void on_convert_toggle_toggled (GtkToggleButton *togglebutton,
+ gpointer not_used);
+static const gchar *convert_names[] =
+{
+ "convert_ogg",
+ "convert_flac",
+ "convert_m4a",
+ "convert_mp3",
+ "convert_wav",
+ NULL
+};
/* Definition of path button names.
path_fileselector_titles[] specifies the title for the file
@@ -84,6 +95,9 @@
"mserv_trackinfo_root_button",
"path_conv_ogg_button",
"path_conv_flac_button",
+ "path_conv_m4a_button",
+ "path_conv_mp3_button",
+ "path_conv_wav_button",
NULL
};
static const gchar *path_key_names[] =
@@ -96,6 +110,9 @@
"path_mserv_trackinfo_root",
"path_conv_ogg",
"path_conv_flac",
+ "path_conv_m4a",
+ "path_conv_mp3",
+ "path_conv_wav",
NULL
};
const gchar *path_entry_names[] =
@@ -108,6 +125,9 @@
"mserv_trackinfo_root_entry",
"path_conv_ogg_entry",
"path_conv_flac_entry",
+ "path_conv_m4a_entry",
+ "path_conv_mp3_entry",
+ "path_conv_wav_entry",
NULL
};
static const gchar *path_fileselector_titles[] =
@@ -120,6 +140,9 @@
N_("Select the mserv trackinfo root directory"),
N_("Select the ogg/vorbis converter command"),
N_("Select the flac converter command"),
+ N_("Select the m4a converter command."),
+ N_("Select the mp3 converter command."),
+ N_("Select the wav converter command."),
NULL
};
static const GtkFileChooserAction path_type[] =
@@ -132,6 +155,9 @@
GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_FILE_CHOOSER_ACTION_OPEN,
+ GTK_FILE_CHOOSER_ACTION_OPEN,
-1
};
@@ -267,7 +293,19 @@
else gtk_tooltips_disable (tt);
}
+static void convert_table_set_children_initial_sensitivity (GtkTable *table)
+{
+ GList *list_item;
+ GtkTableChild *child;
+ list_item = table->children;
+ while (list_item) {
+ child = (GtkTableChild*)list_item->data;
+ gtk_widget_set_sensitive (child->widget,
+ GTK_IS_TOGGLE_BUTTON (child->widget));
+ list_item = g_list_next (list_item);
+ }
+}
/**
* create_gtk_prefs_window
@@ -690,9 +728,25 @@
gtk_entry_set_text(GTK_ENTRY(w), buf);
g_free(buf);
}
-
+
+ w = gtkpod_xml_get_widget (prefs_window_xml, "convert_table");
+ convert_table_set_children_initial_sensitivity (GTK_TABLE (w));
+ for (i=0; convert_names[i]; ++i)
+ {
+ w = gtkpod_xml_get_widget (prefs_window_xml, convert_names[i]);
+ g_signal_connect ((gpointer)w,
+ "toggled",
+ G_CALLBACK (on_convert_toggle_toggled),
+ NULL);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(w), prefs_get_int
(convert_names[i]) );
+
+ }
+
prefs_window_show_hide_tooltips ();
gtk_widget_show(prefs_window);
+
+
+
}
@@ -1064,6 +1118,45 @@
gtk_toggle_button_get_active (togglebutton));
}
+static void on_convert_toggle_toggled (GtkToggleButton *togglebutton,
+ gpointer not_used)
+{
+ GtkTable *parent;
+ GList *list_item;
+ GtkTableChild *child;
+ guint16 row = 0;
+ gboolean active;
+
+ parent = (GtkTable*)gtk_widget_get_parent (GTK_WIDGET (togglebutton));
+ g_return_if_fail (GTK_IS_TABLE (parent));
+
+ /* Find row of togglebutton */
+ list_item = parent->children;
+ while (list_item) {
+ child = (GtkTableChild*)list_item->data;
+ if (child->widget == (GtkWidget*)togglebutton) {
+ row = child->top_attach;
+ break;
+ }
+ list_item = g_list_next (list_item);
+ }
+
+ active = gtk_toggle_button_get_active (togglebutton);
+
+ temp_prefs_set_int (temp_prefs, gtk_widget_get_name (GTK_WIDGET
(togglebutton)),
+ active);
+
+ /* set sensitivity of all widgets on togglebuttons row, except
togglebutton */
+ list_item = parent->children;
+ while (list_item) {
+ child = (GtkTableChild*)list_item->data;
+ if (child->top_attach == row && child->widget !=
(GtkWidget*)togglebutton)
+ gtk_widget_set_sensitive (child->widget, active);
+ list_item = g_list_next (list_item);
+ }
+}
+
+
void
on_sync_confirm_delete_toggled (GtkToggleButton *togglebutton,
gpointer user_data)
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2