# HG changeset patch # User Matti Hamalainen # Date 1172496904 0 # Node ID 9494fee305fa19dedb6ec745e21ce99a7c6bb081 # Parent 4674e3c3712165f8d55d22c3669e44c0606c0ee5 Config item changes; Unfinished filter preset handling functions. diff -r 4674e3c37121 -r 9494fee305fa src/xmms-sid.h --- a/src/xmms-sid.h Mon Feb 26 13:35:01 2007 +0000 +++ b/src/xmms-sid.h Mon Feb 26 13:35:04 2007 +0000 @@ -115,7 +115,7 @@ #define XS_SIDPLAY1_FT (0.05f) #define XS_SIDPLAY2_NFPOINTS (0x800) - +#define XS_SIDPLAY2_FMAX (24000) /* Limits for oversampling */ diff -r 4674e3c37121 -r 9494fee305fa src/xs_config.c --- a/src/xs_config.c Mon Feb 26 13:35:01 2007 +0000 +++ b/src/xs_config.c Mon Feb 26 13:35:04 2007 +0000 @@ -84,9 +84,9 @@ { CTYPE_BOOL, &xs_cfg.mos8580, "mos8580" }, { CTYPE_BOOL, &xs_cfg.forceModel, "forceModel" }, { CTYPE_BOOL, &xs_cfg.emulateFilters, "emulateFilters" }, -{ CTYPE_FLOAT, &xs_cfg.filterFs, "filterFs" }, -{ CTYPE_FLOAT, &xs_cfg.filterFm, "filterFm" }, -{ CTYPE_FLOAT, &xs_cfg.filterFt, "filterFt" }, +{ CTYPE_FLOAT, &xs_cfg.sid1FilterFs, "filterFs" }, +{ CTYPE_FLOAT, &xs_cfg.sid1FilterFm, "filterFm" }, +{ CTYPE_FLOAT, &xs_cfg.sid1FilterFt, "filterFt" }, { CTYPE_INT, &xs_cfg.memoryMode, "memoryMode" }, { CTYPE_INT, &xs_cfg.clockSpeed, "clockSpeed" }, { CTYPE_BOOL, &xs_cfg.forceSpeed, "forceSpeed" }, @@ -153,9 +153,9 @@ { WTYPE_BGROUP, CTYPE_INT, "cfg_emu_sp2_hardsid", &xs_cfg.sid2Builder, XS_BLD_HARDSID }, { WTYPE_BUTTON, CTYPE_BOOL, "cfg_emu_filters", &xs_cfg.emulateFilters, 0 }, -{ WTYPE_SCALE, CTYPE_FLOAT, "cfg_sp1_filter_fs", &xs_cfg.filterFs, 0 }, -{ WTYPE_SCALE, CTYPE_FLOAT, "cfg_sp1_filter_fm", &xs_cfg.filterFm, 0 }, -{ WTYPE_SCALE, CTYPE_FLOAT, "cfg_sp1_filter_ft", &xs_cfg.filterFt, 0 }, +{ WTYPE_SCALE, CTYPE_FLOAT, "cfg_sp1_filter_fs", &xs_cfg.sid1FilterFs, 0 }, +{ WTYPE_SCALE, CTYPE_FLOAT, "cfg_sp1_filter_fm", &xs_cfg.sid1FilterFm, 0 }, +{ WTYPE_SCALE, CTYPE_FLOAT, "cfg_sp1_filter_ft", &xs_cfg.sid1FilterFt, 0 }, { WTYPE_BUTTON, CTYPE_BOOL, "cfg_maxtime_enable", &xs_cfg.playMaxTimeEnable, 0 }, { WTYPE_BUTTON, CTYPE_BOOL, "cfg_maxtime_unknown", &xs_cfg.playMaxTimeUnknown, 0 }, @@ -204,9 +204,9 @@ xs_cfg.forceModel = FALSE; xs_cfg.emulateFilters = TRUE; - xs_cfg.filterFs = XS_SIDPLAY1_FS; - xs_cfg.filterFm = XS_SIDPLAY1_FM; - xs_cfg.filterFt = XS_SIDPLAY1_FT; + xs_cfg.sid1FilterFs = XS_SIDPLAY1_FS; + xs_cfg.sid1FilterFm = XS_SIDPLAY1_FM; + xs_cfg.sid1FilterFt = XS_SIDPLAY1_FT; #ifdef HAVE_SIDPLAY2 xs_cfg.playerEngine = XS_ENG_SIDPLAY2; @@ -281,15 +281,89 @@ /* Filter configuration handling */ -static t_xs_sid2_filter * xs_filter_load(XS_CONFIG_FILE *cfg, gchar *pcFilterName) +#define XS_FITEM (4 * 2) + +static gboolean xs_filter_load_into(XS_CONFIG_FILE *cfg, gint nFilter, t_xs_sid2_filter *pResult) { + gchar tmpKey[64], *tmpStr; + gint i, j; + + /* Get fields from config */ + g_snprintf(tmpKey, sizeof(tmpKey), "filter%dNPoints", nFilter); + if (!XS_CFG_GET_INT(cfg, XS_CONFIG_IDENT, tmpKey, &(pResult->npoints))) + return FALSE; + if (pResult->npoints > XS_SIDPLAY2_NFPOINTS) + return FALSE; + + g_snprintf(tmpKey, sizeof(tmpKey), "filter%dName", nFilter); + if (!XS_CFG_GET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, &tmpStr)) + return FALSE; + + pResult->name = strdup(tmpStr); + if (pResult->name == NULL) { + g_free(pResult); + return FALSE; + } + + g_snprintf(tmpKey, sizeof(tmpKey), "filter%dPoints", nFilter); + if (!XS_CFG_GET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, &tmpStr)) + return FALSE; + + for (i = 0, j = 0; i < pResult->npoints; i++, j += XS_FITEM) { + sscanf(&tmpStr[j], "%4x%4x", + &(pResult->points[i].x), + &(pResult->points[i].y)); + } + + return TRUE; } -static gboolean xs_filter_save(XS_CONFIG_FILE *cfg, t_xs_sid2_filter *pFilter) + +static t_xs_sid2_filter * xs_filter_load(XS_CONFIG_FILE *cfg, gint nFilter) +{ + t_xs_sid2_filter *pResult; + + /* Allocate filter struct */ + if ((pResult = g_malloc0(sizeof(t_xs_sid2_filter))) == NULL) + return NULL; + + if (!xs_filter_load_into(cfg, nFilter, pResult)) { + g_free(pResult); + return NULL; + } else + return pResult; +} + + +static gboolean xs_filter_save(XS_CONFIG_FILE *cfg, t_xs_sid2_filter *pFilter, gint nFilter) { - gchar *tmpStr; - gint i; + gchar *tmpValue, tmpKey[64]; + gint i, j; + + /* Allocate memory for value string */ + tmpValue = g_malloc(sizeof(gchar) * XS_FITEM * (pFilter->npoints + 1)); + if (tmpValue == NULL) + return FALSE; + /* Make value string */ + for (i = 0, j = 0; i < pFilter->npoints; i++, j += XS_FITEM) { + g_snprintf(&tmpValue[j], XS_FITEM+1, "%04x%04x", + pFilter->points[i].x, + pFilter->points[i].y); + } + + /* Write into the configuration */ + g_snprintf(tmpKey, sizeof(tmpKey), "filter%dName", nFilter); + XS_CFG_SET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, pFilter->name); + + g_snprintf(tmpKey, sizeof(tmpKey), "filter%dNPoints", nFilter); + XS_CFG_SET_INT(cfg, XS_CONFIG_IDENT, tmpKey, pFilter->npoints); + + g_snprintf(tmpKey, sizeof(tmpKey), "filter%dPoints", nFilter); + XS_CFG_SET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, tmpValue); + + g_free(tmpValue); + return TRUE; } @@ -298,7 +372,16 @@ */ static gboolean xs_filters_import(gchar *pcFilename, t_xs_sid2_filter **pFilters, gint *nFilters) { + FILE *inFile; + t_xs_sid2_filter *f; + if ((inFile = fopen(pcFilename, "rb")) == NULL) + return FALSE; + + + + fclose(inFile); + return FALSE; } @@ -389,6 +472,8 @@ break; } } + +xs_filter_load_into(cfg, 0, &xs_cfg.sid2Filter); XS_CONFIG_FREE(cfg); @@ -396,6 +481,7 @@ XSDEBUG("OK\n"); } +#include "tmp.c" /* Write the current configuration */ @@ -443,6 +529,11 @@ } } +xs_filter_save(cfg, &testFilter6581R4, 0); +xs_filter_save(cfg, &testFilter6581R1, 1); +xs_filters_export("paske.filters", &testFilter6581R1, 1); + + XS_CONFIG_WRITE(cfg); XS_CONFIG_FREE(cfg); @@ -872,13 +963,17 @@ /* Create the custom filter curve widget for libSIDPlay2 */ c = xs_curve_new(); xs_curve_reset(XS_CURVE(c)); + xs_curve_set_range(XS_CURVE(c), + 0,0, XS_SIDPLAY2_NFPOINTS, XS_SIDPLAY2_FMAX); + xs_curve_set_points(XS_CURVE(c), + xs_cfg.sid2Filter.points, xs_cfg.sid2Filter.npoints); gtk_widget_set_name(c, "cfg_sp2_filter_curve"); gtk_widget_ref(c); - gtk_object_set_data_full(GTK_OBJECT(xs_configwin), "cfg_sp2_filter_curve", c, (GtkDestroyNotify) gtk_widget_unref); + gtk_object_set_data_full(GTK_OBJECT(xs_configwin), + "cfg_sp2_filter_curve", c, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(c); gtk_container_add(GTK_CONTAINER(LUW("cfg_sp2_filter_frame")), c); - //gtk_container_set_border_width(GTK_CONTAINER(c), 2); /* Based on available optional parts, gray out options */