Audacious  $Id:Doxyfile42802007-03-2104:39:00Znenolod$
audconfig.c
Go to the documentation of this file.
00001 /*  Audacious - Cross-platform multimedia player
00002  *  Copyright (C) 2005-2010  Audacious development team.
00003  *
00004  *  Based on BMP:
00005  *  Copyright (C) 2003-2004  BMP development team.
00006  *
00007  *  Based on XMMS:
00008  *  Copyright (C) 1998-2003  XMMS development team.
00009  *
00010  *  This program is free software; you can redistribute it and/or modify
00011  *  it under the terms of the GNU General Public License as published by
00012  *  the Free Software Foundation; under version 3 of the License.
00013  *
00014  *  This program is distributed in the hope that it will be useful,
00015  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00017  *  GNU General Public License for more details.
00018  *
00019  *  You should have received a copy of the GNU General Public License
00020  *  along with this program.  If not, see <http://www.gnu.org/licenses>.
00021  *
00022  *  The Audacious team does not consider modular code linking to
00023  *  Audacious or using our public API to be a derived work.
00024  */
00025 
00026 #include <glib.h>
00027 #include <libaudcore/hook.h>
00028 
00029 #include "audconfig.h"
00030 #include "configdb.h"
00031 #include "playback.h"
00032 
00033 AudConfig cfg = {
00034     .shuffle = FALSE,
00035     .repeat = FALSE,
00036     .equalizer_autoload = FALSE,
00037     .equalizer_active = FALSE,
00038     .show_numbers_in_pl = TRUE,
00039     .leading_zero = TRUE,
00040     .no_playlist_advance = FALSE,
00041     .advance_on_delete = FALSE,
00042     .clear_playlist = TRUE,
00043     .open_to_temporary = FALSE,
00044     .stopaftersong = FALSE,
00045     .close_dialog_open = TRUE,
00046     .equalizer_preamp = 0.0,
00047     .equalizer_bands = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
00048     .filesel_path = NULL,
00049     .playlist_path = NULL,
00050     .eqpreset_default_file = NULL,
00051     .eqpreset_extension = NULL,
00052     .url_history = NULL,
00053     .resume_playback_on_startup = FALSE,
00054     .resume_state = 0,
00055     .resume_playback_on_startup_time = 0,
00056     .chardet_detector = NULL,
00057     .chardet_fallback = NULL,
00058     .chardet_fallback_s = NULL,
00059     .output_buffer_size = 500,
00060     .show_filepopup_for_tuple = TRUE,
00061     .cover_name_include = NULL,        /* words identifying covers */
00062     .cover_name_exclude = NULL,        /* words that might not show up in cover names */
00063     .recurse_for_cover = FALSE,
00064     .recurse_for_cover_depth = 0,
00065     .filepopup_pixelsize = 150,        /* short side length of the picture in the filepopup */
00066     .filepopup_delay = 5,              /* delay until the filepopup comes up (1/10 seconds) */
00067     .use_file_cover = FALSE,           /* use filename.jpg for coverart */
00068     .filepopup_showprogressbar = TRUE,
00069     .close_jtf_dialog = TRUE,          /* close jtf dialog on jump */
00070     .software_volume_control = FALSE,
00071     .remember_jtf_entry = TRUE,
00072     .output_bit_depth = 16,
00073     .enable_replay_gain = TRUE,
00074     .enable_clipping_prevention = TRUE,
00075     .replay_gain_track = TRUE,         /* track mode */
00076     .replay_gain_album = FALSE,        /* album mode */
00077     .replay_gain_preamp = 0,
00078     .default_gain = 0,
00079     .sw_volume_left = 100, .sw_volume_right = 100,
00080 
00081     /* libaudgui stuff */
00082     .no_confirm_playlist_delete = FALSE,
00083     .playlist_manager_x = 0,
00084     .playlist_manager_y = 0,
00085     .playlist_manager_width = 0,
00086     .playlist_manager_height = 0,
00087     .playlist_manager_close_on_activate = FALSE,
00088 
00089     /* not saved */
00090     .verbose = FALSE,
00091 };
00092 
00093 typedef struct aud_cfg_boolent_t {
00094     char const *be_vname;
00095     gboolean *be_vloc;
00096     gboolean be_wrt;
00097 } aud_cfg_boolent;
00098 
00099 typedef struct aud_cfg_nument_t {
00100     char const *ie_vname;
00101     gint *ie_vloc;
00102     gboolean ie_wrt;
00103 } aud_cfg_nument;
00104 
00105 typedef struct aud_cfg_strent_t {
00106     char const *se_vname;
00107     char **se_vloc;
00108     gboolean se_wrt;
00109 } aud_cfg_strent;
00110 
00111 static aud_cfg_boolent aud_boolents[] = {
00112     {"show_numbers_in_pl", &cfg.show_numbers_in_pl, TRUE},
00113     {"leading_zero", & cfg.leading_zero, TRUE},
00114     {"no_playlist_advance", &cfg.no_playlist_advance, TRUE},
00115     {"advance_on_delete", & cfg.advance_on_delete, TRUE},
00116     {"clear_playlist", & cfg.clear_playlist, TRUE},
00117     {"open_to_temporary", & cfg.open_to_temporary, TRUE},
00118     {"shuffle", &cfg.shuffle, TRUE},
00119     {"repeat", &cfg.repeat, TRUE},
00120     {"stop_after_current_song", &cfg.stopaftersong, TRUE},
00121     {"equalizer_active", &cfg.equalizer_active, TRUE},
00122     {"equalizer_autoload", &cfg.equalizer_autoload, TRUE},
00123     {"close_dialog_open", &cfg.close_dialog_open, TRUE},
00124     {"resume_playback_on_startup", &cfg.resume_playback_on_startup, TRUE},
00125     {"show_filepopup_for_tuple", &cfg.show_filepopup_for_tuple, TRUE},
00126     {"recurse_for_cover", &cfg.recurse_for_cover, TRUE},
00127     {"use_file_cover", &cfg.use_file_cover, TRUE},
00128     {"filepopup_showprogressbar", &cfg.filepopup_showprogressbar, TRUE},
00129     {"close_jtf_dialog", &cfg.close_jtf_dialog, TRUE},
00130     {"software_volume_control", &cfg.software_volume_control, TRUE},
00131     {"remember_jtf_entry", &cfg.remember_jtf_entry, TRUE},
00132     {"enable_replay_gain", &cfg.enable_replay_gain, TRUE},
00133     {"enable_clipping_prevention", &cfg.enable_clipping_prevention, TRUE},
00134     {"replay_gain_track", &cfg.replay_gain_track, TRUE},
00135     {"replay_gain_album", &cfg.replay_gain_album, TRUE},
00136     {"no_confirm_playlist_delete", &cfg.no_confirm_playlist_delete, TRUE},
00137     {"playlist_manager_close_on_activate", & cfg.playlist_manager_close_on_activate, TRUE},
00138     {"use_proxy", & cfg.use_proxy, TRUE},
00139     {"use_proxy_auth", & cfg.use_proxy_auth, TRUE},
00140 };
00141 
00142 static gint ncfgbent = G_N_ELEMENTS(aud_boolents);
00143 
00144 static aud_cfg_nument aud_numents[] = {
00145     {"titlestring_preset", &cfg.titlestring_preset, TRUE},
00146     {"resume_state", & cfg.resume_state, TRUE},
00147     {"resume_playback_on_startup_time", &cfg.resume_playback_on_startup_time, TRUE},
00148     {"output_buffer_size", &cfg.output_buffer_size, TRUE},
00149     {"recurse_for_cover_depth", &cfg.recurse_for_cover_depth, TRUE},
00150     {"filepopup_pixelsize", &cfg.filepopup_pixelsize, TRUE},
00151     {"filepopup_delay", &cfg.filepopup_delay, TRUE},
00152     {"output_bit_depth", &cfg.output_bit_depth, TRUE},
00153     {"sw_volume_left", & cfg.sw_volume_left, TRUE},
00154     {"sw_volume_right", & cfg.sw_volume_right, TRUE},
00155     {"playlist_manager_x", & cfg.playlist_manager_x, TRUE},
00156     {"playlist_manager_y", & cfg.playlist_manager_y, TRUE},
00157     {"playlist_manager_width", & cfg.playlist_manager_width, TRUE},
00158     {"playlist_manager_height", & cfg.playlist_manager_height, TRUE},
00159 };
00160 
00161 static gint ncfgient = G_N_ELEMENTS(aud_numents);
00162 
00163 static aud_cfg_strent aud_strents[] = {
00164     {"eqpreset_default_file", &cfg.eqpreset_default_file, TRUE},
00165     {"eqpreset_extension", &cfg.eqpreset_extension, TRUE},
00166     {"filesel_path", &cfg.filesel_path, FALSE},
00167     {"playlist_path", &cfg.playlist_path, FALSE},
00168     {"generic_title_format", &cfg.gentitle_format, TRUE},
00169     {"chardet_detector", &cfg.chardet_detector, TRUE},
00170     {"chardet_fallback", &cfg.chardet_fallback, TRUE},
00171     {"cover_name_include", &cfg.cover_name_include, TRUE},
00172     {"cover_name_exclude", &cfg.cover_name_exclude, TRUE},
00173     {"proxy_host", & cfg.proxy_host, TRUE},
00174     {"proxy_port", & cfg.proxy_port, TRUE},
00175     {"proxy_user", & cfg.proxy_user, TRUE},
00176     {"proxy_pass", & cfg.proxy_pass, TRUE},
00177 };
00178 
00179 static gint ncfgsent = G_N_ELEMENTS(aud_strents);
00180 
00181 void aud_config_chardet_update(void)
00182 {
00183     if (cfg.chardet_fallback_s != NULL)
00184         g_strfreev(cfg.chardet_fallback_s);
00185     cfg.chardet_fallback_s = g_strsplit_set(cfg.chardet_fallback, " ,:;|/", 0);
00186 }
00187 
00188 
00189 void
00190 aud_config_load(void)
00191 {
00192     mcs_handle_t *db;
00193     gint i, length;
00194 
00195     if (! (db = cfg_db_open ()))
00196         return;
00197 
00198     for (i = 0; i < ncfgbent; ++i) {
00199         cfg_db_get_bool(db, NULL,
00200                             aud_boolents[i].be_vname,
00201                             aud_boolents[i].be_vloc);
00202     }
00203 
00204     for (i = 0; i < ncfgient; ++i) {
00205         cfg_db_get_int(db, NULL,
00206                            aud_numents[i].ie_vname,
00207                            aud_numents[i].ie_vloc);
00208     }
00209 
00210     for (i = 0; i < ncfgsent; ++i) {
00211         cfg_db_get_string(db, NULL,
00212                               aud_strents[i].se_vname,
00213                               aud_strents[i].se_vloc);
00214     }
00215 
00216     /* Preset */
00217     cfg_db_get_float(db, NULL, "equalizer_preamp", &cfg.equalizer_preamp);
00218     for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) {
00219         gchar eqtext[32];
00220 
00221         g_snprintf(eqtext, sizeof(eqtext), "equalizer_band%d", i);
00222         cfg_db_get_float(db, NULL, eqtext, &cfg.equalizer_bands[i]);
00223     }
00224 
00225     /* History */
00226     if (cfg_db_get_int(db, NULL, "url_history_length", &length)) {
00227         for (i = 1; i <= length; i++) {
00228             gchar str[19], *tmp;
00229 
00230             g_snprintf(str, sizeof(str), "url_history%d", i);
00231             if (cfg_db_get_string(db, NULL, str, &tmp))
00232                 cfg.url_history = g_list_append(cfg.url_history, tmp);
00233         }
00234     }
00235 
00236     /* RG settings */
00237     cfg_db_get_float(db, NULL, "replay_gain_preamp", &cfg.replay_gain_preamp);
00238     cfg_db_get_float(db, NULL, "default_gain", &cfg.default_gain);
00239 
00240     cfg_db_close(db);
00241 
00242     if (!cfg.gentitle_format)
00243         cfg.gentitle_format = g_strdup("${?artist:${artist} - }${?album:${album} - }${title}");
00244 
00245     if (!cfg.chardet_detector)
00246         cfg.chardet_detector = g_strdup("");
00247 
00248     if (!cfg.chardet_fallback)
00249         cfg.chardet_fallback = g_strdup("");
00250 
00251     aud_config_chardet_update();
00252 
00253     if (!cfg.cover_name_include)
00254         cfg.cover_name_include = g_strdup("album,folder");
00255 
00256     if (!cfg.cover_name_exclude)
00257         cfg.cover_name_exclude = g_strdup("back");
00258 }
00259 
00260 void
00261 aud_config_save(void)
00262 {
00263     GList *node;
00264     gchar *str;
00265     gint i;
00266     mcs_handle_t *db;
00267 
00268     hook_call ("config save", NULL);
00269 
00270     cfg.resume_state = playback_get_playing () ? (playback_get_paused () ? 2 :
00271      1) : 0;
00272     cfg.resume_playback_on_startup_time = playback_get_playing () ?
00273      playback_get_time () : 0;
00274 
00275     if (! (db = cfg_db_open ()))
00276         return;
00277 
00278     for (i = 0; i < ncfgbent; ++i)
00279         if (aud_boolents[i].be_wrt)
00280             cfg_db_set_bool(db, NULL,
00281                                 aud_boolents[i].be_vname,
00282                                 *aud_boolents[i].be_vloc);
00283 
00284     for (i = 0; i < ncfgient; ++i)
00285         if (aud_numents[i].ie_wrt)
00286             cfg_db_set_int(db, NULL,
00287                                aud_numents[i].ie_vname,
00288                                *aud_numents[i].ie_vloc);
00289 
00290     for (i = 0; i < ncfgsent; ++i) {
00291         if (aud_strents[i].se_wrt)
00292             cfg_db_set_string(db, NULL,
00293                                   aud_strents[i].se_vname,
00294                                   *aud_strents[i].se_vloc);
00295     }
00296 
00297     cfg_db_set_float(db, NULL, "equalizer_preamp", cfg.equalizer_preamp);
00298 
00299     /* RG settings */
00300     cfg_db_set_float(db, NULL, "replay_gain_preamp", cfg.replay_gain_preamp);
00301     cfg_db_set_float(db, NULL, "default_gain",       cfg.default_gain);
00302 
00303     for (i = 0; i < 10; i++) {
00304         str = g_strdup_printf("equalizer_band%d", i);
00305         cfg_db_set_float(db, NULL, str, cfg.equalizer_bands[i]);
00306         g_free(str);
00307     }
00308 
00309     if (cfg.filesel_path)
00310         cfg_db_set_string(db, NULL, "filesel_path", cfg.filesel_path);
00311 
00312     if (cfg.playlist_path)
00313         cfg_db_set_string(db, NULL, "playlist_path", cfg.playlist_path);
00314 
00315     cfg_db_set_int(db, NULL, "url_history_length",
00316                        g_list_length(cfg.url_history));
00317 
00318     for (node = cfg.url_history, i = 1; node; node = g_list_next(node), i++) {
00319         str = g_strdup_printf("url_history%d", i);
00320         cfg_db_set_string(db, NULL, str, node->data);
00321         g_free(str);
00322     }
00323 
00324     cfg_db_close(db);
00325 }