static void xmms_eq_gain_changed (xmms_object_t *object, xmmsv_t *_data, gpointer userdata) { xmms_config_property_t *val; xmms_equalizer_data_t *priv; const gchar *name; gint i; gfloat gain; g_return_if_fail (object); g_return_if_fail (userdata); val = (xmms_config_property_t *) object; priv = userdata; name = xmms_config_property_get_name (val); XMMS_DBG ("gain value changed! %s => %f", name, xmms_config_property_get_float (val)); gain = xmms_config_property_get_float (val); if (gain < -20.0 || gain > 20.0) { gchar buf[20]; gain = CLAMP (gain, -20.0, 20.0); g_snprintf (buf, sizeof (buf), "%g", gain); xmms_config_property_set_data (val, buf); } /* we are passed the full config key, not just the last token, * which makes this code kinda ugly. * fix when bug 97 has been resolved */ name = strrchr (name, '.') + 1; if (!strcmp (name, "preamp")) { /* scale the -20.0 - 20.0 value to correct one */ for (i=0; i<EQ_CHANNELS; i++) { set_preamp (i, xmms_eq_gain_scale (gain, TRUE)); } } else { gint band = -1; if (!strncmp (name, "gain", 4) && !priv->use_legacy) { band = atoi (name + 4); } else if (!strncmp (name, "legacy", 6) && priv->use_legacy) { band = atoi (name + 6); } if (band >= 0) { /* scale the -20.0 - 20.0 value to correct one */ for (i=0; i<EQ_CHANNELS; i++) { set_gain (band, i, xmms_eq_gain_scale (gain, FALSE)); } } } }
void set_eq_value(float value, int index, int chn) { /* Map the gain and preamp values */ if (index >= 0) { set_gain(index, chn, 2.5220207857061455181125E-01 * exp(8.0178361802353992349168E-02 * value) - 2.5220207852836562523180E-01 , value); } else { /* -12dB .. 12dB mapping */ set_preamp(chn, 9.9999946497217584440165E-01 * exp(6.9314738656671842642609E-02 * value) + 3.7119444716771825623636E-07); } }
static gboolean xmms_eq_init (xmms_xform_t *xform) { xmms_equalizer_data_t *priv; xmms_config_property_t *config; gint i, j, srate; gfloat gain; g_return_val_if_fail (xform, FALSE); priv = g_new0 (xmms_equalizer_data_t, 1); g_return_val_if_fail (priv, FALSE); xmms_xform_private_data_set (xform, priv); config = xmms_xform_config_lookup (xform, "enabled"); g_return_val_if_fail (config, FALSE); xmms_config_property_callback_set (config, xmms_eq_config_changed, priv); priv->enabled = !!xmms_config_property_get_int (config); config = xmms_xform_config_lookup (xform, "bands"); g_return_val_if_fail (config, FALSE); xmms_config_property_callback_set (config, xmms_eq_config_changed, priv); priv->bands = xmms_config_property_get_int (config); config = xmms_xform_config_lookup (xform, "extra_filtering"); g_return_val_if_fail (config, FALSE); xmms_config_property_callback_set (config, xmms_eq_config_changed, priv); priv->extra_filtering = xmms_config_property_get_int (config); config = xmms_xform_config_lookup (xform, "use_legacy"); g_return_val_if_fail (config, FALSE); xmms_config_property_callback_set (config, xmms_eq_config_changed, priv); priv->use_legacy = xmms_config_property_get_int (config); config = xmms_xform_config_lookup (xform, "preamp"); g_return_val_if_fail (config, FALSE); xmms_config_property_callback_set (config, xmms_eq_gain_changed, priv); gain = xmms_config_property_get_float (config); for (i=0; i<EQ_CHANNELS; i++) { set_preamp (i, xmms_eq_gain_scale (gain, TRUE)); } for (i=0; i<EQ_BANDS_LEGACY; i++) { gchar buf[16]; g_snprintf (buf, sizeof (buf), "legacy%d", i); config = xmms_xform_config_lookup (xform, buf); g_return_val_if_fail (config, FALSE); priv->legacy[i] = config; xmms_config_property_callback_set (config, xmms_eq_gain_changed, priv); gain = xmms_config_property_get_float (config); if (priv->use_legacy) { for (j = 0; j < EQ_CHANNELS; j++) { set_gain (i, j, xmms_eq_gain_scale (gain, FALSE)); } } } for (i=0; i<EQ_MAX_BANDS; i++) { gchar buf[16]; g_snprintf (buf, sizeof (buf), "gain%02d", i); config = xmms_xform_config_lookup (xform, buf); g_return_val_if_fail (config, FALSE); priv->gain[i] = config; xmms_config_property_callback_set (config, xmms_eq_gain_changed, priv); gain = xmms_config_property_get_float (config); if (!priv->use_legacy) { for (j = 0; j < EQ_CHANNELS; j++) { set_gain (i, j, xmms_eq_gain_scale (gain, FALSE)); } } } init_iir (); srate = xmms_xform_indata_get_int (xform, XMMS_STREAM_TYPE_FMT_SAMPLERATE); if (priv->use_legacy) { config_iir (srate, EQ_BANDS_LEGACY, 1); } else { config_iir (srate, priv->bands, 0); } xmms_xform_outdata_type_copy (xform); XMMS_DBG ("Equalizer initialized successfully!"); return TRUE; }