diff --git a/driver.c b/driver.c index 889a63abf4..bd620a5599 100644 --- a/driver.c +++ b/driver.c @@ -967,18 +967,85 @@ void uninit_drivers(void) driver.input_data_own = false; } +#ifdef HAVE_FILTERS_BUILTIN +extern const struct dspfilter_implementation *echo_dsp_plugin_init(dspfilter_simd_mask_t simd); +extern const struct dspfilter_implementation *eq_dsp_plugin_init(dspfilter_simd_mask_t simd); +extern const struct dspfilter_implementation *iir_dsp_plugin_init(dspfilter_simd_mask_t simd); +extern const struct dspfilter_implementation *phaser_dsp_plugin_init(dspfilter_simd_mask_t simd); +extern const struct dspfilter_implementation *reverb_dsp_plugin_init(dspfilter_simd_mask_t simd); +extern const struct dspfilter_implementation *volume_dsp_plugin_init(dspfilter_simd_mask_t simd); +extern const struct dspfilter_implementation *wah_dsp_plugin_init(dspfilter_simd_mask_t simd); + +static const struct dspfilter_implementation *(*dspfilter_drivers[]) (dspfilter_simd_mask_t) = +{ + NULL, + &echo_dsp_plugin_init, + &eq_dsp_plugin_init, + &iir_dsp_plugin_init, + &phaser_dsp_plugin_init, + &reverb_dsp_plugin_init, + &volume_dsp_plugin_init, + &wah_dsp_plugin_init, +}; + +unsigned dspfilter_get_last_idx(void) +{ + return sizeof(dspfilter_drivers) / sizeof(dspfilter_drivers[0]); +} + +static dspfilter_get_implementation_t dspfilter_get_implementation_from_idx(unsigned i) +{ + if (i < dspfilter_get_last_idx()) + return dspfilter_drivers[i]; + return NULL; +} + +#endif + + +const char *rarch_dspfilter_get_name(void *data) +{ + const struct dspfilter_implementation *impl; + (void)data; +#ifdef HAVE_FILTERS_BUILTIN + unsigned cpu_features; + dspfilter_get_implementation_t cb = (dspfilter_get_implementation_t)dspfilter_get_implementation_from_idx(g_settings.audio.filter_idx); + if (cb) + { + cpu_features = rarch_get_cpu_features(); + impl = (const struct dspfilter_implementation *)cb(cpu_features); + if (impl) + return impl->ident; + } + + return NULL; +#else + impl = (const struct dspfilter_implementation*)data; + if (!impl || !impl->ident) + return NULL; + + return impl->ident; +#endif +} + void rarch_init_dsp_filter(void) { unsigned cpu_features; dspfilter_get_implementation_t cb; rarch_dsp_info_t info = {0}; +#ifdef HAVE_FILTERS_BUILTIN + if (!g_settings.audio.filter_idx) +#else if (!(*g_settings.audio.dsp_plugin)) +#endif return; cb = NULL; -#ifdef HAVE_DYLIB +#if defined(HAVE_FILTERS_BUILTIN) + cb = (dspfilter_get_implementation_t)dspfilter_get_implementation_from_idx(g_settings.video.filter_idx); +#elif defined(HAVE_DYLIB) g_extern.audio_data.dsp_lib = dylib_load(g_settings.audio.dsp_plugin); if (!g_extern.audio_data.dsp_lib) { diff --git a/driver.h b/driver.h index bce5b23bcb..ef39e71bb7 100644 --- a/driver.h +++ b/driver.h @@ -586,8 +586,13 @@ void rarch_deinit_filter(void); void rarch_init_filter(enum retro_pixel_format); #endif +#ifdef HAVE_FILTERS_BUILTIN +unsigned dspfilter_get_last_idx(void); +#endif + void rarch_init_dsp_filter(void); void rarch_deinit_dsp_filter(void); +const char *rarch_dspfilter_get_name(void *data); // Used by RETRO_ENVIRONMENT_GET_CAMERA_INTERFACE #ifdef HAVE_CAMERA diff --git a/frontend/menu/backend/menu_common_backend.c b/frontend/menu/backend/menu_common_backend.c index cf6232cfd9..f9bfac2cb6 100644 --- a/frontend/menu/backend/menu_common_backend.c +++ b/frontend/menu/backend/menu_common_backend.c @@ -2523,13 +2523,30 @@ static int menu_common_setting_set(void *data, unsigned setting, unsigned action case RGUI_SETTINGS_AUDIO_DSP_FILTER: switch (action) { +#ifdef HAVE_FILTERS_BUILTIN + case RGUI_ACTION_LEFT: + if (g_settings.audio.filter_idx > 0) + g_settings.audio.filter_idx--; + break; + case RGUI_ACTION_RIGHT: + if ((g_settings.audio.filter_idx + 1) != dspfilter_get_last_idx()) + g_settings.audio.filter_idx++; + break; +#endif case RGUI_ACTION_OK: +#if defined(HAVE_FILTERS_BUILTIN) + rarch_deinit_dsp_filter(); + rarch_init_dsp_filter(); +#elif defined(HAVE_DYLIB) file_list_push(rgui->menu_stack, g_settings.audio.filter_dir, setting, rgui->selection_ptr); menu_clear_navigation(rgui); +#endif rgui->need_refresh = true; break; case RGUI_ACTION_START: -#ifdef HAVE_DYLIB +#if defined(HAVE_FILTERS_BUILTIN) + g_settings.audio.filter_idx = 0; +#elif defined(HAVE_DYLIB) strlcpy(g_settings.audio.dsp_plugin, "", sizeof(g_settings.audio.dsp_plugin)); #endif rarch_deinit_dsp_filter(); @@ -4027,7 +4044,10 @@ static void menu_common_setting_set_label(char *type_str, size_t type_str_size, } break; case RGUI_SETTINGS_AUDIO_DSP_FILTER: - strlcpy(type_str, *g_settings.audio.dsp_plugin ? g_settings.audio.dsp_plugin : "N/A", type_str_size); + { + const char *filter_name = rarch_dspfilter_get_name((void*)g_extern.audio_data.dsp_plugin); + strlcpy(type_str, filter_name ? filter_name : "N/A", type_str_size); + } break; #ifdef HAVE_OVERLAY case RGUI_SETTINGS_OVERLAY_PRESET: diff --git a/general.h b/general.h index 6fecd961c3..2bb3d476cb 100644 --- a/general.h +++ b/general.h @@ -235,6 +235,9 @@ struct settings char dsp_plugin[PATH_MAX]; char filter_dir[PATH_MAX]; +#ifdef HAVE_FILTERS_BUILTIN + unsigned filter_idx; +#endif bool rate_control; float rate_control_delta; diff --git a/gfx/filter.c b/gfx/filter.c index 397a59693e..68abb81405 100644 --- a/gfx/filter.c +++ b/gfx/filter.c @@ -120,8 +120,9 @@ static softfilter_get_implementation_t softfilter_get_implementation_from_idx(un #endif -const char *rarch_softfilter_get_name(rarch_softfilter_t *filt) +const char *rarch_softfilter_get_name(void *data) { + (void)data; #ifdef HAVE_FILTERS_BUILTIN unsigned cpu_features; const struct softfilter_implementation *impl; @@ -136,6 +137,7 @@ const char *rarch_softfilter_get_name(rarch_softfilter_t *filt) return NULL; #else + rarch_softfilter_t *filt = (rarch_softfilter_t*)data; if (!filt || !filt->impl) return NULL; diff --git a/gfx/filter.h b/gfx/filter.h index 0847ade846..5b519e3ae2 100644 --- a/gfx/filter.h +++ b/gfx/filter.h @@ -44,7 +44,7 @@ void rarch_softfilter_process(rarch_softfilter_t *filt, void *output, size_t output_stride, const void *input, unsigned width, unsigned height, size_t input_stride); -const char *rarch_softfilter_get_name(rarch_softfilter_t *filt); +const char *rarch_softfilter_get_name(void *data); #endif diff --git a/griffin/griffin.c b/griffin/griffin.c index de83358591..92eef668f2 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -484,6 +484,14 @@ FILTERS #include "../gfx/filters/darken.c" #include "../gfx/filters/epx.c" #include "../gfx/filters/scale2x.c" + +#include "../audio/filters/echo.c" +#include "../audio/filters/eq.c" +#include "../audio/filters/iir.c" +#include "../audio/filters/phaser.c" +#include "../audio/filters/reverb.c" +#include "../audio/filters/volume.c" +#include "../audio/filters/wah.c" #endif /*============================================================ DYNAMIC