From 807e7e083170918a7a8e7bfc28edf3baa0456e8b Mon Sep 17 00:00:00 2001 From: waker Date: Tue, 28 Dec 2010 13:02:42 +0100 Subject: fixed few bugs in converter gui; added abort functionality to converter --- plugins/converter/converter.c | 73 ++++++++++++++++++++++++++----------------- plugins/converter/converter.h | 2 +- plugins/gtkui/convgui.c | 35 ++++++++++++++------- 3 files changed, 69 insertions(+), 41 deletions(-) diff --git a/plugins/converter/converter.c b/plugins/converter/converter.c index c66c3ee1..d1fef88b 100644 --- a/plugins/converter/converter.c +++ b/plugins/converter/converter.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "converter.h" #include @@ -104,7 +105,7 @@ encoder_preset_load (const char *fname) { } err = 0; -error: + if (err) { encoder_preset_free (p); p = NULL; @@ -543,36 +544,35 @@ dsp_preset_replace (ddb_dsp_preset_t *from, ddb_dsp_preset_t *to) { } int -convert (DB_playItem_t *it, const char *outfolder, int selected_format, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset) { +convert (DB_playItem_t *it, const char *outfolder, int selected_format, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) { + int err = -1; + FILE *enc_pipe = NULL; + FILE *temp_file = NULL; DB_decoder_t *dec = NULL; + DB_fileinfo_t *fileinfo = NULL; + char out[1024] = ""; // full path to output file dec = (DB_decoder_t *)deadbeef->plug_get_for_id (it->decoder_id); if (dec) { - DB_fileinfo_t *fileinfo = dec->open (0); + fileinfo = dec->open (0); if (fileinfo && dec->init (fileinfo, DB_PLAYITEM (it)) != 0) { - dec->free (fileinfo); - fileinfo = NULL; + fprintf (stderr, "converter: decoder->init failed\n"); + goto error; } if (fileinfo) { char fname[1024]; int idx = deadbeef->pl_get_idx_of (it); deadbeef->pl_format_title (it, idx, fname, sizeof (fname), -1, encoder_preset->fname); - char out[1024]; snprintf (out, sizeof (out), "%s/%s", outfolder, fname); char enc[1024]; snprintf (enc, sizeof (enc), encoder_preset->encoder, out); fprintf (stderr, "executing: %s\n", enc); - FILE *enc_pipe = NULL; - FILE *temp_file = NULL; if (!encoder_preset->encoder[0]) { // write to wave file temp_file = fopen (out, "w+b"); if (!temp_file) { fprintf (stderr, "converter: failed to open output wave file %s\n", out); - if (fileinfo) { - dec->free (fileinfo); - } - return -1; + goto error; } } else if (encoder_preset->method == DDB_ENCODER_METHOD_FILE) { @@ -580,23 +580,14 @@ convert (DB_playItem_t *it, const char *outfolder, int selected_format, ddb_enco temp_file = fopen (temp_file_name, "w+b"); if (!temp_file) { fprintf (stderr, "converter: failed to open temp file %s\n", temp_file_name); - if (fileinfo) { - dec->free (fileinfo); - } - return -1; + goto error; } } else { enc_pipe = popen (enc, "w"); if (!enc_pipe) { fprintf (stderr, "converter: failed to open encoder\n"); - if (temp_file) { - fclose (temp_file); - } - if (fileinfo) { - dec->free (fileinfo); - } - return -1; + goto error; } } @@ -634,6 +625,9 @@ convert (DB_playItem_t *it, const char *outfolder, int selected_format, ddb_enco if (eof) { break; } + if (abort && *abort) { + break; + } int sz = dec->read (fileinfo, buffer, bs); if (sz != bs) { @@ -704,23 +698,44 @@ convert (DB_playItem_t *it, const char *outfolder, int selected_format, ddb_enco header_written = 1; } - fwrite (buffer, 1, sz, temp_file); + if (sz != fwrite (buffer, 1, sz, temp_file)) { + fprintf (stderr, "\033[0;31mwrite error\033[37;0m\n"); + goto error; + } + } + if (abort && *abort) { + goto error; } if (temp_file && temp_file != enc_pipe) { fclose (temp_file); + temp_file = NULL; } if (encoder_preset->encoder[0] && encoder_preset->method == DDB_ENCODER_METHOD_FILE) { enc_pipe = popen (enc, "w"); } - if (enc_pipe) { - pclose (enc_pipe); - } - dec->free (fileinfo); } } - return 0; + err = 0; +error: + if (temp_file && temp_file != enc_pipe) { + fclose (temp_file); + temp_file = NULL; + } + if (enc_pipe) { + pclose (enc_pipe); + enc_pipe = NULL; + } + if (dec && fileinfo) { + dec->free (fileinfo); + fileinfo = NULL; + } + if (abort && *abort && out[0]) { + unlink (out); + } + + return err; } int diff --git a/plugins/converter/converter.h b/plugins/converter/converter.h index 60677b1e..3ea46a2e 100644 --- a/plugins/converter/converter.h +++ b/plugins/converter/converter.h @@ -133,7 +133,7 @@ typedef struct { ///////////////////////////// int - (*convert) (DB_playItem_t *it, const char *outfolder, int selected_format, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset); + (*convert) (DB_playItem_t *it, const char *outfolder, int selected_format, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort); } ddb_converter_t; diff --git a/plugins/gtkui/convgui.c b/plugins/gtkui/convgui.c index 80eddfeb..33cbd08d 100644 --- a/plugins/gtkui/convgui.c +++ b/plugins/gtkui/convgui.c @@ -28,6 +28,8 @@ #include "gtkui.h" #include "pluginconf.h" +#pragma GCC optimize("O0") + ddb_converter_t *converter_plugin; typedef struct { @@ -66,18 +68,24 @@ on_converter_progress_cancel (GtkDialog *dialog, gint response_id, gpointer user ctx->cancelled = 1; } +typedef struct { + GtkWidget *entry; + char *text; +} update_progress_info_t; + static gboolean update_progress_cb (gpointer ctx) { - converter_ctx_t *conv = ctx; - gtk_entry_set_text (GTK_ENTRY (conv->progress_entry), conv->progress_text); - free (conv->progress_text); + update_progress_info_t *info = ctx; + gtk_entry_set_text (GTK_ENTRY (info->entry), info->text); + free (info->text); + g_object_unref (info->entry); + free (info); return FALSE; } static gboolean destroy_progress_cb (gpointer ctx) { - converter_ctx_t *conv = ctx; - gtk_widget_destroy (conv->progress); + gtk_widget_destroy (ctx); return FALSE; } @@ -86,16 +94,19 @@ converter_worker (void *ctx) { converter_ctx_t *conv = ctx; for (int n = 0; n < conv->convert_items_count; n++) { - conv->progress_text = strdup (conv->convert_items[n]->fname); - g_idle_add (update_progress_cb, conv); + update_progress_info_t *info = malloc (sizeof (update_progress_info_t)); + info->entry = conv->progress_entry; + g_object_ref (info->entry); + info->text = strdup (conv->convert_items[n]->fname); + g_idle_add (update_progress_cb, info); - converter_plugin->convert (conv->convert_items[n], conv->outfolder, conv->selected_format, conv->encoder_preset, conv->dsp_preset); + converter_plugin->convert (conv->convert_items[n], conv->outfolder, conv->selected_format, conv->encoder_preset, conv->dsp_preset, &conv->cancelled); deadbeef->pl_item_unref (conv->convert_items[n]); if (conv->cancelled) { break; } } - g_idle_add (destroy_progress_cb, ctx); + g_idle_add (destroy_progress_cb, conv->progress); if (conv->convert_items) { free (conv->convert_items); } @@ -226,17 +237,19 @@ converter_show (void) { int response = gtk_dialog_run (GTK_DIALOG (conv->converter)); if (response == GTK_RESPONSE_OK) { converter_process (conv); + gtk_widget_destroy (conv->converter); } else { + // FIXME: clean up properly + gtk_widget_destroy (conv->converter); if (conv->convert_items) { for (int n = 0; n < conv->convert_items_count; n++) { deadbeef->pl_item_unref (conv->convert_items[n]); } free (conv->convert_items); } + free (conv); } - gtk_widget_destroy (conv->converter); - free (conv); } void -- cgit v1.2.3