diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2010-03-31 12:15:04 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2010-03-31 12:15:04 +0200 |
commit | d528a3051f1f4f1fc9e24fb5442158b28341f750 (patch) | |
tree | 63a9f9a9a7a1e92d767e148bcf95eead6638d738 | |
parent | 15423d482c3db70356c9a8cfcf858eb00911efcd (diff) |
metadata writing infrastructure
-rw-r--r-- | deadbeef.h | 3 | ||||
-rw-r--r-- | plugins/gtkui/callbacks.h | 48 | ||||
-rw-r--r-- | plugins/gtkui/deadbeef.glade | 212 | ||||
-rw-r--r-- | plugins/gtkui/interface.c | 133 | ||||
-rw-r--r-- | plugins/gtkui/prefwin.c | 127 | ||||
-rw-r--r-- | plugins/gtkui/trkproperties.c | 37 | ||||
-rw-r--r-- | plugins/mpgmad/mpgmad.c | 14 |
7 files changed, 434 insertions, 140 deletions
@@ -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 }; |