mp3splt-gtk
special_split.c
Go to the documentation of this file.
00001 /**********************************************************
00002  *
00003  * mp3splt-gtk -- utility based on mp3splt,
00004  *                for mp3/ogg splitting without decoding
00005  *
00006  * Copyright: (C) 2005-2011 Alexandru Munteanu
00007  * Contact: io_fx@yahoo.fr
00008  *
00009  * http://mp3splt.sourceforge.net/
00010  *
00011  *********************************************************/
00012 
00013 /**********************************************************
00014  *
00015  * This program is free software; you can redistribute it and/or
00016  * modify it under the terms of the GNU General Public License
00017  * as published by the Free Software Foundation; either version 2
00018  * of the License, or (at your option) any later version.
00019  *
00020  * This program is distributed in the hope that it will be useful,
00021  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00022  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023  * GNU General Public License for more details.
00024  *
00025  * You should have received a copy of the GNU General Public License
00026  * along with this program; if not, write to the Free Software
00027  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
00028  * USA.
00029  *
00030  *********************************************************/
00031 
00032 /*!********************************************************
00033  * \file 
00034  * The batch processing tab
00035  *
00036  * this file is for the special split tab, where automatic
00037  * split modes can be selected
00038  *..*******************************************************/
00039 
00040 #include <gtk/gtk.h>
00041 #include <glib/gi18n.h>
00042 #include <libmp3splt/mp3splt.h>
00043 
00044 #include "special_split.h"
00045 #include "preferences_tab.h"
00046 #include "main_win.h"
00047 #include "multiple_files.h"
00048 
00049 GtkWidget *time_label = NULL;
00050 GtkWidget *spinner_time = NULL;
00051 
00052 GtkWidget *equal_tracks_label = NULL;
00053 GtkWidget *spinner_equal_tracks = NULL;
00054 
00055 gint selected_split_mode = SELECTED_SPLIT_NORMAL;
00056 gint split_file_mode = FILE_MODE_SINGLE;
00057 
00058 GtkWidget *split_mode_radio_button = NULL;
00059 GtkWidget *file_mode_radio_button = NULL;
00060 
00061 GtkWidget *multiple_files_component = NULL;
00062 
00063 GtkWidget *all_spinner_silence_number_tracks;
00064 GtkWidget *all_spinner_silence_minimum;
00065 GtkWidget *all_spinner_track_minimum;
00066 GtkWidget *all_spinner_silence_offset;
00067 GtkWidget *all_spinner_silence_threshold;
00068 GtkWidget *all_spinner_trim_silence_threshold;
00069 GtkWidget *all_silence_remove_silence;
00070 
00071 GtkWidget *all_threshold_label;
00072 GtkWidget *all_trim_threshold_label;
00073 GtkWidget *all_offset_label;
00074 GtkWidget *all_number_of_tracks_label;
00075 GtkWidget *all_min_silence_label;
00076 GtkWidget *all_min_track_label;
00077 
00079 static gint get_selected_split_mode(GtkToggleButton *radio_b)
00080 {
00081   GSList *radio_button_list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_b));
00082   gint selected = SELECTED_SPLIT_NORMAL;
00083 
00084   gint i = 0;
00085   for(i = 0; i < NUMBER_OF_SPLIT_MODES;i++)
00086   {
00087     GtkToggleButton *test = (GtkToggleButton *) g_slist_nth_data(radio_button_list,i);
00088     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(test)))
00089     {
00090       selected = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(test), "split_type_id"));
00091     }
00092   }
00093   
00094   return selected;
00095 }
00096 
00098 void select_split_mode(int split_mode)
00099 {
00100   GSList *split_mode_radio_button_list =
00101     gtk_radio_button_get_group(GTK_RADIO_BUTTON(split_mode_radio_button));
00102 
00103   gint i = 0;
00104   for(i = 0; i < NUMBER_OF_SPLIT_MODES;i++)
00105   {
00106     GtkToggleButton *test = (GtkToggleButton *) g_slist_nth_data(split_mode_radio_button_list, i);
00107     int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(test), "split_type_id"));
00108     if (split_mode == id)
00109     {
00110       gtk_toggle_button_set_active(test, TRUE);
00111       return;
00112     }
00113   }
00114 }
00115 
00116 void deactivate_silence_parameters()
00117 {
00118   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_silence_number_tracks), FALSE);
00119   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_silence_minimum), FALSE);
00120   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_track_minimum), FALSE);
00121   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_silence_offset), FALSE);
00122   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_silence_threshold), FALSE);
00123   gtk_widget_set_sensitive(GTK_WIDGET(all_silence_remove_silence), FALSE);
00124   gtk_widget_set_sensitive(GTK_WIDGET(all_threshold_label), FALSE);
00125   gtk_widget_set_sensitive(GTK_WIDGET(all_offset_label), FALSE);
00126   gtk_widget_set_sensitive(GTK_WIDGET(all_number_of_tracks_label), FALSE);
00127   gtk_widget_set_sensitive(GTK_WIDGET(all_min_silence_label), FALSE);
00128   gtk_widget_set_sensitive(GTK_WIDGET(all_min_track_label), FALSE);
00129 }
00130 
00131 void activate_silence_parameters()
00132 {
00133   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_silence_number_tracks), TRUE);
00134   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_silence_minimum), TRUE);
00135   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_track_minimum), TRUE);
00136   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_silence_offset), TRUE);
00137   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_silence_threshold), TRUE);
00138   gtk_widget_set_sensitive(GTK_WIDGET(all_silence_remove_silence), TRUE);
00139   gtk_widget_set_sensitive(GTK_WIDGET(all_threshold_label), TRUE);
00140   gtk_widget_set_sensitive(GTK_WIDGET(all_offset_label), TRUE);
00141   gtk_widget_set_sensitive(GTK_WIDGET(all_number_of_tracks_label), TRUE);
00142   gtk_widget_set_sensitive(GTK_WIDGET(all_min_silence_label), TRUE);
00143   gtk_widget_set_sensitive(GTK_WIDGET(all_min_track_label), TRUE);
00144 }
00145 
00146 void deactivate_trim_parameters()
00147 {
00148   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_trim_silence_threshold), FALSE);
00149   gtk_widget_set_sensitive(GTK_WIDGET(all_trim_threshold_label), FALSE);
00150 }
00151 
00152 void activate_trim_parameters()
00153 {
00154   gtk_widget_set_sensitive(GTK_WIDGET(all_spinner_trim_silence_threshold), TRUE);
00155   gtk_widget_set_sensitive(GTK_WIDGET(all_trim_threshold_label), TRUE);
00156 }
00157 
00159 void split_mode_changed(GtkToggleButton *radio_b, gpointer data)
00160 {
00161   selected_split_mode = get_selected_split_mode(radio_b);
00162 
00163   int enable_time = (selected_split_mode == SELECTED_SPLIT_TIME);
00164   gtk_widget_set_sensitive(GTK_WIDGET(spinner_time), enable_time);
00165   gtk_widget_set_sensitive(GTK_WIDGET(time_label), enable_time);
00166 
00167   int enable_split_equal_time = (selected_split_mode == SELECTED_SPLIT_EQUAL_TIME_TRACKS);
00168   gtk_widget_set_sensitive(GTK_WIDGET(spinner_equal_tracks), enable_split_equal_time);
00169   gtk_widget_set_sensitive(GTK_WIDGET(equal_tracks_label), enable_split_equal_time);
00170 
00171   if (selected_split_mode == SELECTED_SPLIT_SILENCE)
00172   {
00173     activate_silence_parameters();
00174   }
00175   else
00176   {
00177     deactivate_silence_parameters();
00178   }
00179 
00180   if (selected_split_mode == SELECTED_SPLIT_TRIM_SILENCE)
00181   {
00182     activate_trim_parameters();
00183   }
00184   else
00185   {
00186     deactivate_trim_parameters();
00187   }
00188 
00189   save_preferences(NULL, NULL);
00190 }
00191 
00193 static void spinner_time_changed(GtkSpinButton *spinner, gpointer data)
00194 {
00195   gint time = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner));
00196   gchar time_text[1024] = { '\0' };
00197   g_snprintf(time_text, 1024, _("\tSplit every %2d seconds."), time);
00198   gtk_label_set_text(GTK_LABEL(time_label), time_text);
00199 
00200   save_preferences(NULL, NULL);
00201 }
00202 
00204 static void spinner_equal_tracks_changed(GtkSpinButton *spinner, gpointer data)
00205 {
00206   gint equal_tracks = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner));
00207   gchar equal_tracks_text[1024] = { '\0' };
00208   g_snprintf(equal_tracks_text, 1024, _("\tSplit in %2d equal time tracks."), equal_tracks);
00209   gtk_label_set_text(GTK_LABEL(equal_tracks_label), equal_tracks_text);
00210 
00211   save_preferences(NULL, NULL);
00212 }
00213 
00215 static void split_file_mode_changed(GtkToggleButton *radio_b, gpointer data)
00216 {
00217   GSList *radio_button_list =
00218     gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_b));
00219   GtkToggleButton *current_radio_button = (GtkToggleButton *)
00220     g_slist_nth_data(radio_button_list,0);
00221 
00222   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(current_radio_button)))
00223   {
00224     split_file_mode = FILE_MODE_MULTIPLE;
00225     gtk_widget_set_sensitive(multiple_files_component, TRUE);
00226   }
00227   else
00228   {
00229     split_file_mode = FILE_MODE_SINGLE;
00230     gtk_widget_set_sensitive(multiple_files_component, FALSE);
00231   }
00232 
00233   save_preferences(NULL, NULL);
00234 }
00235 
00237 static GtkWidget *create_split_mode()
00238 {
00239   GtkWidget *local_vbox = gtk_vbox_new(FALSE, 0);
00240   gtk_container_set_border_width(GTK_CONTAINER(local_vbox), 5);
00241 
00242   //normal split
00243   split_mode_radio_button = gtk_radio_button_new_with_label(NULL, _("Normal"));
00244   gtk_box_pack_start (GTK_BOX (local_vbox), split_mode_radio_button,
00245       FALSE, FALSE, 2);
00246   g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button),
00247       "toggled", G_CALLBACK (split_mode_changed), NULL);
00248   g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
00249       GINT_TO_POINTER(SELECTED_SPLIT_NORMAL));
00250 
00251   //time split
00252   split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
00253     (GTK_RADIO_BUTTON(split_mode_radio_button), _("Time"));
00254   gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button,
00255       FALSE, FALSE, 2);
00256   g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
00257       G_CALLBACK(split_mode_changed), NULL);
00258    g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
00259       GINT_TO_POINTER(SELECTED_SPLIT_TIME));
00260  
00261   //
00262   GtkWidget *horiz_fake = gtk_hbox_new(FALSE,0);
00263   gtk_box_pack_start(GTK_BOX(local_vbox), horiz_fake, FALSE, FALSE, 0);
00264   
00265   gint default_time = 60;
00266 
00267   gchar time_text[1024] = { '\0' };
00268   g_snprintf(time_text, 1024, _("\tSplit every %2d seconds."), default_time);
00269   time_label = gtk_label_new(time_text);
00270   gtk_box_pack_start(GTK_BOX(horiz_fake), time_label, FALSE, FALSE, 0);
00271   
00272   GtkAdjustment *adj =
00273     (GtkAdjustment *)gtk_adjustment_new(0.0, 1, 2000, 1.0, 10.0, 0.0);
00274   spinner_time = gtk_spin_button_new(adj, 1, 0);
00275   gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_time, FALSE, FALSE, 6);
00276   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_time), default_time);
00277   gtk_widget_set_sensitive(GTK_WIDGET(spinner_time), FALSE);
00278   gtk_widget_set_sensitive(time_label, FALSE);
00279   g_signal_connect(G_OBJECT(spinner_time), "value-changed",
00280       G_CALLBACK(spinner_time_changed), NULL);
00281 
00282   //split in equal length
00283   split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
00284     (GTK_RADIO_BUTTON(split_mode_radio_button), _("Equal time tracks"));
00285   gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button,
00286       FALSE, FALSE, 2);
00287   g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
00288       G_CALLBACK(split_mode_changed), NULL);
00289   g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
00290       GINT_TO_POINTER(SELECTED_SPLIT_EQUAL_TIME_TRACKS));
00291  
00292   //
00293   horiz_fake = gtk_hbox_new(FALSE,0);
00294   gtk_box_pack_start(GTK_BOX(local_vbox), horiz_fake, FALSE, FALSE, 0);
00295   
00296   gint default_tracks = 10;
00297 
00298   gchar equal_length_text[1024] = { '\0' };
00299   g_snprintf(equal_length_text, 1024, _("\tSplit in %2d equal time tracks."), default_tracks);
00300   equal_tracks_label = gtk_label_new(time_text);
00301   gtk_box_pack_start(GTK_BOX(horiz_fake), equal_tracks_label, FALSE, FALSE, 0);
00302   
00303   adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 1, 2000, 1.0, 10.0, 0.0);
00304   spinner_equal_tracks = gtk_spin_button_new(adj, 1, 0);
00305   gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_equal_tracks, FALSE, FALSE, 6);
00306   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_equal_tracks), default_time);
00307   gtk_widget_set_sensitive(GTK_WIDGET(spinner_equal_tracks), FALSE);
00308   gtk_widget_set_sensitive(equal_tracks_label, FALSE);
00309   g_signal_connect(G_OBJECT(spinner_equal_tracks), "value-changed",
00310       G_CALLBACK(spinner_equal_tracks_changed), NULL);
00311 
00312   //trim using silence detection
00313   split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
00314     (GTK_RADIO_BUTTON(split_mode_radio_button), (gchar *)_("Trim using silence detection"));
00315   gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button, FALSE, FALSE, 2);
00316   g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
00317       G_CALLBACK(split_mode_changed), NULL);
00318   g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
00319       GINT_TO_POINTER(SELECTED_SPLIT_TRIM_SILENCE));
00320 
00321   horiz_fake = gtk_hbox_new(FALSE,0);
00322   gtk_box_pack_start(GTK_BOX(local_vbox), horiz_fake, FALSE, FALSE, 0);
00323   
00324   GtkWidget *param_vbox = gtk_vbox_new(FALSE,0);
00325   gtk_box_pack_start(GTK_BOX(horiz_fake), param_vbox, FALSE, FALSE, 25);
00326 
00327   horiz_fake = gtk_hbox_new(FALSE,0);
00328   gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
00329 
00330   all_trim_threshold_label = gtk_label_new(_("Threshold level (dB) : "));
00331   gtk_box_pack_start(GTK_BOX(horiz_fake), all_trim_threshold_label, FALSE, FALSE, 0);
00332  
00333   adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -96.0, 0.0, 0.5, 10.0, 0.0);
00334   all_spinner_trim_silence_threshold = gtk_spin_button_new(adj, 0.5, 2);
00335   gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_trim_silence_threshold, FALSE, FALSE, 0);
00336 
00337   //silence split
00338   split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
00339     (GTK_RADIO_BUTTON(split_mode_radio_button), (gchar *)_("Silence - split with silence detection"));
00340   gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button, FALSE, FALSE, 2);
00341   g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
00342       G_CALLBACK(split_mode_changed), NULL);
00343   g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
00344       GINT_TO_POINTER(SELECTED_SPLIT_SILENCE));
00345 
00346   horiz_fake = gtk_hbox_new(FALSE,0);
00347   gtk_box_pack_start(GTK_BOX(local_vbox), horiz_fake, FALSE, FALSE, 0);
00348   
00349   param_vbox = gtk_vbox_new(FALSE,0);
00350   gtk_box_pack_start(GTK_BOX(horiz_fake), param_vbox, FALSE, FALSE, 25);
00351 
00352   horiz_fake = gtk_hbox_new(FALSE,0);
00353   gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
00354 
00355   all_threshold_label = gtk_label_new(_("Threshold level (dB) : "));
00356   gtk_box_pack_start(GTK_BOX(horiz_fake), all_threshold_label, FALSE, FALSE, 0);
00357  
00358   adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -96.0, 0.0, 0.5, 10.0, 0.0);
00359   all_spinner_silence_threshold = gtk_spin_button_new(adj, 0.5, 2);
00360   gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_silence_threshold, FALSE, FALSE, 0);
00361  
00362   horiz_fake = gtk_hbox_new(FALSE,0);
00363   gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
00364   
00365   all_offset_label = gtk_label_new(_("Cutpoint offset (0 is the begin of silence,and 1 the end) : "));
00366   gtk_box_pack_start(GTK_BOX(horiz_fake), all_offset_label, FALSE, FALSE, 0);
00367 
00368   adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -2, 2, 0.05, 10.0, 0.0);
00369   all_spinner_silence_offset = gtk_spin_button_new(adj, 0.05, 2);
00370   gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_silence_offset, FALSE, FALSE, 0);
00371  
00372   horiz_fake = gtk_hbox_new(FALSE,0);
00373   gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
00374 
00375   all_number_of_tracks_label = gtk_label_new(_("Number of tracks (0 means all tracks) : "));
00376   gtk_box_pack_start(GTK_BOX(horiz_fake), all_number_of_tracks_label, FALSE, FALSE, 0);
00377   
00378   adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0, 2000, 1, 10.0, 0.0);
00379   all_spinner_silence_number_tracks = gtk_spin_button_new(adj, 1, 0);
00380   gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_silence_number_tracks, FALSE, FALSE, 0);
00381   
00382   horiz_fake = gtk_hbox_new(FALSE,0);
00383   gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
00384   
00385   all_min_silence_label = gtk_label_new(_("Minimum silence length (seconds) : "));
00386   gtk_box_pack_start(GTK_BOX(horiz_fake), all_min_silence_label, FALSE, FALSE, 0);
00387 
00388   adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0, 2000, 0.5, 10.0, 0.0);
00389   all_spinner_silence_minimum = gtk_spin_button_new(adj, 1, 2);
00390   gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_silence_minimum, FALSE, FALSE, 0);
00391 
00392   horiz_fake = gtk_hbox_new(FALSE,0);
00393   gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
00394   
00395   all_min_track_label = gtk_label_new(_("Minimum track length (seconds) : "));
00396   gtk_box_pack_start(GTK_BOX(horiz_fake), all_min_track_label, FALSE, FALSE, 0);
00397 
00398   adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0, 2000, 0.5, 10.0, 0.0);
00399   all_spinner_track_minimum = gtk_spin_button_new(adj, 1, 2);
00400   gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_track_minimum, FALSE, FALSE, 0);
00401 
00402   all_silence_remove_silence =
00403     gtk_check_button_new_with_label(_("Remove silence between tracks"));
00404   gtk_box_pack_start(GTK_BOX(param_vbox), all_silence_remove_silence, FALSE, FALSE, 0);
00405 
00406   gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_silence_number_tracks),
00407                             SPLT_DEFAULT_PARAM_TRACKS);
00408   gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_silence_minimum),
00409                             SPLT_DEFAULT_PARAM_MINIMUM_LENGTH);
00410   gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_silence_offset),
00411                             SPLT_DEFAULT_PARAM_OFFSET);
00412   gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_silence_threshold),
00413                             SPLT_DEFAULT_PARAM_THRESHOLD);
00414 
00415   gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_trim_silence_threshold),
00416                             SPLT_DEFAULT_PARAM_THRESHOLD);
00417 
00418   deactivate_silence_parameters();
00419   deactivate_trim_parameters();
00420 
00421   //wrap split
00422   split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
00423     (GTK_RADIO_BUTTON(split_mode_radio_button),
00424      _("Wrap - split files created with mp3wrap or albumwrap (mp3 only)"));
00425   gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button,
00426       FALSE, FALSE, 2);
00427   g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
00428                     G_CALLBACK(split_mode_changed), NULL);
00429   g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
00430       GINT_TO_POINTER(SELECTED_SPLIT_WRAP));
00431   
00432   //error mode split
00433   split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
00434     (GTK_RADIO_BUTTON(split_mode_radio_button), _("Error mode (mp3 only)"));
00435   gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button,
00436       FALSE, FALSE, 2);
00437   g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
00438       G_CALLBACK(split_mode_changed), NULL);
00439   g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
00440       GINT_TO_POINTER(SELECTED_SPLIT_ERROR));
00441  
00442   select_split_mode(SELECTED_SPLIT_NORMAL);
00443 
00444   GtkWidget *scrolled_window = create_scrolled_window();
00445   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
00446                                         GTK_WIDGET(local_vbox));
00447  
00448   return scrolled_window;
00449 }
00450 
00452 static GtkWidget *create_single_multiple_split_modes()
00453 {
00454   GtkWidget *local_vbox = gtk_vbox_new(FALSE, 0);
00455   gtk_container_set_border_width(GTK_CONTAINER(local_vbox), 5);
00456 
00457   //single file
00458   file_mode_radio_button = 
00459     gtk_radio_button_new_with_label(NULL, _("Single file"));
00460   gtk_box_pack_start(GTK_BOX(local_vbox), file_mode_radio_button,
00461       FALSE, FALSE, 2);
00462   g_signal_connect(GTK_TOGGLE_BUTTON(file_mode_radio_button),
00463       "toggled", G_CALLBACK(split_file_mode_changed), NULL);
00464  
00465   //multiple files
00466   file_mode_radio_button = gtk_radio_button_new_with_label_from_widget
00467     (GTK_RADIO_BUTTON(file_mode_radio_button), _("Batch processing"));
00468   gtk_box_pack_start(GTK_BOX(local_vbox), file_mode_radio_button,
00469       FALSE, FALSE, 2);
00470   g_signal_connect(GTK_TOGGLE_BUTTON(file_mode_radio_button),
00471       "toggled", G_CALLBACK(split_file_mode_changed), NULL);
00472 
00473   GtkWidget *multiple_files_hbox = gtk_hbox_new(FALSE, 0);
00474   gtk_box_pack_start(GTK_BOX(local_vbox), multiple_files_hbox, TRUE, TRUE, 2);
00475 
00476   multiple_files_component = create_multiple_files_component();
00477   gtk_widget_set_sensitive(multiple_files_component, FALSE);
00478   gtk_box_pack_start(GTK_BOX(multiple_files_hbox), multiple_files_component,
00479       TRUE, TRUE, 20);
00480 
00481   GtkWidget *scrolled_window = create_scrolled_window();
00482   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
00483                                         GTK_WIDGET(local_vbox));
00484 
00485   return scrolled_window;
00486 }
00487 
00489 GtkWidget *create_special_split_page()
00490 {
00491   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);;
00492 
00493   /* tabbed notebook */
00494   GtkWidget *notebook = gtk_notebook_new();
00495   gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
00496   gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
00497   gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), TRUE);
00498   gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
00499   gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
00500 
00501   GtkWidget *notebook_label = gtk_label_new(_("Split mode"));
00502   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), create_split_mode(),
00503                            (GtkWidget *)notebook_label);
00504 
00505   notebook_label = gtk_label_new(_("File mode"));
00506   gtk_notebook_append_page(GTK_NOTEBOOK(notebook),
00507       create_single_multiple_split_modes(), (GtkWidget *)notebook_label);
00508 
00509   return vbox;
00510 }
00511