diff --git a/Makefile.common b/Makefile.common
index 43af61e5be..59af72ce08 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -114,6 +114,7 @@ OBJ += frontend/frontend.o \
cheats.o \
core_info.o \
conf/config_file.o \
+ conf/config_file_userdata.o \
screenshot.o \
gfx/scaler/scaler.o \
gfx/shader_common.o \
diff --git a/audio/dsp_filter.c b/audio/dsp_filter.c
index 017ce7dc76..697f509124 100644
--- a/audio/dsp_filter.c
+++ b/audio/dsp_filter.c
@@ -18,7 +18,7 @@
#include "dsp_filter.h"
#include "../dynamic.h"
-#include "../conf/config_file.h"
+#include "../conf/config_file_userdata.h"
#include "filters/dspfilter.h"
#include "../file_path.h"
#include "../file_ext.h"
@@ -64,120 +64,13 @@ static const struct dspfilter_implementation *find_implementation(
return NULL;
}
-struct dsp_userdata
-{
- config_file_t *conf;
- const char *prefix[2];
-};
-
-static int get_float(void *userdata, const char *key_str,
- float *value, float default_value)
-{
- struct dsp_userdata *dsp = (struct dsp_userdata*)userdata;
-
- char key[2][256];
- snprintf(key[0], sizeof(key[0]), "%s_%s", dsp->prefix[0], key_str);
- snprintf(key[1], sizeof(key[1]), "%s_%s", dsp->prefix[1], key_str);
-
- bool got = config_get_float(dsp->conf, key[0], value);
- got = got || config_get_float(dsp->conf, key[1], value);
-
- if (!got)
- *value = default_value;
- return got;
-}
-
-static int get_int(void *userdata, const char *key_str,
- int *value, int default_value)
-{
- struct dsp_userdata *dsp = (struct dsp_userdata*)userdata;
-
- char key[2][256];
- snprintf(key[0], sizeof(key[0]), "%s_%s", dsp->prefix[0], key_str);
- snprintf(key[1], sizeof(key[1]), "%s_%s", dsp->prefix[1], key_str);
-
- bool got = config_get_int(dsp->conf, key[0], value);
- got = got || config_get_int(dsp->conf, key[1], value);
-
- if (!got)
- *value = default_value;
- return got;
-}
-
-#define get_array_setup() \
- struct dsp_userdata *dsp = (struct dsp_userdata*)userdata; \
- \
- char key[2][256]; \
- snprintf(key[0], sizeof(key[0]), "%s_%s", dsp->prefix[0], key_str); \
- snprintf(key[1], sizeof(key[1]), "%s_%s", dsp->prefix[1], key_str); \
- \
- char *str = NULL; \
- bool got = config_get_string(dsp->conf, key[0], &str); \
- got = got || config_get_string(dsp->conf, key[1], &str);
-
-#define get_array_body(T) \
- if (got) \
- { \
- unsigned i; \
- struct string_list *list = string_split(str, " "); \
- *values = (T*)calloc(list->size, sizeof(T)); \
- for (i = 0; i < list->size; i++) \
- (*values)[i] = (T)strtod(list->elems[i].data, NULL); \
- *out_num_values = list->size; \
- string_list_free(list); \
- return true; \
- } \
- else \
- { \
- *values = (T*)calloc(num_default_values, sizeof(T)); \
- memcpy(*values, default_values, sizeof(T) * num_default_values); \
- *out_num_values = num_default_values; \
- return false; \
- }
-
-static int get_float_array(void *userdata, const char *key_str,
- float **values, unsigned *out_num_values,
- const float *default_values, unsigned num_default_values)
-{
- get_array_setup()
- get_array_body(float)
-}
-
-static int get_int_array(void *userdata, const char *key_str,
- int **values, unsigned *out_num_values,
- const int *default_values, unsigned num_default_values)
-{
- get_array_setup()
- get_array_body(int)
-}
-
-static int get_string(void *userdata, const char *key_str,
- char **output, const char *default_output)
-{
- get_array_setup()
-
- if (got)
- {
- *output = str;
- return true;
- }
-
- *output = strdup(default_output);
- return false;
-}
-
-static void dspfilter_free(void *ptr)
-{
- free(ptr);
-}
-
static const struct dspfilter_config dspfilter_config = {
- get_float,
- get_int,
- get_float_array,
- get_int_array,
- get_string,
- dspfilter_free,
+ config_userdata_get_float,
+ config_userdata_get_int,
+ config_userdata_get_float_array,
+ config_userdata_get_int_array,
+ config_userdata_get_string,
+ config_userdata_free,
};
static bool create_filter_graph(rarch_dsp_filter_t *dsp, float sample_rate)
@@ -208,7 +101,7 @@ static bool create_filter_graph(rarch_dsp_filter_t *dsp, float sample_rate)
if (!dsp->instances[i].impl)
return false;
- struct dsp_userdata userdata;
+ struct config_file_userdata userdata;
userdata.conf = dsp->conf;
/* Index-specific configs take priority over ident-specific. */
userdata.prefix[0] = key;
diff --git a/conf/config_file_userdata.c b/conf/config_file_userdata.c
new file mode 100644
index 0000000000..34f0412694
--- /dev/null
+++ b/conf/config_file_userdata.c
@@ -0,0 +1,120 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2014 - Daniel De Matteis
+ *
+ * RetroArch is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#include "config_file_userdata.h"
+#include "../string_list.h"
+
+#define get_array_setup() \
+ struct config_file_userdata *dsp = (struct config_file_userdata*)userdata; \
+ \
+ char key[2][256]; \
+ snprintf(key[0], sizeof(key[0]), "%s_%s", dsp->prefix[0], key_str); \
+ snprintf(key[1], sizeof(key[1]), "%s_%s", dsp->prefix[1], key_str); \
+ \
+ char *str = NULL; \
+ bool got = config_get_string(dsp->conf, key[0], &str); \
+ got = got || config_get_string(dsp->conf, key[1], &str);
+
+#define get_array_body(T) \
+ if (got) \
+ { \
+ unsigned i; \
+ struct string_list *list = string_split(str, " "); \
+ *values = (T*)calloc(list->size, sizeof(T)); \
+ for (i = 0; i < list->size; i++) \
+ (*values)[i] = (T)strtod(list->elems[i].data, NULL); \
+ *out_num_values = list->size; \
+ string_list_free(list); \
+ return true; \
+ } \
+ else \
+ { \
+ *values = (T*)calloc(num_default_values, sizeof(T)); \
+ memcpy(*values, default_values, sizeof(T) * num_default_values); \
+ *out_num_values = num_default_values; \
+ return false; \
+ }
+
+int config_userdata_get_float(void *userdata, const char *key_str,
+ float *value, float default_value)
+{
+ struct config_file_userdata *dsp = (struct config_file_userdata*)userdata;
+
+ char key[2][256];
+ snprintf(key[0], sizeof(key[0]), "%s_%s", dsp->prefix[0], key_str);
+ snprintf(key[1], sizeof(key[1]), "%s_%s", dsp->prefix[1], key_str);
+
+ bool got = config_get_float(dsp->conf, key[0], value);
+ got = got || config_get_float(dsp->conf, key[1], value);
+
+ if (!got)
+ *value = default_value;
+ return got;
+}
+
+int config_userdata_get_int(void *userdata, const char *key_str,
+ int *value, int default_value)
+{
+ struct config_file_userdata *dsp = (struct config_file_userdata*)userdata;
+
+ char key[2][256];
+ snprintf(key[0], sizeof(key[0]), "%s_%s", dsp->prefix[0], key_str);
+ snprintf(key[1], sizeof(key[1]), "%s_%s", dsp->prefix[1], key_str);
+
+ bool got = config_get_int(dsp->conf, key[0], value);
+ got = got || config_get_int(dsp->conf, key[1], value);
+
+ if (!got)
+ *value = default_value;
+ return got;
+}
+
+int config_userdata_get_float_array(void *userdata, const char *key_str,
+ float **values, unsigned *out_num_values,
+ const float *default_values, unsigned num_default_values)
+{
+ get_array_setup()
+ get_array_body(float)
+}
+
+int config_userdata_get_int_array(void *userdata, const char *key_str,
+ int **values, unsigned *out_num_values,
+ const int *default_values, unsigned num_default_values)
+{
+ get_array_setup()
+ get_array_body(int)
+}
+
+int config_userdata_get_string(void *userdata, const char *key_str,
+ char **output, const char *default_output)
+{
+ get_array_setup()
+
+ if (got)
+ {
+ *output = str;
+ return true;
+ }
+
+ *output = strdup(default_output);
+ return false;
+}
+
+void config_userdata_free(void *ptr)
+{
+ if (ptr)
+ free(ptr);
+}
diff --git a/conf/config_file_userdata.h b/conf/config_file_userdata.h
new file mode 100644
index 0000000000..7353f19362
--- /dev/null
+++ b/conf/config_file_userdata.h
@@ -0,0 +1,48 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2014 - Daniel De Matteis
+ *
+ * RetroArch is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#ifndef _CONFIG_FILE_USERDATA_H
+#define _CONFIG_FILE_USERDATA_H
+
+#include
+#include "config_file.h"
+
+struct config_file_userdata
+{
+ config_file_t *conf;
+ const char *prefix[2];
+};
+
+int config_userdata_get_float(void *userdata, const char *key_str,
+ float *value, float default_value);
+
+int config_userdata_get_int(void *userdata, const char *key_str,
+ int *value, int default_value);
+
+int config_userdata_get_float_array(void *userdata, const char *key_str,
+ float **values, unsigned *out_num_values,
+ const float *default_values, unsigned num_default_values);
+
+int config_userdata_get_int_array(void *userdata, const char *key_str,
+ int **values, unsigned *out_num_values,
+ const int *default_values, unsigned num_default_values);
+
+int config_userdata_get_string(void *userdata, const char *key_str,
+ char **output, const char *default_output);
+
+void config_userdata_free(void *ptr);
+
+#endif
diff --git a/griffin/griffin.c b/griffin/griffin.c
index 4369465a92..c7951012b6 100644
--- a/griffin/griffin.c
+++ b/griffin/griffin.c
@@ -92,6 +92,7 @@ CONFIG FILE
#endif
#include "../conf/config_file.c"
+#include "../conf/config_file_userdata.c"
#include "../core_options.c"
/*============================================================