Audacious  $Id:Doxyfile42802007-03-2104:39:00Znenolod$
equalizer_preset.c
Go to the documentation of this file.
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 }