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 "main.h" 00027 #include "misc.h" 00028 00029 static EqualizerPreset * equalizer_preset_new (const gchar * name) 00030 { 00031 EqualizerPreset *preset = g_new0(EqualizerPreset, 1); 00032 preset->name = g_strdup(name); 00033 return preset; 00034 } 00035 00036 GList * 00037 equalizer_read_presets(const gchar *basename) 00038 { 00039 gchar *filename, *name; 00040 GKeyFile *rcfile; 00041 GError *error = NULL; 00042 GList *list = NULL; 00043 gint i, p = 0; 00044 EqualizerPreset *preset; 00045 00046 filename = g_build_filename(aud_paths[BMP_PATH_USER_DIR], basename, NULL); 00047 00048 rcfile = g_key_file_new(); 00049 if (!g_key_file_load_from_file(rcfile, filename, G_KEY_FILE_NONE, &error)) 00050 { 00051 g_free(filename); 00052 filename = g_build_filename(DATA_DIR, basename, 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 00135 filename = g_build_filename(aud_paths[BMP_PATH_USER_DIR], basename, NULL); 00136 00137 data = g_key_file_to_data(rcfile, &len, &error); 00138 gboolean success = g_file_set_contents (filename, data, len, & error); 00139 g_free(data); 00140 00141 g_key_file_free(rcfile); 00142 g_free(filename); 00143 return success; 00144 } 00145 00146 GList * 00147 import_winamp_eqf(VFSFile * file) 00148 { 00149 gchar header[31]; 00150 gchar bands[11]; 00151 gint i = 0; 00152 EqualizerPreset *preset = NULL; 00153 GList *list = NULL; 00154 gchar *markup; 00155 gchar preset_name[0xb4]; 00156 00157 if (vfs_fread (header, 1, sizeof header, file) != sizeof header || strncmp 00158 (header, "Winamp EQ library file v1.1", 27)) 00159 goto error; 00160 00161 AUDDBG("The EQF header is OK\n"); 00162 00163 if (vfs_fseek(file, 0x1f, SEEK_SET) == -1) goto error; 00164 00165 while (vfs_fread(preset_name, 1, 0xb4, file) == 0xb4) { 00166 AUDDBG("The preset name is '%s'\n", preset_name); 00167 if (vfs_fseek (file, 0x4d, SEEK_CUR)) /* unknown crap --asphyx */ 00168 break; 00169 if (vfs_fread(bands, 1, 11, file) != 11) break; 00170 00171 preset = equalizer_preset_new(preset_name); 00172 /*this was divided by 63, but shouldn't it be 64? --majeru*/ 00173 preset->preamp = EQUALIZER_MAX_GAIN - ((bands[10] * EQUALIZER_MAX_GAIN * 2) / 64.0); 00174 00175 for (i = 0; i < 10; i++) 00176 preset->bands[i] = EQUALIZER_MAX_GAIN - ((bands[i] * EQUALIZER_MAX_GAIN * 2) / 64.0); 00177 00178 list = g_list_prepend(list, preset); 00179 } 00180 00181 list = g_list_reverse(list); 00182 if (list == NULL) goto error; 00183 00184 return list; 00185 00186 error: 00187 markup = g_strdup_printf (_("Error importing Winamp EQF file '%s'"), 00188 file->uri); 00189 interface_show_error_message(markup); 00190 00191 g_free(markup); 00192 return NULL; 00193 } 00194 00195 gboolean save_preset_file (EqualizerPreset * preset, const gchar * filename) 00196 { 00197 GKeyFile *rcfile; 00198 gint i; 00199 gchar *data; 00200 gsize len; 00201 GError *error = NULL; 00202 00203 rcfile = g_key_file_new(); 00204 g_key_file_set_double(rcfile, "Equalizer preset", "Preamp", preset->preamp); 00205 00206 for (i = 0; i < 10; i++) { 00207 gchar tmp[7]; 00208 g_snprintf(tmp, sizeof(tmp), "Band%d", i); 00209 g_key_file_set_double(rcfile, "Equalizer preset", tmp, 00210 preset->bands[i]); 00211 } 00212 00213 data = g_key_file_to_data(rcfile, &len, &error); 00214 00215 gboolean success = FALSE; 00216 00217 VFSFile * file = vfs_fopen (filename, "w"); 00218 if (file == NULL) 00219 goto DONE; 00220 if (vfs_fwrite (data, 1, strlen (data), file) == strlen (data)) 00221 success = TRUE; 00222 vfs_fclose (file); 00223 00224 DONE: 00225 g_free(data); 00226 g_key_file_free(rcfile); 00227 return success; 00228 } 00229 00230 static EqualizerPreset * equalizer_read_aud_preset (const gchar * filename) 00231 { 00232 gint i; 00233 EqualizerPreset *preset; 00234 GKeyFile *rcfile; 00235 GError *error = NULL; 00236 00237 preset = g_new0(EqualizerPreset, 1); 00238 preset->name = g_strdup(""); 00239 00240 rcfile = g_key_file_new(); 00241 if (!g_key_file_load_from_file(rcfile, filename, G_KEY_FILE_NONE, &error)) 00242 { 00243 g_key_file_free(rcfile); 00244 return NULL; 00245 } 00246 00247 preset->preamp = g_key_file_get_double(rcfile, "Equalizer preset", "Preamp", &error); 00248 for (i = 0; i < 10; i++) 00249 { 00250 gchar tmp[7]; 00251 g_snprintf(tmp, sizeof(tmp), "Band%d", i); 00252 00253 preset->bands[i] = g_key_file_get_double(rcfile, "Equalizer preset", tmp, &error); 00254 } 00255 00256 g_key_file_free(rcfile); 00257 return preset; 00258 } 00259 00260 EqualizerPreset * 00261 load_preset_file(const gchar *filename) 00262 { 00263 if (filename) { 00264 EqualizerPreset *preset = equalizer_read_aud_preset(filename); 00265 return preset; 00266 } 00267 return NULL; 00268 }