mp3splt-gtk
|
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 * Save and read preferences 00035 * 00036 * This file contains the functions to save the preferences 00037 * on the hard disk and to read them again at the next 00038 * start of the program. 00039 ********************************************************/ 00040 00041 #include <string.h> 00042 #include <stdlib.h> 00043 #include <unistd.h> 00044 00045 #include <gtk/gtk.h> 00046 #include <glib/gi18n.h> 00047 #include <glib/gstdio.h> 00048 00049 #include <libmp3splt/mp3splt.h> 00050 00051 #include "player.h" 00052 #include "preferences_tab.h" 00053 #include "special_split.h" 00054 #include "combo_helper.h" 00055 #include "radio_helper.h" 00056 #include "ui_manager.h" 00057 00058 extern GtkWidget *player_combo_box; 00059 extern gint selected_player; 00060 extern GList *player_pref_list; 00061 extern GtkWidget *radio_button; 00062 00063 extern GtkWidget *file_mode_radio_button; 00064 00065 extern GtkWidget *frame_mode; 00066 extern GtkWidget *adjust_mode; 00067 extern GtkWidget *names_from_filename; 00068 extern GtkWidget *spinner_adjust_gap; 00069 extern GtkWidget *spinner_adjust_offset; 00070 extern GtkWidget *spinner_adjust_threshold; 00071 extern GtkWidget *create_dirs_from_output_files; 00072 extern GtkWidget *spinner_time; 00073 extern GtkWidget *spinner_equal_tracks; 00074 00075 extern GtkWidget *output_entry; 00076 extern GtkWidget *output_label; 00077 extern GtkWidget *radio_output; 00078 extern GtkWidget *tags_radio; 00079 extern GtkWidget *tags_version_radio; 00080 00081 extern splt_state *the_state; 00082 00083 extern GtkWidget *replace_underscore_by_space_check_box; 00084 extern GtkComboBox *artist_text_properties_combo; 00085 extern GtkComboBox *album_text_properties_combo; 00086 extern GtkComboBox *title_text_properties_combo; 00087 extern GtkComboBox *comment_text_properties_combo; 00088 extern GtkComboBox *genre_combo; 00089 extern GtkWidget *comment_tag_entry; 00090 extern GtkWidget *regex_entry; 00091 extern GtkWidget *test_regex_fname_entry; 00092 00093 extern ui_state *ui; 00094 00103 gchar *get_preferences_filename() 00104 { 00105 gchar mp3splt_dir[14] = ".mp3splt-gtk"; 00106 00107 //used to see if the directory exists 00108 struct stat buffer; 00109 gint status; 00110 00111 //home directory 00112 gchar *home_dir = g_strdup(g_get_home_dir()); 00113 00114 #ifdef __WIN32__ 00115 //manage c:\ because the gtk dir returns us "c:\" 00116 //and the normal directories without the "\" 00117 if (home_dir[strlen(home_dir)-1] == '\\') 00118 { 00119 home_dir[strlen(home_dir)-1] = '\0'; 00120 } 00121 #endif 00122 00123 gchar *mp3splt_dir_with_path = NULL; 00124 gint malloc_number = strlen(home_dir) + strlen(mp3splt_dir)+2; 00125 mp3splt_dir_with_path = malloc(malloc_number *sizeof(gchar *)); 00126 g_snprintf(mp3splt_dir_with_path, malloc_number, 00127 "%s%s%s", home_dir,G_DIR_SEPARATOR_S, 00128 mp3splt_dir); 00129 00130 if (home_dir) 00131 { 00132 g_free(home_dir); 00133 home_dir = NULL; 00134 } 00135 00136 gint fname_malloc_number = strlen(mp3splt_dir_with_path)+30; 00137 gchar *filename = malloc(fname_malloc_number*sizeof(gchar *)); 00138 00139 status = g_stat(mp3splt_dir_with_path, &buffer); 00140 //if it is not a directory 00141 if ((status != 0) || (S_ISDIR(buffer.st_mode) == 0)) 00142 { 00143 //if its a file 00144 if ((status == 0) && (S_ISREG(buffer.st_mode) != 0)) 00145 { 00146 gchar *backup_file; 00147 malloc_number = strlen(mp3splt_dir_with_path)+5; 00148 backup_file = malloc(malloc_number*sizeof(gchar *)); 00149 snprintf(backup_file,malloc_number, 00150 "%s%s", mp3splt_dir_with_path,".bak"); 00151 //we rename the file 00152 g_rename(mp3splt_dir_with_path, 00153 backup_file); 00154 g_free(backup_file); 00155 } 00156 //if it is not a directory and not a file, we suppose we can 00157 //create the directory 00158 #ifdef __WIN32__ 00159 g_mkdir(mp3splt_dir_with_path, 0775); 00160 #else 00161 g_mkdir(mp3splt_dir_with_path, 00162 S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 00163 #endif 00164 } 00165 00166 //the config filename+path 00167 g_snprintf(filename,fname_malloc_number, 00168 "%s%smp3splt-gtk_prefs", 00169 mp3splt_dir_with_path, G_DIR_SEPARATOR_S); 00170 00171 if (mp3splt_dir_with_path) 00172 { 00173 g_free(mp3splt_dir_with_path); 00174 mp3splt_dir_with_path = NULL; 00175 } 00176 00177 return filename; 00178 } 00179 00182 void load_preferences() 00183 { 00184 GKeyFile *key_file = g_key_file_new(); 00185 00186 gchar *filename = get_preferences_filename(); 00187 00188 //load config 00189 g_key_file_load_from_file(key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL); 00190 00191 if (filename) 00192 { 00193 g_free(filename); 00194 filename = NULL; 00195 } 00196 00197 #ifdef __WIN32__ 00198 //language 00199 gchar *file_string = g_key_file_get_string(key_file, "general", "language", NULL); 00200 GString *lang = g_string_new(file_string); 00201 00202 //0 = german, 1 = french, 2 = english 00203 gint list_number = 2; 00204 if (g_string_equal(lang,g_string_new("de")) || 00205 g_string_equal(lang,g_string_new("de_DE"))) 00206 { 00207 list_number = 0; 00208 } 00209 else if (g_string_equal(lang, g_string_new("fr")) || 00210 g_string_equal(lang, g_string_new("fr_FR"))) 00211 { 00212 list_number = 1; 00213 } 00214 00215 GSList *radio_button_list = 00216 gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button)); 00217 GtkWidget *our_button = (GtkWidget *) 00218 g_slist_nth_data(radio_button_list, list_number); 00219 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(our_button), TRUE); 00220 00221 g_free(file_string); 00222 g_string_free(lang, TRUE); 00223 file_string = NULL; 00224 lang = NULL; 00225 #endif 00226 00227 // If outputdirectory_get()!=NULL the path where to output the split file 00228 // to has been set from command line 00229 if(outputdirectory_get()==NULL) 00230 { 00231 // No output_path from command-line => get the path from the preferences 00232 gchar *save_path = g_key_file_get_string(key_file, "split", "save_path", NULL); 00233 { 00234 if (save_path != NULL) 00235 { 00236 outputdirectory_set(save_path); 00237 } 00238 g_free(save_path); 00239 save_path = NULL; 00240 } 00241 } 00242 00243 //selected player 00244 gint item = g_key_file_get_integer(key_file, "player", "default_player",NULL); 00245 ch_set_active_value(GTK_COMBO_BOX(player_combo_box), item); 00246 00247 //frame mode 00248 item = g_key_file_get_boolean(key_file, "split", "frame_mode", NULL); 00249 if (item) 00250 { 00251 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(frame_mode),TRUE); 00252 } 00253 else 00254 { 00255 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(frame_mode),FALSE); 00256 } 00257 00258 //adjust mode 00259 item = g_key_file_get_boolean(key_file, "split", "adjust_mode", NULL); 00260 if (item) 00261 { 00262 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(adjust_mode),TRUE); 00263 } 00264 else 00265 { 00266 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(adjust_mode),FALSE); 00267 } 00268 00269 item = g_key_file_get_boolean(key_file, "output", "splitpoint_names_from_filename", NULL); 00270 if (item) 00271 { 00272 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(names_from_filename),TRUE); 00273 } 00274 else 00275 { 00276 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(names_from_filename),FALSE); 00277 } 00278 00279 //adjust threshold 00280 gfloat item2; 00281 item = g_key_file_get_integer(key_file, "split", "adjust_threshold", NULL); 00282 item2 = item/100 + (item%100)/100.; 00283 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_threshold), item2); 00284 //adjust offset 00285 item = g_key_file_get_integer(key_file, "split", "adjust_offset", NULL); 00286 item2 = item/100 + (item%100)/100.; 00287 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_offset), 00288 item2); 00289 //adjust gap 00290 item = g_key_file_get_integer(key_file, "split", "adjust_gap", NULL); 00291 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_gap), item); 00292 00293 //tags options 00294 gint tag_pref_file = g_key_file_get_integer(key_file, "split", "tags", NULL); 00295 GtkWidget *radio = rh_get_radio_from_value(tags_radio, tag_pref_file); 00296 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio), TRUE); 00297 00298 //replace underscores by spaces 00299 item = g_key_file_get_boolean(key_file, "split", "replace_underscore_by_space", NULL); 00300 if (item) 00301 { 00302 gtk_toggle_button_set_active( 00303 GTK_TOGGLE_BUTTON(replace_underscore_by_space_check_box), TRUE); 00304 } 00305 else 00306 { 00307 gtk_toggle_button_set_active( 00308 GTK_TOGGLE_BUTTON(replace_underscore_by_space_check_box), FALSE); 00309 } 00310 00311 //artist text properties 00312 item = g_key_file_get_integer(key_file, "split", "artist_text_properties",NULL); 00313 if (item) 00314 { 00315 ch_set_active_value(artist_text_properties_combo, item); 00316 } 00317 else 00318 { 00319 ch_set_active_value(artist_text_properties_combo, SPLT_NO_CONVERSION); 00320 } 00321 //album text properties 00322 item = g_key_file_get_integer(key_file, "split", "album_text_properties",NULL); 00323 if (item) 00324 { 00325 ch_set_active_value(album_text_properties_combo, item); 00326 } 00327 else 00328 { 00329 ch_set_active_value(album_text_properties_combo, SPLT_NO_CONVERSION); 00330 } 00331 //title text properties 00332 item = g_key_file_get_integer(key_file, "split", "title_text_properties",NULL); 00333 if (item) 00334 { 00335 ch_set_active_value(title_text_properties_combo, item); 00336 } 00337 else 00338 { 00339 ch_set_active_value(title_text_properties_combo, SPLT_NO_CONVERSION); 00340 } 00341 //comment text properties 00342 item = g_key_file_get_integer(key_file, "split", "comment_text_properties",NULL); 00343 if (item) 00344 { 00345 ch_set_active_value(comment_text_properties_combo, item); 00346 } 00347 else 00348 { 00349 ch_set_active_value(comment_text_properties_combo, SPLT_NO_CONVERSION); 00350 } 00351 00352 //genre 00353 gchar *default_genre = g_key_file_get_string(key_file, "split", "genre", NULL); 00354 if (default_genre) 00355 { 00356 ch_set_active_str_value(genre_combo, default_genre); 00357 g_free(default_genre); 00358 default_genre = NULL; 00359 } 00360 else 00361 { 00362 ch_set_active_str_value(genre_combo, SPLT_UNDEFINED_GENRE); 00363 } 00364 00365 //default comment tag 00366 gchar *default_comment_tag = g_key_file_get_string(key_file, "split", "default_comment_tag", NULL); 00367 if (default_comment_tag) 00368 { 00369 gtk_entry_set_text(GTK_ENTRY(comment_tag_entry), default_comment_tag); 00370 g_free(default_comment_tag); 00371 default_comment_tag = NULL; 00372 } 00373 00374 //regexp to parse filename into tags 00375 gchar *tags_from_fname_regex = 00376 g_key_file_get_string(key_file, "split", "tags_from_filename_regex", NULL); 00377 if (tags_from_fname_regex) 00378 { 00379 gtk_entry_set_text(GTK_ENTRY(regex_entry), tags_from_fname_regex); 00380 g_free(tags_from_fname_regex); 00381 tags_from_fname_regex = NULL; 00382 } 00383 00384 gchar *test_regex_fname = 00385 g_key_file_get_string(key_file, "split", "test_regex_fname", NULL); 00386 if (test_regex_fname) 00387 { 00388 gtk_entry_set_text(GTK_ENTRY(test_regex_fname_entry), test_regex_fname); 00389 g_free(test_regex_fname); 00390 test_regex_fname = NULL; 00391 } 00392 00393 //tags version 00394 tag_pref_file = g_key_file_get_integer(key_file, "split", "tags_version", NULL); 00395 00396 GSList *tags_version_radio_button_list = 00397 gtk_radio_button_get_group(GTK_RADIO_BUTTON(tags_version_radio)); 00398 GtkWidget *the_selection = 00399 (GtkWidget *)g_slist_nth_data(tags_version_radio_button_list, tag_pref_file); 00400 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(the_selection), TRUE); 00401 00402 //default output format or not 00403 gint default_output_format = g_key_file_get_boolean(key_file, "output", 00404 "default_output_format", NULL); 00405 GSList *output_radio_button_list = 00406 gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_output)); 00407 GtkWidget *our_selection = 00408 (GtkWidget *)g_slist_nth_data(output_radio_button_list, default_output_format); 00409 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(our_selection), TRUE); 00410 if (default_output_format) 00411 { 00412 gtk_widget_set_sensitive(GTK_WIDGET(output_entry), FALSE); 00413 gtk_widget_set_sensitive(GTK_WIDGET(output_label), FALSE); 00414 } 00415 00416 //output format 00417 gchar *output_format = g_key_file_get_string(key_file, "output", "output_format", NULL); 00418 if (output_format) 00419 { 00420 gtk_entry_set_text(GTK_ENTRY(output_entry), output_format); 00421 g_free(output_format); 00422 output_format = NULL; 00423 } 00424 00425 //create directories if needed 00426 item = g_key_file_get_boolean(key_file, "output", "create_dirs_if_needed", NULL); 00427 if (item) 00428 { 00429 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(create_dirs_from_output_files), TRUE); 00430 } 00431 else 00432 { 00433 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(create_dirs_from_output_files), FALSE); 00434 } 00435 00436 //type of split: split mode 00437 gint split_mode = g_key_file_get_integer(key_file, "split", "split_mode", NULL); 00438 select_split_mode(split_mode); 00439 00440 //time value 00441 gint time_value = g_key_file_get_integer(key_file, "split", 00442 "split_mode_time_value", NULL); 00443 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_time), time_value); 00444 00445 //file mode 00446 gint file_mode = g_key_file_get_integer(key_file, "split", 00447 "file_mode", NULL); 00448 GSList *file_mode_radio_button_list = 00449 gtk_radio_button_get_group(GTK_RADIO_BUTTON(file_mode_radio_button)); 00450 our_selection = 00451 (GtkWidget *)g_slist_nth_data(file_mode_radio_button_list, file_mode); 00452 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(our_selection), TRUE); 00453 00454 //equal time tracks value 00455 gint equal_tracks = g_key_file_get_integer(key_file, "split", 00456 "split_mode_equal_time_tracks", NULL); 00457 gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_equal_tracks), equal_tracks); 00458 00459 gint root_x = g_key_file_get_integer(key_file, "gui", "root_x_position", NULL); 00460 gint root_y = g_key_file_get_integer(key_file, "gui", "root_y_position", NULL); 00461 if (root_x && root_y) 00462 { 00463 ui_set_main_win_position(ui, root_x, root_y); 00464 } 00465 00466 gint width = g_key_file_get_integer(key_file, "gui", "width", NULL); 00467 gint height = g_key_file_get_integer(key_file, "gui", "height", NULL); 00468 if (width && height) 00469 { 00470 ui_set_main_win_size(ui, width, height); 00471 } 00472 00473 gchar *browser_directory = 00474 g_key_file_get_string(key_file, "gui", "browser_directory", NULL); 00475 if (browser_directory) 00476 { 00477 ui_set_browser_directory(ui, browser_directory); 00478 g_free(browser_directory); 00479 } 00480 00481 g_key_file_free(key_file); 00482 key_file = NULL; 00483 } 00484 00485 /* \brief writes a default configuration file 00486 00487 Also is used to write good values on a bad existing configuration file 00488 */ 00489 void write_default_preferences_file() 00490 { 00491 gchar *filename = get_preferences_filename(); 00492 00493 GKeyFile *my_key_file = g_key_file_new(); 00494 g_key_file_load_from_file(my_key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL); 00495 00496 #ifdef __WIN32__ 00497 gchar *file_string = NULL; 00498 00499 //default language 00500 if (!g_key_file_has_key(my_key_file, "general", "language",NULL)) 00501 { 00502 g_key_file_set_string(my_key_file, "general", "language", "en"); 00503 g_key_file_set_comment(my_key_file, "general", "language", 00504 "\n language of the gui: en = english, fr = french, de = german", 00505 NULL); 00506 } 00507 //if we have the key, but we have ugly values 00508 else 00509 { 00510 file_string = g_key_file_get_string(my_key_file, "general", "language", NULL); 00511 GString * lang_char = g_string_new(file_string); 00512 00513 if((!g_string_equal(lang_char,g_string_new("en"))) 00514 &&(!g_string_equal(lang_char, g_string_new("fr"))) 00515 &&(!g_string_equal(lang_char, g_string_new("fr_FR"))) 00516 &&(!g_string_equal(lang_char, g_string_new("de"))) 00517 &&(!g_string_equal(lang_char, g_string_new("de_DE"))) 00518 ) 00519 { 00520 g_key_file_set_string(my_key_file, "general", "language", "en"); 00521 g_key_file_set_comment(my_key_file, "general", "language", 00522 "\n language of the gui: en = english, fr_FR = french, de_DE = german", 00523 NULL); 00524 } 00525 00526 g_free(file_string); 00527 g_string_free(lang_char, TRUE); 00528 file_string = NULL; 00529 lang_char = NULL; 00530 } 00531 #endif 00532 00533 //frame mode 00534 if (!g_key_file_has_key(my_key_file, "split", "frame_mode",NULL)) 00535 { 00536 g_key_file_set_boolean(my_key_file, "split", "frame_mode", FALSE); 00537 } 00538 00539 //adjust mode 00540 if (!g_key_file_has_key(my_key_file, "split", "adjust_mode",NULL)) 00541 { 00542 g_key_file_set_boolean(my_key_file, "split", "adjust_mode", FALSE); 00543 } 00544 00545 gint item; 00546 gfloat item2; 00547 //adjust threshold 00548 if (!g_key_file_has_key(my_key_file, "split", "adjust_threshold",NULL)) 00549 { 00550 g_key_file_set_integer(my_key_file, "split", "adjust_threshold", 00551 (int)(SPLT_DEFAULT_PARAM_THRESHOLD * 100)); 00552 } 00553 //if we have the key but we have ugly values 00554 else 00555 { 00556 item = g_key_file_get_integer(my_key_file, "split", "adjust_threshold", NULL); 00557 //convert to float 00558 item2 = item/100 + (item%100)/100.; 00559 00560 if ((item2 < -96) || (item2 > 0)) 00561 { 00562 g_key_file_set_integer(my_key_file, "split", "adjust_threshold", 00563 (int)(SPLT_DEFAULT_PARAM_THRESHOLD * 100)); 00564 } 00565 } 00566 00567 //adjust offset 00568 if (!g_key_file_has_key(my_key_file, "split", "adjust_offset",NULL)) 00569 { 00570 g_key_file_set_integer(my_key_file, "split", "adjust_offset", 00571 (int)(SPLT_DEFAULT_PARAM_OFFSET * 100)); 00572 } 00573 //if we have the key but we have ugly values 00574 else 00575 { 00576 item = g_key_file_get_integer(my_key_file, "split", "adjust_offset", NULL); 00577 //convert to float 00578 item2 = item/100 + (item%100)/100.; 00579 00580 //if ugly values 00581 if ((item2 < -2) || (item2 > 2)) 00582 { 00583 g_key_file_set_integer(my_key_file, "split", "adjust_offset", 00584 (int)(SPLT_DEFAULT_PARAM_OFFSET * 100)); 00585 } 00586 } 00587 00588 //adjust gap 00589 if (!g_key_file_has_key(my_key_file, "split", "adjust_gap",NULL)) 00590 { 00591 g_key_file_set_integer(my_key_file, "split", "adjust_gap", SPLT_DEFAULT_PARAM_GAP); 00592 } 00593 //if we have the key but we have ugly values 00594 else 00595 { 00596 item = g_key_file_get_integer(my_key_file, "split", "adjust_gap", NULL); 00597 00598 //if ugly values 00599 if ((item < 0) || (item > 2000)) 00600 { 00601 g_key_file_set_integer(my_key_file, "split", "adjust_gap", 00602 SPLT_DEFAULT_PARAM_GAP); 00603 } 00604 } 00605 00606 //tags options 00607 if (!g_key_file_has_key(my_key_file, "split", "tags",NULL)) 00608 { 00609 g_key_file_set_integer(my_key_file, "split", "tags", 1); 00610 g_key_file_set_comment(my_key_file, "split", "tags", 00611 "\n 0 - No tags, 1 - Default tags, 2 - Original tags, 3 - Tags from filename", NULL); 00612 } 00613 00614 //tags version 00615 if (!g_key_file_has_key(my_key_file, "split", "tags_version",NULL)) 00616 { 00617 g_key_file_set_integer(my_key_file, "split", "tags_version", 0); 00618 g_key_file_set_comment(my_key_file, "split", "tags_version", 00619 "\n 0 - same tags version as the input file, 1 - ID3v1 tags," 00620 " 2 - ID3v2 tags, 3 - ID3v1 & ID3v2 tags", 00621 NULL); 00622 } 00623 00624 //default player 00625 if (!g_key_file_has_key(my_key_file, "player", "default_player",NULL)) 00626 { 00627 g_key_file_set_integer(my_key_file, "player", "default_player", 00628 PLAYER_GSTREAMER); 00629 g_key_file_set_comment (my_key_file, "player", "default_player", 00630 "\n 1 = PLAYER_AUDACIOUS, 2 = PLAYER_SNACKAMP, 3 = PLAYER_GSTREAMER", 00631 NULL); 00632 } 00633 else 00634 { 00635 //check if we support selected player 00636 gint the_player = g_key_file_get_integer(my_key_file, "player", 00637 "default_player", NULL); 00638 if (the_player == PLAYER_AUDACIOUS) 00639 { 00640 #ifdef NO_AUDACIOUS 00641 g_key_file_set_integer(my_key_file, "player", "default_player", 00642 PLAYER_SNACKAMP); 00643 #endif 00644 } 00645 //if the value do not make sense 00646 else if ((the_player > PLAYER_GSTREAMER) || (the_player < 0)) 00647 { 00648 g_key_file_set_integer(my_key_file, "player", "default_player", 00649 PLAYER_GSTREAMER); 00650 } 00651 } 00652 00653 //output format 00654 if (!g_key_file_has_key(my_key_file, "output", "output_format",NULL)) 00655 { 00656 g_key_file_set_string(my_key_file, "output", "output_format", 00657 SPLT_DEFAULT_OUTPUT); 00658 g_key_file_set_comment (my_key_file, "output", "output_format", 00659 "\n the output format, contains @a," 00660 "@b, @g, @p, @t and @n, see the program for" 00661 " more details", 00662 NULL); 00663 } 00664 00665 //default output path boolean 00666 if (!g_key_file_has_key(my_key_file, "output", "default_output_format",NULL)) 00667 { 00668 g_key_file_set_boolean(my_key_file, "output", "default_output_format", TRUE); 00669 g_key_file_set_comment(my_key_file, "output", "default_output_format", 00670 "\n can be true or false" 00671 " - if we use the default output or" 00672 " not for cddb, cue and freedb search", 00673 NULL); 00674 } 00675 00676 //frame mode 00677 if (!g_key_file_has_key(my_key_file, "output", "create_dirs_if_needed", NULL)) 00678 { 00679 g_key_file_set_boolean(my_key_file, "output", "create_dirs_if_needed", TRUE); 00680 } 00681 00682 //split save path (output dir) 00683 if (!g_key_file_has_key(my_key_file, "split", "save_path",NULL)) 00684 { 00685 #ifdef __WIN32__ 00686 const gchar *home_dir = g_get_home_dir(); 00687 gint dir_malloc_number = strlen(home_dir)+ 10; 00688 gchar *default_dir = malloc(dir_malloc_number*sizeof(gchar *)); 00689 g_snprintf(default_dir, dir_malloc_number, "%s\\Desktop",home_dir); 00690 00691 //see if the directory exists 00692 struct stat buffer; 00693 gint status = g_stat(default_dir, &buffer); 00694 if ((status == 0) && (S_ISDIR(buffer.st_mode) == 0)) 00695 { 00696 g_snprintf(default_dir,dir_malloc_number, "%s",home_dir); 00697 } 00698 #else 00699 const gchar *default_dir = g_get_home_dir(); 00700 #endif 00701 00702 g_key_file_set_string(my_key_file, "split", "save_path", default_dir); 00703 g_key_file_set_comment(my_key_file, "split", "save_path", 00704 "\n this is the path where you will find your split files ", 00705 NULL); 00706 00707 #ifdef __WIN32__ 00708 g_free(default_dir); 00709 #endif 00710 } 00711 00712 //type of split: split mode 00713 if (!g_key_file_has_key(my_key_file, "split", "split_mode",NULL)) 00714 { 00715 g_key_file_set_integer(my_key_file, "split", "split_mode", 3); 00716 g_key_file_set_comment(my_key_file, "split", "split_mode", 00717 "\n 0 - error mode, 1 - wrap mode, 2 - time mode, 3 - normal mode, 4 - equal time tracks", 00718 NULL); 00719 } 00720 00721 //type of split: time value 00722 if (!g_key_file_has_key(my_key_file, "split", "split_mode_time_value",NULL)) 00723 { 00724 g_key_file_set_integer(my_key_file, "split", "split_mode_time_value", 60); 00725 g_key_file_set_comment(my_key_file, "split", "split_mode_time_value", 00726 "\n value in seconds to split every X seconds (for the time split)", 00727 NULL); 00728 } 00729 00730 //type of split: file mode 00731 if (!g_key_file_has_key(my_key_file, "split", "file_mode",NULL)) 00732 { 00733 g_key_file_set_integer(my_key_file, "split", "file_mode", 1); 00734 g_key_file_set_comment(my_key_file, "split", "file_mode", 00735 "\n 0 - multiple files, 1 - single file", 00736 NULL); 00737 } 00738 00739 //equal time tracks 00740 if (!g_key_file_has_key(my_key_file, "split", "split_mode_equal_time_tracks",NULL)) 00741 { 00742 g_key_file_set_integer(my_key_file, "split", "split_mode_equal_time_tracks", 10); 00743 g_key_file_set_comment(my_key_file, "split", "split_mode_equal_time_tracks", 00744 "\n number of tracks when to split in X tracks (for the equal time tracks split)", 00745 NULL); 00746 } 00747 00748 gchar *key_data = g_key_file_to_data(my_key_file, NULL, NULL); 00749 00750 //write content to the preferences file 00751 FILE *preferences_file = (FILE *)fopen(filename,"w"); 00752 g_fprintf(preferences_file,"%s", key_data); 00753 fclose(preferences_file); 00754 preferences_file = NULL; 00755 00756 if (filename) 00757 { 00758 g_free(filename); 00759 filename = NULL; 00760 } 00761 00762 g_free(key_data); 00763 key_data = NULL; 00764 g_key_file_free(my_key_file); 00765 } 00766 00771 void check_pref_file() 00772 { 00773 //used to see if the file exists 00774 struct stat buffer; 00775 gint status; 00776 00777 gchar *pref_file = get_preferences_filename(); 00778 00779 status = stat(pref_file, &buffer); 00780 if ((status == 0) && 00781 (S_ISREG(buffer.st_mode) == 0) && 00782 (S_ISDIR(buffer.st_mode) != 0)) 00783 { 00784 //backup the directory 00785 gint malloc_number = strlen(pref_file)+5; 00786 gchar *backup_dir = malloc(malloc_number * sizeof(gchar *)); 00787 snprintf(backup_dir,malloc_number, 00788 "%s%s",pref_file,".bak"); 00789 //rename the directory 00790 g_rename(pref_file, backup_dir); 00791 g_free(backup_dir); 00792 backup_dir = NULL; 00793 } 00794 00795 if (pref_file) 00796 { 00797 g_free(pref_file); 00798 pref_file = NULL; 00799 } 00800 00801 write_default_preferences_file(); 00802 } 00803 00805 void set_language() 00806 { 00807 GKeyFile *key_file = g_key_file_new(); 00808 //filename 00809 gchar *filename = get_preferences_filename(); 00810 00811 //load config 00812 g_key_file_load_from_file(key_file, filename, 00813 G_KEY_FILE_KEEP_COMMENTS, 00814 NULL); 00815 00816 if (filename) 00817 { 00818 g_free(filename); 00819 filename = NULL; 00820 } 00821 00822 gchar *lang = g_key_file_get_string(key_file, "general", "language", NULL); 00823 00824 //NOTE: current function is only used for windows: code needs cleanup ? 00825 #ifdef __WIN32__ 00826 gchar lang_env[32] = { '\0' }; 00827 g_snprintf(lang_env, 32, "LANG=%s", lang); 00828 putenv(lang_env); 00829 #else 00830 setenv("LANGUAGE", lang,1); 00831 #endif 00832 00833 //freeing memory 00834 g_free(lang); 00835 g_key_file_free(key_file); 00836 } 00837