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