summaryrefslogtreecommitdiff
path: root/src/audacious/equalizer_preset.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/audacious/equalizer_preset.c')
-rw-r--r--src/audacious/equalizer_preset.c272
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;
}