diff options
Diffstat (limited to 'src/audacious/equalizer_preset.c')
-rw-r--r-- | src/audacious/equalizer_preset.c | 272 |
1 files changed, 131 insertions, 141 deletions
diff --git a/src/audacious/equalizer_preset.c b/src/audacious/equalizer_preset.c index dce62f9..6c70eb8 100644 --- a/src/audacious/equalizer_preset.c +++ b/src/audacious/equalizer_preset.c @@ -1,6 +1,7 @@ /* * equalizer_preset.c - * Copyright 2003-2011 Eugene Zagidullin, William Pitcock, and John Lindgren + * Copyright 2003-2013 Eugene Zagidullin, William Pitcock, John Lindgren, and + * Thomas Lange * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -18,235 +19,224 @@ */ #include <glib.h> +#include <math.h> #include <string.h> +#include <libaudcore/audstrings.h> + #include "debug.h" #include "i18n.h" -#include "interface.h" #include "misc.h" -static EqualizerPreset * equalizer_preset_new (const char * name) +EqualizerPreset * equalizer_preset_new (const char * name) { - EqualizerPreset *preset = g_new0(EqualizerPreset, 1); - preset->name = g_strdup(name); + EqualizerPreset * preset = g_slice_new0 (EqualizerPreset); + preset->name = str_get (name); return preset; } +void equalizer_preset_free (EqualizerPreset * preset) +{ + str_unref (preset->name); + g_slice_free (EqualizerPreset, preset); +} + Index * equalizer_read_presets (const char * basename) { - char *filename, *name; - GKeyFile *rcfile; - int i, p = 0; - EqualizerPreset *preset; + GKeyFile * rcfile = g_key_file_new (); - filename = g_build_filename (get_path (AUD_PATH_USER_DIR), basename, NULL); + char * filename = filename_build (get_path (AUD_PATH_USER_DIR), basename); - rcfile = g_key_file_new(); - if (!g_key_file_load_from_file(rcfile, filename, G_KEY_FILE_NONE, NULL)) + if (! g_key_file_load_from_file (rcfile, filename, G_KEY_FILE_NONE, NULL)) { - g_free(filename); - filename = g_build_filename (get_path (AUD_PATH_DATA_DIR), basename, - NULL); + str_unref (filename); + filename = filename_build (get_path (AUD_PATH_DATA_DIR), basename); - if (!g_key_file_load_from_file(rcfile, filename, G_KEY_FILE_NONE, NULL)) + if (! g_key_file_load_from_file (rcfile, filename, G_KEY_FILE_NONE, NULL)) { - g_free(filename); - return NULL; + str_unref (filename); + g_key_file_free (rcfile); + return NULL; } } - g_free(filename); + str_unref (filename); Index * list = index_new (); - for (;;) + for (int p = 0;; p ++) { - char section[32]; + SPRINTF (section, "Preset%d", p); - g_snprintf(section, sizeof(section), "Preset%d", p++); + char * name = g_key_file_get_string (rcfile, "Presets", section, NULL); + if (! name) + break; - if ((name = g_key_file_get_string(rcfile, "Presets", section, NULL)) != NULL) - { - preset = g_new0(EqualizerPreset, 1); - preset->name = name; - preset->preamp = g_key_file_get_double(rcfile, name, "Preamp", NULL); + EqualizerPreset * preset = equalizer_preset_new (name); + preset->preamp = g_key_file_get_double (rcfile, name, "Preamp", NULL); - for (i = 0; i < AUD_EQUALIZER_NBANDS; i++) - { - char band[16]; - g_snprintf(band, sizeof(band), "Band%d", i); + for (int i = 0; i < AUD_EQUALIZER_NBANDS; i++) + { + SPRINTF (band, "Band%d", i); + preset->bands[i] = g_key_file_get_double (rcfile, name, band, NULL); + } - preset->bands[i] = g_key_file_get_double(rcfile, name, band, NULL); - } + index_insert (list, -1, preset); - index_append (list, preset); - } - else - break; + g_free (name); } - g_key_file_free(rcfile); + g_key_file_free (rcfile); return list; } -bool_t equalizer_write_preset_file (Index * list, const char * basename) +bool_t equalizer_write_presets (Index * list, const char * basename) { - char *filename; - int i; - GKeyFile *rcfile; - char *data; - gsize len; - - rcfile = g_key_file_new(); + GKeyFile * rcfile = g_key_file_new (); for (int p = 0; p < index_count (list); p ++) { EqualizerPreset * preset = index_get (list, p); - char * tmp = g_strdup_printf ("Preset%d", p); - g_key_file_set_string(rcfile, "Presets", tmp, preset->name); - g_free(tmp); - - g_key_file_set_double(rcfile, preset->name, "Preamp", preset->preamp); + SPRINTF (tmp, "Preset%d", p); + g_key_file_set_string (rcfile, "Presets", tmp, preset->name); + g_key_file_set_double (rcfile, preset->name, "Preamp", preset->preamp); - for (i = 0; i < 10; i++) + for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++) { - tmp = g_strdup_printf("Band%d", i); - g_key_file_set_double(rcfile, preset->name, tmp, - preset->bands[i]); - g_free(tmp); + SPRINTF (tmp, "Band%d", i); + g_key_file_set_double (rcfile, preset->name, tmp, preset->bands[i]); } } - filename = g_build_filename (get_path (AUD_PATH_USER_DIR), basename, NULL); + size_t len; + char * data = g_key_file_to_data (rcfile, & len, NULL); - data = g_key_file_to_data(rcfile, &len, NULL); + char * filename = filename_build (get_path (AUD_PATH_USER_DIR), basename); bool_t success = g_file_set_contents (filename, data, len, NULL); - g_free(data); + str_unref (filename); + + g_key_file_free (rcfile); + g_free (data); - g_key_file_free(rcfile); - g_free(filename); return success; } -Index * import_winamp_eqf (VFSFile * file) +/* Note: Winamp 2.x had a +/- 20 dB range. + * Winamp 5.x had a +/- 12 dB range, which we use here. */ +#define FROM_WINAMP_VAL(x) ((31.5 - (x)) * (12.0 / 31.5)) +#define TO_WINAMP_VAL(x) (round (31.5 - (x) * (31.5 / 12.0))) + +Index * import_winamp_presets (VFSFile * file) { char header[31]; char bands[11]; - int i = 0; - EqualizerPreset *preset = NULL; - char *markup; - char preset_name[0xb4]; + char preset_name[181]; - if (vfs_fread (header, 1, sizeof header, file) != sizeof header || strncmp - (header, "Winamp EQ library file v1.1", 27)) - goto error; + if (vfs_fread (header, 1, sizeof header, file) != sizeof header || + strncmp (header, "Winamp EQ library file v1.1", 27)) + return NULL; - AUDDBG("The EQF header is OK\n"); + Index * list = index_new (); - if (vfs_fseek(file, 0x1f, SEEK_SET) == -1) goto error; + while (vfs_fread (preset_name, 1, 180, file) == 180) + { + preset_name[180] = 0; /* protect against buffer overflow */ - Index * list = index_new (); + if (vfs_fseek (file, 77, SEEK_CUR)) /* unknown crap --asphyx */ + break; - while (vfs_fread(preset_name, 1, 0xb4, file) == 0xb4) { - AUDDBG("The preset name is '%s'\n", preset_name); - if (vfs_fseek (file, 0x4d, SEEK_CUR)) /* unknown crap --asphyx */ + if (vfs_fread (bands, 1, 11, file) != 11) break; - if (vfs_fread(bands, 1, 11, file) != 11) break; - preset = equalizer_preset_new(preset_name); - /*this was divided by 63, but shouldn't it be 64? --majeru*/ - preset->preamp = EQUALIZER_MAX_GAIN - ((bands[10] * EQUALIZER_MAX_GAIN * 2) / 64.0); + EqualizerPreset * preset = equalizer_preset_new (preset_name); + preset->preamp = FROM_WINAMP_VAL (bands[10]); - for (i = 0; i < 10; i++) - preset->bands[i] = EQUALIZER_MAX_GAIN - ((bands[i] * EQUALIZER_MAX_GAIN * 2) / 64.0); + for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++) + preset->bands[i] = FROM_WINAMP_VAL (bands[i]); - index_append (list, preset); + index_insert (list, -1, preset); } return list; +} + +bool_t export_winamp_preset (EqualizerPreset * preset, VFSFile * file) +{ + char name[257]; + char bands[11]; -error: - markup = g_strdup_printf (_("Error importing Winamp EQF file '%s'"), - vfs_get_filename (file)); - interface_show_error(markup); + if (vfs_fwrite ("Winamp EQ library file v1.1\x1a!--", 1, 31, file) != 31) + return FALSE; - g_free(markup); - return NULL; + strncpy (name, preset->name, 257); + + if (vfs_fwrite (name, 1, 257, file) != 257) + return FALSE; + + for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++) + bands[i] = TO_WINAMP_VAL (preset->bands[i]); + + bands[10] = TO_WINAMP_VAL (preset->preamp); + + if (vfs_fwrite (bands, 1, 11, file) != 11) + return FALSE; + + return TRUE; } bool_t save_preset_file (EqualizerPreset * preset, const char * filename) { - GKeyFile *rcfile; - int i; - char *data; - gsize len; - - rcfile = g_key_file_new(); - g_key_file_set_double(rcfile, "Equalizer preset", "Preamp", preset->preamp); - - for (i = 0; i < 10; i++) { - char tmp[7]; - g_snprintf(tmp, sizeof(tmp), "Band%d", i); - g_key_file_set_double(rcfile, "Equalizer preset", tmp, - preset->bands[i]); + GKeyFile * rcfile = g_key_file_new (); + + g_key_file_set_double (rcfile, "Equalizer preset", "Preamp", preset->preamp); + + for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++) + { + SPRINTF (tmp, "Band%d", i); + g_key_file_set_double (rcfile, "Equalizer preset", tmp, preset->bands[i]); } - data = g_key_file_to_data(rcfile, &len, NULL); + size_t len; + char * data = g_key_file_to_data (rcfile, & len, NULL); + VFSFile * file = vfs_fopen (filename, "w"); bool_t success = FALSE; - VFSFile * file = vfs_fopen (filename, "w"); - if (file == NULL) - goto DONE; - if (vfs_fwrite (data, 1, strlen (data), file) == strlen (data)) - success = TRUE; - vfs_fclose (file); - -DONE: - g_free(data); - g_key_file_free(rcfile); + if (file) + { + success = (vfs_fwrite (data, 1, len, file) == len); + vfs_fclose (file); + } + + g_key_file_free (rcfile); + g_free (data); + return success; } -static EqualizerPreset * equalizer_read_aud_preset (const char * filename) +EqualizerPreset * load_preset_file (const char * filename) { - int i; - EqualizerPreset *preset; - GKeyFile *rcfile; - - preset = g_new0(EqualizerPreset, 1); - preset->name = g_strdup(""); + GKeyFile * rcfile = g_key_file_new (); - rcfile = g_key_file_new(); - if (!g_key_file_load_from_file(rcfile, filename, G_KEY_FILE_NONE, NULL)) + if (! g_key_file_load_from_file (rcfile, filename, G_KEY_FILE_NONE, NULL)) { - g_key_file_free(rcfile); - g_free(preset->name); - g_free(preset); + g_key_file_free (rcfile); return NULL; } - preset->preamp = g_key_file_get_double(rcfile, "Equalizer preset", "Preamp", NULL); - for (i = 0; i < 10; i++) - { - char tmp[7]; - g_snprintf(tmp, sizeof(tmp), "Band%d", i); + EqualizerPreset * preset = equalizer_preset_new (""); + + preset->preamp = g_key_file_get_double (rcfile, "Equalizer preset", "Preamp", NULL); - preset->bands[i] = g_key_file_get_double(rcfile, "Equalizer preset", tmp, NULL); + for (int i = 0; i < AUD_EQUALIZER_NBANDS; i ++) + { + SPRINTF (tmp, "Band%d", i); + preset->bands[i] = g_key_file_get_double (rcfile, "Equalizer preset", tmp, NULL); } - g_key_file_free(rcfile); - return preset; -} + g_key_file_free (rcfile); -EqualizerPreset * -load_preset_file(const char *filename) -{ - if (filename) { - EqualizerPreset *preset = equalizer_read_aud_preset(filename); - return preset; - } - return NULL; + return preset; } |