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 "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))
00168 break;
00169 if (vfs_fread(bands, 1, 11, file) != 11) break;
00170
00171 preset = equalizer_preset_new(preset_name);
00172
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 }