changeset 552:9494fee305fa

Config item changes; Unfinished filter preset handling functions.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 26 Feb 2007 13:35:04 +0000
parents 4674e3c37121
children cf32867a71ed
files src/xmms-sid.h src/xs_config.c
diffstat 2 files changed, 111 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- 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
  */
--- 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 */