summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2010-12-28 13:02:42 +0100
committerGravatar waker <wakeroid@gmail.com>2010-12-28 13:02:42 +0100
commit807e7e083170918a7a8e7bfc28edf3baa0456e8b (patch)
treef6a9aa1cf6a8cea44b4ab6eb82cb20925ddeef78
parentad072a13964e24e5592956e1ff4da2c7685daa4d (diff)
fixed few bugs in converter gui;
added abort functionality to converter
-rw-r--r--plugins/converter/converter.c73
-rw-r--r--plugins/converter/converter.h2
-rw-r--r--plugins/gtkui/convgui.c35
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 <string.h>
#include <sys/stat.h>
#include <dirent.h>
+#include <unistd.h>
#include "converter.h"
#include <deadbeef.h>
@@ -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