Audacious
$Id:Doxyfile42802007-03-2104:39:00Znenolod$
|
00001 /* Audacious - Cross-platform multimedia player 00002 * Copyright (C) 2005-2008 Audacious team 00003 * 00004 * This program is free software; you can redistribute it and/or modify 00005 * it under the terms of the GNU General Public License as published by 00006 * the Free Software Foundation; under version 3 of the License. 00007 * 00008 * This program is distributed in the hope that it will be useful, 00009 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00011 * GNU General Public License for more details. 00012 * 00013 * You should have received a copy of the GNU General Public License 00014 * along with this program. If not, see <http://www.gnu.org/licenses>. 00015 * 00016 * The Audacious team does not consider modular code linking to 00017 * Audacious or using our public API to be a derived work. 00018 */ 00019 00020 #include <glib.h> 00021 00022 #include "config.h" 00023 #include "debug.h" 00024 #include "i18n.h" 00025 #include "interface.h" 00026 #include "misc.h" 00027 00028 static EqualizerPreset * equalizer_preset_new (const gchar * name) 00029 { 00030 EqualizerPreset *preset = g_new0(EqualizerPreset, 1); 00031 preset->name = g_strdup(name); 00032 return preset; 00033 } 00034 00035 GList * 00036 equalizer_read_presets(const gchar *basename) 00037 { 00038 gchar *filename, *name; 00039 GKeyFile *rcfile; 00040 GError *error = NULL; 00041 GList *list = NULL; 00042 gint i, p = 0; 00043 EqualizerPreset *preset; 00044 00045 filename = g_build_filename (get_path (AUD_PATH_USER_DIR), basename, NULL); 00046 00047 rcfile = g_key_file_new(); 00048 if (!g_key_file_load_from_file(rcfile, filename, G_KEY_FILE_NONE, &error)) 00049 { 00050 g_free(filename); 00051 filename = g_build_filename (get_path (AUD_PATH_DATA_DIR), basename, 00052 NULL); 00053 00054 error = NULL; 00055 if (!g_key_file_load_from_file(rcfile, filename, G_KEY_FILE_NONE, &error)) 00056 { 00057 g_free(filename); 00058 return NULL; 00059 } 00060 } 00061 00062 g_free(filename); 00063 00064 for (;;) 00065 { 00066 gchar section[32]; 00067 00068 error = NULL; 00069 g_snprintf(section, sizeof(section), "Preset%d", p++); 00070 00071 if ((name = g_key_file_get_string(rcfile, "Presets", section, &error)) != NULL) 00072 { 00073 error = NULL; 00074 00075 preset = g_new0(EqualizerPreset, 1); 00076 preset->name = name; 00077 preset->preamp = g_key_file_get_double(rcfile, name, "Preamp", &error); 00078 00079 for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) 00080 { 00081 gchar band[16]; 00082 g_snprintf(band, sizeof(band), "Band%d", i); 00083 00084 error = NULL; 00085 00086 preset->bands[i] = g_key_file_get_double(rcfile, name, band, &error); 00087 } 00088 00089 list = g_list_prepend(list, preset); 00090 } 00091 else 00092 break; 00093 } 00094 00095 list = g_list_reverse(list); 00096 g_key_file_free(rcfile); 00097 00098 return list; 00099 } 00100 00101 gboolean equalizer_write_preset_file (GList * list, const gchar * basename) 00102 { 00103 gchar *filename, *tmp; 00104 gint i, p; 00105 EqualizerPreset *preset; 00106 GKeyFile *rcfile; 00107 GList *node; 00108 gchar *data; 00109 gsize len; 00110 GError *error = NULL; 00111 00112 rcfile = g_key_file_new(); 00113 p = 0; 00114 00115 for (node = list; node; node = g_list_next(node)) 00116 { 00117 preset = node->data; 00118 00119 tmp = g_strdup_printf("Preset%d", p++); 00120 g_key_file_set_string(rcfile, "Presets", tmp, preset->name); 00121 g_free(tmp); 00122 00123 g_key_file_set_double(rcfile, preset->name, "Preamp", preset->preamp); 00124 00125 for (i = 0; i < 10; i++) 00126 { 00127 tmp = g_strdup_printf("Band%d", i); 00128 g_key_file_set_double(rcfile, preset->name, tmp, 00129 preset->bands[i]); 00130 g_free(tmp); 00131 } 00132 } 00133 00134 filename = g_build_filename (get_path (AUD_PATH_USER_DIR), basename, NULL); 00135 00136 data = g_key_file_to_data(rcfile, &len, &error); 00137 gboolean success = g_file_set_contents (filename, data, len, & error); 00138 g_free(data); 00139 00140 g_key_file_free(rcfile); 00141 g_free(filename); 00142 return success; 00143 } 00144 00145 GList * 00146 import_winamp_eqf(VFSFile * file) 00147 { 00148 gchar header[31]; 00149 gchar bands[11]; 00150 gint i = 0; 00151 EqualizerPreset *preset = NULL; 00152 GList *list = NULL; 00153 gchar *markup; 00154 gchar preset_name[0xb4]; 00155 00156 if (vfs_fread (header, 1, sizeof header, file) != sizeof header || strncmp 00157 (header, "Winamp EQ library file v1.1", 27)) 00158 goto error; 00159 00160 AUDDBG("The EQF header is OK\n"); 00161 00162 if (vfs_fseek(file, 0x1f, SEEK_SET) == -1) goto error; 00163 00164 while (vfs_fread(preset_name, 1, 0xb4, file) == 0xb4) { 00165 AUDDBG("The preset name is '%s'\n", preset_name); 00166 if (vfs_fseek (file, 0x4d, SEEK_CUR)) /* unknown crap --asphyx */ 00167 break; 00168 if (vfs_fread(bands, 1, 11, file) != 11) break; 00169 00170 preset = equalizer_preset_new(preset_name); 00171 /*this was divided by 63, but shouldn't it be 64? --majeru*/ 00172 preset->preamp = EQUALIZER_MAX_GAIN - ((bands[10] * EQUALIZER_MAX_GAIN * 2) / 64.0); 00173 00174 for (i = 0; i < 10; i++) 00175 preset->bands[i] = EQUALIZER_MAX_GAIN - ((bands[i] * EQUALIZER_MAX_GAIN * 2) / 64.0); 00176 00177 list = g_list_prepend(list, preset); 00178 } 00179 00180 list = g_list_reverse(list); 00181 if (list == NULL) goto error; 00182 00183 return list; 00184 00185 error: 00186 markup = g_strdup_printf (_("Error importing Winamp EQF file '%s'"), 00187 file->uri); 00188 interface_show_error(markup); 00189 00190 g_free(markup); 00191 return NULL; 00192 } 00193 00194 gboolean save_preset_file (EqualizerPreset * preset, const gchar * filename) 00195 { 00196 GKeyFile *rcfile; 00197 gint i; 00198 gchar *data; 00199 gsize len; 00200 GError *error = NULL; 00201 00202 rcfile = g_key_file_new(); 00203 g_key_file_set_double(rcfile, "Equalizer preset", "Preamp", preset->preamp); 00204 00205 for (i = 0; i < 10; i++) { 00206 gchar tmp[7]; 00207 g_snprintf(tmp, sizeof(tmp), "Band%d", i); 00208 g_key_file_set_double(rcfile, "Equalizer preset", tmp, 00209 preset->bands[i]); 00210 } 00211 00212 data = g_key_file_to_data(rcfile, &len, &error); 00213 00214 gboolean success = FALSE; 00215 00216 VFSFile * file = vfs_fopen (filename, "w"); 00217 if (file == NULL) 00218 goto DONE; 00219 if (vfs_fwrite (data, 1, strlen (data), file) == strlen (data)) 00220 success = TRUE; 00221 vfs_fclose (file); 00222 00223 DONE: 00224 g_free(data); 00225 g_key_file_free(rcfile); 00226 return success; 00227 } 00228 00229 static EqualizerPreset * equalizer_read_aud_preset (const gchar * filename) 00230 { 00231 gint i; 00232 EqualizerPreset *preset; 00233 GKeyFile *rcfile; 00234 GError *error = NULL; 00235 00236 preset = g_new0(EqualizerPreset, 1); 00237 preset->name = g_strdup(""); 00238 00239 rcfile = g_key_file_new(); 00240 if (!g_key_file_load_from_file(rcfile, filename, G_KEY_FILE_NONE, &error)) 00241 { 00242 g_key_file_free(rcfile); 00243 return NULL; 00244 } 00245 00246 preset->preamp = g_key_file_get_double(rcfile, "Equalizer preset", "Preamp", &error); 00247 for (i = 0; i < 10; i++) 00248 { 00249 gchar tmp[7]; 00250 g_snprintf(tmp, sizeof(tmp), "Band%d", i); 00251 00252 preset->bands[i] = g_key_file_get_double(rcfile, "Equalizer preset", tmp, &error); 00253 } 00254 00255 g_key_file_free(rcfile); 00256 return preset; 00257 } 00258 00259 EqualizerPreset * 00260 load_preset_file(const gchar *filename) 00261 { 00262 if (filename) { 00263 EqualizerPreset *preset = equalizer_read_aud_preset(filename); 00264 return preset; 00265 } 00266 return NULL; 00267 }