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 "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_message(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 }