00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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))
00167 break;
00168 if (vfs_fread(bands, 1, 11, file) != 11) break;
00169
00170 preset = equalizer_preset_new(preset_name);
00171
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 }