summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-03-31 12:15:04 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-03-31 12:15:04 +0200
commitd528a3051f1f4f1fc9e24fb5442158b28341f750 (patch)
tree63a9f9a9a7a1e92d767e148bcf95eead6638d738
parent15423d482c3db70356c9a8cfcf858eb00911efcd (diff)
metadata writing infrastructure
-rw-r--r--deadbeef.h3
-rw-r--r--plugins/gtkui/callbacks.h48
-rw-r--r--plugins/gtkui/deadbeef.glade212
-rw-r--r--plugins/gtkui/interface.c133
-rw-r--r--plugins/gtkui/prefwin.c127
-rw-r--r--plugins/gtkui/trkproperties.c37
-rw-r--r--plugins/mpgmad/mpgmad.c14
7 files changed, 434 insertions, 140 deletions
diff --git a/deadbeef.h b/deadbeef.h
index 89f7361e..d7434d02 100644
--- a/deadbeef.h
+++ b/deadbeef.h
@@ -505,7 +505,6 @@ typedef struct DB_fileinfo_s {
// decoder plugin
typedef struct DB_decoder_s {
DB_plugin_t plugin;
-// DB_fileinfo_t info;
// init is called to prepare song to be started
DB_fileinfo_t *(*init) (DB_playItem_t *it);
@@ -536,6 +535,8 @@ typedef struct DB_decoder_s {
int (*numvoices) (DB_fileinfo_t *info);
void (*mutevoice) (DB_fileinfo_t *info, int voice, int mute);
+ int (*write_metadata) (DB_playItem_t *it);
+
// NULL terminated array of all supported extensions
const char **exts;
diff --git a/plugins/gtkui/callbacks.h b/plugins/gtkui/callbacks.h
index d8b11651..1ed7dc72 100644
--- a/plugins/gtkui/callbacks.h
+++ b/plugins/gtkui/callbacks.h
@@ -781,3 +781,51 @@ on_toggle_eq (GtkMenuItem *menuitem,
void
on_write_tags_clicked (GtkButton *button,
gpointer user_data);
+
+void
+on_write_id3v2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_write_id3v1_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_write_apev2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_strip_id3v2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_strip_id3v1_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_strip_apev2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_id3v2_version_changed (GtkComboBox *combobox,
+ gpointer user_data);
+
+void
+on_id3v1_encoding_changed (GtkEditable *editable,
+ gpointer user_data);
+
+void
+on_ape_write_id3v2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_ape_write_apev2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_ape_strip_id3v2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_ape_strip_apev2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
diff --git a/plugins/gtkui/deadbeef.glade b/plugins/gtkui/deadbeef.glade
index d9859ef0..268080a5 100644
--- a/plugins/gtkui/deadbeef.glade
+++ b/plugins/gtkui/deadbeef.glade
@@ -1297,6 +1297,110 @@
<property name="enable_popup">False</property>
<child>
+ <widget class="GtkVBox" id="vbox16">
+ <property name="border_width">12</property>
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow5">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="metalist">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">True</property>
+ <property name="rules_hint">True</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ <property name="fixed_height_mode">False</property>
+ <property name="hover_selection">False</property>
+ <property name="hover_expand">False</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHButtonBox" id="hbuttonbox1">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <property name="spacing">0</property>
+
+ <child>
+ <widget class="GtkButton" id="write_tags">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Write</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="on_write_tags_clicked" last_modification_time="Sat, 27 Mar 2010 20:48:33 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="button4">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Close</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="tab_expand">False</property>
+ <property name="tab_fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="label64">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Full</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="type">tab</property>
+ </packing>
+ </child>
+
+ <child>
<widget class="GtkVBox" id="vbox13">
<property name="border_width">12</property>
<property name="visible">True</property>
@@ -1844,7 +1948,7 @@
<property name="visible">True</property>
<property name="can_default">True</property>
<property name="can_focus">True</property>
- <property name="label" translatable="yes">Write</property>
+ <property name="label" translatable="yes">Close</property>
<property name="use_underline">True</property>
<property name="relief">GTK_RELIEF_NORMAL</property>
<property name="focus_on_click">True</property>
@@ -1886,98 +1990,6 @@
<property name="type">tab</property>
</packing>
</child>
-
- <child>
- <widget class="GtkVBox" id="vbox16">
- <property name="border_width">12</property>
- <property name="visible">True</property>
- <property name="homogeneous">False</property>
- <property name="spacing">8</property>
-
- <child>
- <widget class="GtkScrolledWindow" id="scrolledwindow5">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
- <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
-
- <child>
- <widget class="GtkTreeView" id="metalist">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="headers_visible">True</property>
- <property name="rules_hint">True</property>
- <property name="reorderable">False</property>
- <property name="enable_search">True</property>
- <property name="fixed_height_mode">False</property>
- <property name="hover_selection">False</property>
- <property name="hover_expand">False</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
- <property name="fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkHButtonBox" id="hbuttonbox1">
- <property name="visible">True</property>
- <property name="layout_style">GTK_BUTTONBOX_END</property>
- <property name="spacing">0</property>
-
- <child>
- <widget class="GtkButton" id="write_tags">
- <property name="visible">True</property>
- <property name="can_default">True</property>
- <property name="can_focus">True</property>
- <property name="label" translatable="yes">Write</property>
- <property name="use_underline">True</property>
- <property name="relief">GTK_RELIEF_NORMAL</property>
- <property name="focus_on_click">True</property>
- <signal name="clicked" handler="on_write_tags_clicked" last_modification_time="Sat, 27 Mar 2010 20:48:33 GMT"/>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="padding">0</property>
- <property name="expand">False</property>
- <property name="fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="tab_expand">False</property>
- <property name="tab_fill">True</property>
- </packing>
- </child>
-
- <child>
- <widget class="GtkLabel" id="label64">
- <property name="visible">True</property>
- <property name="label" translatable="yes">Full</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
- <property name="xalign">0.5</property>
- <property name="yalign">0.5</property>
- <property name="xpad">0</property>
- <property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
</widget>
</child>
</widget>
@@ -3737,6 +3749,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_write_id3v2_toggled" last_modification_time="Tue, 30 Mar 2010 20:43:51 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -3756,6 +3769,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_write_id3v1_toggled" last_modification_time="Tue, 30 Mar 2010 20:43:55 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -3775,6 +3789,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_write_apev2_toggled" last_modification_time="Tue, 30 Mar 2010 20:43:59 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -3807,6 +3822,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_strip_id3v2_toggled" last_modification_time="Tue, 30 Mar 2010 20:44:03 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -3826,6 +3842,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_strip_id3v1_toggled" last_modification_time="Tue, 30 Mar 2010 20:44:07 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -3845,6 +3862,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_strip_apev2_toggled" last_modification_time="Tue, 30 Mar 2010 20:44:12 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -3898,6 +3916,7 @@ SOCKS5_HOSTNAME</property>
2.4</property>
<property name="add_tearoffs">False</property>
<property name="focus_on_click">True</property>
+ <signal name="changed" handler="on_id3v2_version_changed" last_modification_time="Tue, 30 Mar 2010 20:44:27 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -3922,7 +3941,7 @@ SOCKS5_HOSTNAME</property>
<child>
<widget class="GtkLabel" id="label71">
<property name="visible">True</property>
- <property name="label" translatable="yes">ID3v1 character encoding (default is ISO-8859-1)</property>
+ <property name="label" translatable="yes">ID3v1 character encoding (default is iso8859-1)</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -3955,6 +3974,7 @@ SOCKS5_HOSTNAME</property>
<property name="has_frame">True</property>
<property name="invisible_char">●</property>
<property name="activates_default">False</property>
+ <signal name="changed" handler="on_id3v1_encoding_changed" last_modification_time="Tue, 30 Mar 2010 20:44:34 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -4047,6 +4067,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_ape_write_id3v2_toggled" last_modification_time="Tue, 30 Mar 2010 20:44:42 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -4066,6 +4087,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_ape_write_apev2_toggled" last_modification_time="Tue, 30 Mar 2010 20:44:46 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -4098,6 +4120,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_ape_strip_id3v2_toggled" last_modification_time="Tue, 30 Mar 2010 20:44:50 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -4117,6 +4140,7 @@ SOCKS5_HOSTNAME</property>
<property name="active">False</property>
<property name="inconsistent">False</property>
<property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_ape_strip_apev2_toggled" last_modification_time="Tue, 30 Mar 2010 20:44:54 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
diff --git a/plugins/gtkui/interface.c b/plugins/gtkui/interface.c
index e82a7e3a..9bd0cbee 100644
--- a/plugins/gtkui/interface.c
+++ b/plugins/gtkui/interface.c
@@ -1079,6 +1079,13 @@ create_trackproperties (void)
{
GtkWidget *trackproperties;
GtkWidget *notebook3;
+ GtkWidget *vbox16;
+ GtkWidget *scrolledwindow5;
+ GtkWidget *metalist;
+ GtkWidget *hbuttonbox1;
+ GtkWidget *write_tags;
+ GtkWidget *button4;
+ GtkWidget *label64;
GtkWidget *vbox13;
GtkWidget *hbox23;
GtkWidget *label27;
@@ -1110,12 +1117,6 @@ create_trackproperties (void)
GtkWidget *hbuttonbox2;
GtkWidget *button3;
GtkWidget *label65;
- GtkWidget *vbox16;
- GtkWidget *scrolledwindow5;
- GtkWidget *metalist;
- GtkWidget *hbuttonbox1;
- GtkWidget *write_tags;
- GtkWidget *label64;
trackproperties = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (trackproperties), "Track Properties");
@@ -1127,6 +1128,41 @@ create_trackproperties (void)
gtk_widget_show (notebook3);
gtk_container_add (GTK_CONTAINER (trackproperties), notebook3);
+ vbox16 = gtk_vbox_new (FALSE, 8);
+ gtk_widget_show (vbox16);
+ gtk_container_add (GTK_CONTAINER (notebook3), vbox16);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox16), 12);
+
+ scrolledwindow5 = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (scrolledwindow5);
+ gtk_box_pack_start (GTK_BOX (vbox16), scrolledwindow5, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_SHADOW_IN);
+
+ metalist = gtk_tree_view_new ();
+ gtk_widget_show (metalist);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow5), metalist);
+ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (metalist), TRUE);
+
+ hbuttonbox1 = gtk_hbutton_box_new ();
+ gtk_widget_show (hbuttonbox1);
+ gtk_box_pack_start (GTK_BOX (vbox16), hbuttonbox1, FALSE, FALSE, 0);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END);
+
+ write_tags = gtk_button_new_with_mnemonic ("Write");
+ gtk_widget_show (write_tags);
+ gtk_container_add (GTK_CONTAINER (hbuttonbox1), write_tags);
+ GTK_WIDGET_SET_FLAGS (write_tags, GTK_CAN_DEFAULT);
+
+ button4 = gtk_button_new_with_mnemonic ("Close");
+ gtk_widget_show (button4);
+ gtk_container_add (GTK_CONTAINER (hbuttonbox1), button4);
+ GTK_WIDGET_SET_FLAGS (button4, GTK_CAN_DEFAULT);
+
+ label64 = gtk_label_new ("Full");
+ gtk_widget_show (label64);
+ gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook3), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook3), 0), label64);
+
vbox13 = gtk_vbox_new (FALSE, 8);
gtk_widget_show (vbox13);
gtk_container_add (GTK_CONTAINER (notebook3), vbox13);
@@ -1285,44 +1321,14 @@ create_trackproperties (void)
gtk_box_pack_start (GTK_BOX (vbox13), hbuttonbox2, TRUE, TRUE, 0);
gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox2), GTK_BUTTONBOX_END);
- button3 = gtk_button_new_with_mnemonic ("Write");
+ button3 = gtk_button_new_with_mnemonic ("Close");
gtk_widget_show (button3);
gtk_container_add (GTK_CONTAINER (hbuttonbox2), button3);
GTK_WIDGET_SET_FLAGS (button3, GTK_CAN_DEFAULT);
label65 = gtk_label_new ("Summary");
gtk_widget_show (label65);
- gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook3), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook3), 0), label65);
-
- vbox16 = gtk_vbox_new (FALSE, 8);
- gtk_widget_show (vbox16);
- gtk_container_add (GTK_CONTAINER (notebook3), vbox16);
- gtk_container_set_border_width (GTK_CONTAINER (vbox16), 12);
-
- scrolledwindow5 = gtk_scrolled_window_new (NULL, NULL);
- gtk_widget_show (scrolledwindow5);
- gtk_box_pack_start (GTK_BOX (vbox16), scrolledwindow5, TRUE, TRUE, 0);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_SHADOW_IN);
-
- metalist = gtk_tree_view_new ();
- gtk_widget_show (metalist);
- gtk_container_add (GTK_CONTAINER (scrolledwindow5), metalist);
- gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (metalist), TRUE);
-
- hbuttonbox1 = gtk_hbutton_box_new ();
- gtk_widget_show (hbuttonbox1);
- gtk_box_pack_start (GTK_BOX (vbox16), hbuttonbox1, FALSE, FALSE, 0);
- gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END);
-
- write_tags = gtk_button_new_with_mnemonic ("Write");
- gtk_widget_show (write_tags);
- gtk_container_add (GTK_CONTAINER (hbuttonbox1), write_tags);
- GTK_WIDGET_SET_FLAGS (write_tags, GTK_CAN_DEFAULT);
-
- label64 = gtk_label_new ("Full");
- gtk_widget_show (label64);
- gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook3), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook3), 1), label64);
+ gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook3), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook3), 1), label65);
g_signal_connect ((gpointer) trackproperties, "key_press_event",
G_CALLBACK (on_trackproperties_key_press_event),
@@ -1337,6 +1343,13 @@ create_trackproperties (void)
/* Store pointers to all widgets, for use by lookup_widget(). */
GLADE_HOOKUP_OBJECT_NO_REF (trackproperties, trackproperties, "trackproperties");
GLADE_HOOKUP_OBJECT (trackproperties, notebook3, "notebook3");
+ GLADE_HOOKUP_OBJECT (trackproperties, vbox16, "vbox16");
+ GLADE_HOOKUP_OBJECT (trackproperties, scrolledwindow5, "scrolledwindow5");
+ GLADE_HOOKUP_OBJECT (trackproperties, metalist, "metalist");
+ GLADE_HOOKUP_OBJECT (trackproperties, hbuttonbox1, "hbuttonbox1");
+ GLADE_HOOKUP_OBJECT (trackproperties, write_tags, "write_tags");
+ GLADE_HOOKUP_OBJECT (trackproperties, button4, "button4");
+ GLADE_HOOKUP_OBJECT (trackproperties, label64, "label64");
GLADE_HOOKUP_OBJECT (trackproperties, vbox13, "vbox13");
GLADE_HOOKUP_OBJECT (trackproperties, hbox23, "hbox23");
GLADE_HOOKUP_OBJECT (trackproperties, label27, "label27");
@@ -1368,12 +1381,6 @@ create_trackproperties (void)
GLADE_HOOKUP_OBJECT (trackproperties, hbuttonbox2, "hbuttonbox2");
GLADE_HOOKUP_OBJECT (trackproperties, button3, "button3");
GLADE_HOOKUP_OBJECT (trackproperties, label65, "label65");
- GLADE_HOOKUP_OBJECT (trackproperties, vbox16, "vbox16");
- GLADE_HOOKUP_OBJECT (trackproperties, scrolledwindow5, "scrolledwindow5");
- GLADE_HOOKUP_OBJECT (trackproperties, metalist, "metalist");
- GLADE_HOOKUP_OBJECT (trackproperties, hbuttonbox1, "hbuttonbox1");
- GLADE_HOOKUP_OBJECT (trackproperties, write_tags, "write_tags");
- GLADE_HOOKUP_OBJECT (trackproperties, label64, "label64");
return trackproperties;
}
@@ -2115,7 +2122,7 @@ create_prefwin (void)
gtk_widget_show (hbox39);
gtk_box_pack_start (GTK_BOX (vbox19), hbox39, TRUE, TRUE, 0);
- label71 = gtk_label_new ("ID3v1 character encoding (default is ISO-8859-1)");
+ label71 = gtk_label_new ("ID3v1 character encoding (default is iso8859-1)");
gtk_widget_show (label71);
gtk_box_pack_start (GTK_BOX (hbox39), label71, FALSE, FALSE, 0);
@@ -2342,6 +2349,42 @@ create_prefwin (void)
g_signal_connect ((gpointer) pref_network_proxytype, "changed",
G_CALLBACK (on_pref_network_proxytype_changed),
NULL);
+ g_signal_connect ((gpointer) write_id3v2, "toggled",
+ G_CALLBACK (on_write_id3v2_toggled),
+ NULL);
+ g_signal_connect ((gpointer) write_id3v1, "toggled",
+ G_CALLBACK (on_write_id3v1_toggled),
+ NULL);
+ g_signal_connect ((gpointer) write_apev2, "toggled",
+ G_CALLBACK (on_write_apev2_toggled),
+ NULL);
+ g_signal_connect ((gpointer) strip_id3v2, "toggled",
+ G_CALLBACK (on_strip_id3v2_toggled),
+ NULL);
+ g_signal_connect ((gpointer) strip_id3v1, "toggled",
+ G_CALLBACK (on_strip_id3v1_toggled),
+ NULL);
+ g_signal_connect ((gpointer) strip_apev2, "toggled",
+ G_CALLBACK (on_strip_apev2_toggled),
+ NULL);
+ g_signal_connect ((gpointer) id3v2_version, "changed",
+ G_CALLBACK (on_id3v2_version_changed),
+ NULL);
+ g_signal_connect ((gpointer) id3v1_encoding, "changed",
+ G_CALLBACK (on_id3v1_encoding_changed),
+ NULL);
+ g_signal_connect ((gpointer) ape_write_id3v2, "toggled",
+ G_CALLBACK (on_ape_write_id3v2_toggled),
+ NULL);
+ g_signal_connect ((gpointer) ape_write_apev2, "toggled",
+ G_CALLBACK (on_ape_write_apev2_toggled),
+ NULL);
+ g_signal_connect ((gpointer) ape_strip_id3v2, "toggled",
+ G_CALLBACK (on_ape_strip_id3v2_toggled),
+ NULL);
+ g_signal_connect ((gpointer) ape_strip_apev2, "toggled",
+ G_CALLBACK (on_ape_strip_apev2_toggled),
+ NULL);
g_signal_connect ((gpointer) pref_pluginlist, "cursor_changed",
G_CALLBACK (on_pref_pluginlist_cursor_changed),
NULL);
diff --git a/plugins/gtkui/prefwin.c b/plugins/gtkui/prefwin.c
index 37d2afd0..741a6414 100644
--- a/plugins/gtkui/prefwin.c
+++ b/plugins/gtkui/prefwin.c
@@ -428,6 +428,32 @@ on_preferences_activate (GtkMenuItem *menuitem,
g_signal_connect ((gpointer)lookup_widget (prefwin, "removehotkey"), "clicked", G_CALLBACK (on_removehotkey_clicked), hktree);
g_signal_connect ((gpointer)lookup_widget (prefwin, "applyhotkeys"), "clicked", G_CALLBACK (on_applyhotkeys_clicked), hkstore);
+ // tag writer
+ int strip_id3v2 = deadbeef->conf_get_int ("mp3.strip_id3v2", 0);
+ int strip_id3v1 = deadbeef->conf_get_int ("mp3.strip_id3v1", 0);
+ int strip_apev2 = deadbeef->conf_get_int ("mp3.strip_apev2", 0);
+ int write_id3v2 = deadbeef->conf_get_int ("mp3.write_id3v2", 1);
+ int write_id3v1 = deadbeef->conf_get_int ("mp3.write_id3v1", 0);
+ int write_apev2 = deadbeef->conf_get_int ("mp3.write_apev2", 1);
+ int id3v2_version = deadbeef->conf_get_int ("mp3.id3v2_version", 3);
+ const char *id3v1_encoding = deadbeef->conf_get_str ("mp3.id3v1_encoding", "iso8859-1");
+ int ape_strip_id3v2 = deadbeef->conf_get_int ("ape.strip_id3v2", 0);
+ int ape_strip_apev2 = deadbeef->conf_get_int ("ape.strip_apev2", 0);
+ int ape_write_id3v2 = deadbeef->conf_get_int ("ape.write_id3v2", 0);
+ int ape_write_apev2 = deadbeef->conf_get_int ("ape.write_apev2", 1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "strip_id3v2")), strip_id3v2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "strip_id3v1")), strip_id3v1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "strip_apev2")), strip_apev2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "write_id3v2")), write_id3v2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "write_id3v1")), write_id3v1);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "write_apev2")), write_apev2);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (lookup_widget (prefwin, "id3v2_version")), id3v2_version != 4 ? 0 : 1);
+ gtk_entry_set_text (GTK_ENTRY (lookup_widget (prefwin, "id3v1_encoding")), id3v1_encoding);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "ape_strip_id3v2")), ape_strip_id3v2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "ape_strip_apev2")), ape_strip_apev2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "ape_write_apev2")), ape_write_apev2);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (prefwin, "ape_write_id3v2")), ape_write_id3v2);
+
gtk_dialog_run (GTK_DIALOG (prefwin));
gtk_widget_destroy (prefwin);
prefwin = NULL;
@@ -731,3 +757,104 @@ on_disable_playlist_theming_toggled (GtkToggleButton *togglebutton,
gtk_widget_set_sensitive (lookup_widget (prefwin, "listview_colors_table"), active);
deadbeef->sendmessage (M_CONFIGCHANGED, 0, 0, 0);
}
+
+void
+on_write_id3v2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("mp3.write_id3v2", gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_write_id3v1_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("mp3.write_id3v1", gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_write_apev2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("mp3.write_apev2", gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_strip_id3v2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("mp3.strip_id3v2", gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_strip_id3v1_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("mp3.strip_id3v1", gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_strip_apev2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("mp3.strip_apev2", gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_id3v2_version_changed (GtkComboBox *combobox,
+ gpointer user_data)
+{
+ int version = 3;
+ int active = gtk_combo_box_get_active (combobox);
+ if (active == 1) {
+ version = 4;
+ }
+ deadbeef->conf_set_int ("mp3.id3v2_version", version);
+}
+
+
+void
+on_id3v1_encoding_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ deadbeef->conf_set_str ("mp3.id3v1_encoding", gtk_entry_get_text (GTK_ENTRY (editable)));
+}
+
+
+void
+on_ape_write_id3v2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("ape.write_id3v2", gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_ape_write_apev2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("ape.write_apev2", gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_ape_strip_id3v2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("ape.strip_id3v2", gtk_toggle_button_get_active (togglebutton));
+}
+
+
+void
+on_ape_strip_apev2_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ deadbeef->conf_set_int ("ape.strip_apev2", gtk_toggle_button_get_active (togglebutton));
+}
+
diff --git a/plugins/gtkui/trkproperties.c b/plugins/gtkui/trkproperties.c
index f29faafa..2f8faa6c 100644
--- a/plugins/gtkui/trkproperties.c
+++ b/plugins/gtkui/trkproperties.c
@@ -73,6 +73,7 @@ show_track_properties_dlg (DB_playItem_t *it) {
deadbeef->pl_item_ref (it);
}
track = it;
+
if (!trackproperties) {
trackproperties = create_trackproperties ();
gtk_window_set_transient_for (GTK_WINDOW (trackproperties), GTK_WINDOW (mainwin));
@@ -190,6 +191,25 @@ show_track_properties_dlg (DB_playItem_t *it) {
}
deadbeef->pl_unlock ();
+ // get decoder plugin by id
+ DB_decoder_t *dec = NULL;
+ if (it->decoder_id) {
+ DB_decoder_t **decoders = deadbeef->plug_get_decoder_list ();
+ for (int i = 0; decoders[i]; i++) {
+ if (!strcmp (decoders[i]->plugin.id, it->decoder_id)) {
+ dec = decoders[i];
+ break;
+ }
+ }
+ }
+
+ if (dec && dec->write_metadata && deadbeef->conf_get_int ("enable_tag_writing", 0)) {
+ gtk_widget_set_sensitive (lookup_widget (widget, "write_tags"), TRUE);
+ }
+ else {
+ gtk_widget_set_sensitive (lookup_widget (widget, "write_tags"), FALSE);
+ }
+
gtk_widget_show (widget);
gtk_window_present (GTK_WINDOW (widget));
}
@@ -203,6 +223,22 @@ on_write_tags_clicked (GtkButton *button,
fprintf (stderr, "tag writing disabled\n");
return;
}
+ if (!track || !track->decoder_id) {
+ return;
+ }
+ // find decoder
+ DB_decoder_t *dec = NULL;
+ DB_decoder_t **decoders = deadbeef->plug_get_decoder_list ();
+ for (int i = 0; decoders[i]; i++) {
+ if (!strcmp (decoders[i]->plugin.id, track->decoder_id)) {
+ dec = decoders[i];
+ if (dec->write_metadata) {
+ dec->write_metadata (track);
+ }
+ break;
+ }
+ }
+#if 0
DB_id3v2_tag_t tag;
memset (&tag, 0, sizeof (tag));
DB_FILE *fp = deadbeef->fopen (track->fname);
@@ -285,5 +321,6 @@ error:
deadbeef->fclose (fp);
}
deadbeef->junk_free_id3v2 (&tag);
+#endif
}
diff --git a/plugins/mpgmad/mpgmad.c b/plugins/mpgmad/mpgmad.c
index 75d41644..c697bdf2 100644
--- a/plugins/mpgmad/mpgmad.c
+++ b/plugins/mpgmad/mpgmad.c
@@ -1166,6 +1166,19 @@ cmp3_insert (DB_playItem_t *after, const char *fname) {
return after;
}
+int
+cmp3_write_metadata (DB_playItem_t *it) {
+ // get options
+ int strip_id3v2 = deadbeef->conf_get_int ("mp3.strip_id3v2", 0);
+ int strip_id3v1 = deadbeef->conf_get_int ("mp3.strip_id3v2", 0);
+ int strip_apev2 = deadbeef->conf_get_int ("mp3.strip_apev2", 0);
+ int write_id3v2 = deadbeef->conf_get_int ("mp3.write_id3v2", 1);
+ int write_id3v1 = deadbeef->conf_get_int ("mp3.write_id3v1", 0);
+ int write_apev2 = deadbeef->conf_get_int ("mp3.write_apev2", 1);
+ int id3v2_version = deadbeef->conf_get_int ("mp3.id3v2_version", 3);
+ const char *id3v1_encoding = deadbeef->conf_get_str ("mp3.id3v1_encoding", "iso8859-1");
+}
+
static const char *exts[] = {
"mp1", "mp2", "mp3", NULL
};
@@ -1189,6 +1202,7 @@ static DB_decoder_t plugin = {
.seek = cmp3_seek,
.seek_sample = cmp3_seek_sample,
.insert = cmp3_insert,
+ .write_metadata = cmp3_write_metadata,
.exts = exts,
.filetypes = filetypes
};