summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2012-04-08 20:06:12 +0200
committerGravatar waker <wakeroid@gmail.com>2012-04-08 20:06:12 +0200
commitda6a525031fd2a8bb1577220c1a2191834edfcca (patch)
tree459818d840d4da14118e9fc713c7856679ee2fd1 /plugins
parenta8da758bc87d335036588644d3d03ca0418486ac (diff)
converter: added support for writing files to source track folders
Diffstat (limited to 'plugins')
-rw-r--r--plugins/converter/converter.c25
-rw-r--r--plugins/converter/converter.glade42
-rw-r--r--plugins/converter/converter.h9
-rw-r--r--plugins/converter/convgui.c38
-rw-r--r--plugins/converter/interface.c20
5 files changed, 94 insertions, 40 deletions
diff --git a/plugins/converter/converter.c b/plugins/converter/converter.c
index 3d571f64..4ffe4433 100644
--- a/plugins/converter/converter.c
+++ b/plugins/converter/converter.c
@@ -737,7 +737,7 @@ check_dir (const char *dir, mode_t mode)
}
int
-convert (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) {
+convert (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, int write_to_source_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) {
if (deadbeef->pl_get_item_duration (it) <= 0) {
deadbeef->pl_lock ();
const char *fname = deadbeef->pl_find_meta (it, ":URI");
@@ -774,8 +774,21 @@ convert (DB_playItem_t *it, const char *outfolder, const char *outfile, int outp
output_bps = fileinfo->fmt.bps;
output_is_float = fileinfo->fmt.is_float;
}
+ const char *outpath;
- get_output_path (it, preserve_folder_structure ? root_folder : outfolder, outfile, encoder_preset, out, sizeof (out));
+ if (write_to_source_folder) {
+ char *path = strdupa (deadbeef->pl_find_meta (it, ":URI"));
+ char *sep = strrchr (path, '/');
+ if (sep) {
+ *sep = 0;
+ }
+ outpath = path;
+ }
+ else {
+ outpath = preserve_folder_structure ? root_folder : outfolder;
+ }
+
+ get_output_path (it, outpath, outfile, encoder_preset, out, sizeof (out));
if (encoder_preset->method == DDB_ENCODER_METHOD_FILE) {
const char *tmp = getenv ("TMPDIR");
if (!tmp) {
@@ -1090,6 +1103,11 @@ error:
}
int
+convert_1_0 (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) {
+ return convert (it, outfolder, outfile, output_bps, output_is_float, preserve_folder_structure, root_folder, 0, encoder_preset, dsp_preset, abort);
+}
+
+int
converter_cmd (int cmd, ...) {
return -1;
}
@@ -1114,7 +1132,7 @@ static ddb_converter_t plugin = {
.misc.plugin.api_vmajor = 1,
.misc.plugin.api_vminor = 0,
.misc.plugin.version_major = 1,
- .misc.plugin.version_minor = 1,
+ .misc.plugin.version_minor = 2,
.misc.plugin.type = DB_PLUGIN_MISC,
.misc.plugin.name = "Converter",
.misc.plugin.id = "converter",
@@ -1162,6 +1180,7 @@ static ddb_converter_t plugin = {
.dsp_preset_remove = dsp_preset_remove,
.dsp_preset_replace = dsp_preset_replace,
.get_output_path = get_output_path,
+ .convert_1_0 = convert_1_0,
.convert = convert,
// 1.1 entry points
.load_encoder_presets = load_encoder_presets,
diff --git a/plugins/converter/converter.glade b/plugins/converter/converter.glade
index 521b1c2c..667dbcf8 100644
--- a/plugins/converter/converter.glade
+++ b/plugins/converter/converter.glade
@@ -162,6 +162,7 @@
<child>
<widget class="GtkCheckButton" id="write_to_source_folder">
+ <property name="visible">True</property>
<property name="can_focus">True</property>
<property name="label" translatable="yes">Write to source track folder</property>
<property name="use_underline">True</property>
@@ -170,7 +171,26 @@
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
- <signal name="toggled" handler="on_write_to_source_folder_toggled" last_modification_time="Sun, 08 Apr 2012 12:54:30 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="preserve_folders">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Preserve folder structure</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_preserve_folders_toggled" last_modification_time="Sun, 13 Mar 2011 12:34:49 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -620,26 +640,6 @@ Overwrite</property>
<property name="fill">True</property>
</packing>
</child>
-
- <child>
- <widget class="GtkCheckButton" id="preserve_folders">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Preserve folder structure</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <property name="active">False</property>
- <property name="inconsistent">False</property>
- <property name="draw_indicator">True</property>
- <signal name="toggled" handler="on_preserve_folders_toggled" last_modification_time="Sun, 13 Mar 2011 12:34:49 GMT"/>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
</widget>
<packing>
<property name="padding">0</property>
diff --git a/plugins/converter/converter.h b/plugins/converter/converter.h
index 19e3d172..1bad0449 100644
--- a/plugins/converter/converter.h
+++ b/plugins/converter/converter.h
@@ -142,8 +142,9 @@ typedef struct {
void
(*get_output_path) (DB_playItem_t *it, const char *outfolder, const char *outfile, ddb_encoder_preset_t *encoder_preset, char *out, int sz);
+ // this function is deprecated, please don't use directly
int
- (*convert) (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort);
+ (*convert_1_0) (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort);
/////////////////////////////
// new APIs for converter-1.1
@@ -157,6 +158,12 @@ typedef struct {
(*free_encoder_presets) (void);
void
(*free_dsp_presets) (void);
+
+ /////////////////////////////
+ // new APIs for converter-1.2
+ /////////////////////////////
+ int
+ (*convert) (DB_playItem_t *it, const char *outfolder, const char *outfile, int output_bps, int output_is_float, int preserve_folder_structure, const char *root_folder, int write_to_source_folder, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort);
} ddb_converter_t;
#endif
diff --git a/plugins/converter/convgui.c b/plugins/converter/convgui.c
index 2827c087..1a931ba0 100644
--- a/plugins/converter/convgui.c
+++ b/plugins/converter/convgui.c
@@ -178,7 +178,21 @@ converter_worker (void *ctx) {
}
}
- converter_plugin->get_output_path (conv->convert_items[n], conv->preserve_folder_structure ? outfolder_preserve : conv->outfolder, conv->outfile, conv->encoder_preset, outpath, sizeof (outpath));
+ const char *outfolder;
+
+ if (conv->write_to_source_folder) {
+ char *path = strdupa (info->text);
+ char *sep = strrchr (path, '/');
+ if (sep) {
+ *sep = 0;
+ }
+ outfolder = path;
+ }
+ else {
+ outfolder = conv->preserve_folder_structure ? outfolder_preserve : conv->outfolder;
+ }
+
+ converter_plugin->get_output_path (conv->convert_items[n], outfolder, conv->outfile, conv->encoder_preset, outpath, sizeof (outpath));
int skip = 0;
struct stat st;
@@ -211,7 +225,7 @@ converter_worker (void *ctx) {
}
if (!skip) {
- converter_plugin->convert (conv->convert_items[n], conv->outfolder, conv->outfile, conv->output_bps, conv->output_is_float, conv->preserve_folder_structure, outfolder_preserve, conv->encoder_preset, conv->dsp_preset, &conv->cancelled);
+ converter_plugin->convert (conv->convert_items[n], conv->outfolder, conv->outfile, conv->output_bps, conv->output_is_float, conv->preserve_folder_structure, outfolder_preserve, conv->write_to_source_folder, conv->encoder_preset, conv->dsp_preset, &conv->cancelled);
}
if (conv->cancelled) {
for (; n < conv->convert_items_count; n++) {
@@ -313,6 +327,10 @@ converter_process (converter_ctx_t *conv)
return 0;
}
+void
+on_write_to_source_folder_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
static gboolean
converter_show_cb (void *ctx) {
converter_ctx_t *conv = malloc (sizeof (converter_ctx_t));
@@ -347,7 +365,15 @@ converter_show_cb (void *ctx) {
gtk_entry_set_text (GTK_ENTRY (lookup_widget (conv->converter, "output_folder")), deadbeef->conf_get_str_fast ("converter.output_folder", ""));
gtk_entry_set_text (GTK_ENTRY (lookup_widget (conv->converter, "output_file")), deadbeef->conf_get_str_fast ("converter.output_file", ""));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (conv->converter, "preserve_folders")), deadbeef->conf_get_int ("converter.preserve_folder_structure", 0));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (conv->converter, "write_to_source_folder")), deadbeef->conf_get_int ("converter.write_to_source_folder", 0));
+ int write_to_source_folder = deadbeef->conf_get_int ("converter.write_to_source_folder", 0);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (conv->converter, "write_to_source_folder")), write_to_source_folder);
+
+ g_signal_connect ((gpointer) lookup_widget (conv->converter, "write_to_source_folder"), "toggled",
+ G_CALLBACK (on_write_to_source_folder_toggled),
+ conv);
+
+ gtk_widget_set_sensitive (lookup_widget (conv->converter, "output_folder"), !write_to_source_folder);
+ gtk_widget_set_sensitive (lookup_widget (conv->converter, "preserve_folders"), !write_to_source_folder);
gtk_combo_box_set_active (GTK_COMBO_BOX (lookup_widget (conv->converter, "overwrite_action")), deadbeef->conf_get_int ("converter.overwrite_action", 0));
deadbeef->conf_unlock ();
@@ -558,7 +584,11 @@ void
on_write_to_source_folder_toggled (GtkToggleButton *togglebutton,
gpointer user_data)
{
- deadbeef->conf_set_int ("converter.write_to_source_folder", gtk_toggle_button_get_active (togglebutton));
+ int active = gtk_toggle_button_get_active (togglebutton);
+ converter_ctx_t *conv = user_data;
+ deadbeef->conf_set_int ("converter.write_to_source_folder", active);
+ gtk_widget_set_sensitive (lookup_widget (conv->converter, "output_folder"), !active);
+ gtk_widget_set_sensitive (lookup_widget (conv->converter, "preserve_folders"), !active);
}
diff --git a/plugins/converter/interface.c b/plugins/converter/interface.c
index a24de750..dc17c11f 100644
--- a/plugins/converter/interface.c
+++ b/plugins/converter/interface.c
@@ -38,6 +38,7 @@ create_converterdlg (void)
GtkWidget *output_folder;
GtkWidget *converter_output_browse;
GtkWidget *write_to_source_folder;
+ GtkWidget *preserve_folders;
GtkWidget *hbox100;
GtkWidget *label122;
GtkWidget *hbox101;
@@ -65,7 +66,6 @@ create_converterdlg (void)
GtkWidget *hbox99;
GtkWidget *label121;
GtkWidget *overwrite_action;
- GtkWidget *preserve_folders;
GtkWidget *dialog_action_area5;
GtkWidget *converter_cancel;
GtkWidget *converter_ok;
@@ -107,8 +107,13 @@ create_converterdlg (void)
gtk_box_pack_start (GTK_BOX (hbox68), converter_output_browse, FALSE, FALSE, 0);
write_to_source_folder = gtk_check_button_new_with_mnemonic (_("Write to source track folder"));
+ gtk_widget_show (write_to_source_folder);
gtk_box_pack_start (GTK_BOX (vbox26), write_to_source_folder, FALSE, FALSE, 0);
+ preserve_folders = gtk_check_button_new_with_mnemonic (_("Preserve folder structure"));
+ gtk_widget_show (preserve_folders);
+ gtk_box_pack_start (GTK_BOX (vbox26), preserve_folders, FALSE, FALSE, 0);
+
hbox100 = gtk_hbox_new (FALSE, 8);
gtk_widget_show (hbox100);
gtk_box_pack_start (GTK_BOX (vbox26), hbox100, TRUE, TRUE, 0);
@@ -225,10 +230,6 @@ create_converterdlg (void)
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (overwrite_action), _("Prompt"));
gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (overwrite_action), _("Overwrite"));
- preserve_folders = gtk_check_button_new_with_mnemonic (_("Preserve folder structure"));
- gtk_widget_show (preserve_folders);
- gtk_box_pack_start (GTK_BOX (vbox26), preserve_folders, FALSE, FALSE, 0);
-
dialog_action_area5 = gtk_dialog_get_action_area (GTK_DIALOG (converterdlg));
gtk_widget_show (dialog_action_area5);
gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area5), GTK_BUTTONBOX_END);
@@ -249,8 +250,8 @@ create_converterdlg (void)
g_signal_connect ((gpointer) converter_output_browse, "clicked",
G_CALLBACK (on_converter_output_browse_clicked),
NULL);
- g_signal_connect ((gpointer) write_to_source_folder, "toggled",
- G_CALLBACK (on_write_to_source_folder_toggled),
+ g_signal_connect ((gpointer) preserve_folders, "toggled",
+ G_CALLBACK (on_preserve_folders_toggled),
NULL);
g_signal_connect ((gpointer) output_file, "changed",
G_CALLBACK (on_output_file_changed),
@@ -276,9 +277,6 @@ create_converterdlg (void)
g_signal_connect ((gpointer) overwrite_action, "changed",
G_CALLBACK (on_overwrite_action_changed),
NULL);
- g_signal_connect ((gpointer) preserve_folders, "toggled",
- G_CALLBACK (on_preserve_folders_toggled),
- NULL);
/* Store pointers to all widgets, for use by lookup_widget(). */
GLADE_HOOKUP_OBJECT_NO_REF (converterdlg, converterdlg, "converterdlg");
@@ -290,6 +288,7 @@ create_converterdlg (void)
GLADE_HOOKUP_OBJECT (converterdlg, output_folder, "output_folder");
GLADE_HOOKUP_OBJECT (converterdlg, converter_output_browse, "converter_output_browse");
GLADE_HOOKUP_OBJECT (converterdlg, write_to_source_folder, "write_to_source_folder");
+ GLADE_HOOKUP_OBJECT (converterdlg, preserve_folders, "preserve_folders");
GLADE_HOOKUP_OBJECT (converterdlg, hbox100, "hbox100");
GLADE_HOOKUP_OBJECT (converterdlg, label122, "label122");
GLADE_HOOKUP_OBJECT (converterdlg, hbox101, "hbox101");
@@ -316,7 +315,6 @@ create_converterdlg (void)
GLADE_HOOKUP_OBJECT (converterdlg, hbox99, "hbox99");
GLADE_HOOKUP_OBJECT (converterdlg, label121, "label121");
GLADE_HOOKUP_OBJECT (converterdlg, overwrite_action, "overwrite_action");
- GLADE_HOOKUP_OBJECT (converterdlg, preserve_folders, "preserve_folders");
GLADE_HOOKUP_OBJECT_NO_REF (converterdlg, dialog_action_area5, "dialog_action_area5");
GLADE_HOOKUP_OBJECT (converterdlg, converter_cancel, "converter_cancel");
GLADE_HOOKUP_OBJECT (converterdlg, converter_ok, "converter_ok");