diff --git a/audio/resamplers/resampler.c b/audio/resamplers/resampler.c
index fb89e44605..7118a70b44 100644
--- a/audio/resamplers/resampler.c
+++ b/audio/resamplers/resampler.c
@@ -59,44 +59,35 @@ static int find_resampler_driver_index(const char *ident)
    return -1;
 }
 
-#if !defined(RESAMPLER_TEST) && defined(RARCH_INTERNAL)
-#include <string/string_list.h>
-#include "../../general.h"
-
 /**
- * find_prev_resampler_driver:
+ * audio_resampler_driver_find_handle:
+ * @index              : index of driver to get handle to.
  *
- * Finds previous driver in resampler driver array.
+ * Returns: handle to audio resampler driver at index. Can be NULL
+ * if nothing found.
  **/
-void find_prev_resampler_driver(void)
+const void *audio_resampler_driver_find_handle(int index)
 {
-   int i = find_resampler_driver_index(g_settings.audio.resampler);
-
-   if (i > 0)
-      strlcpy(g_settings.audio.resampler, resampler_drivers[i - 1]->ident,
-            sizeof(g_settings.audio.resampler));
-   else
-      RARCH_WARN("Couldn't find any previous resampler driver (current one: \"%s\").\n",
-            driver.resampler->ident);
+   const void *drv = resampler_drivers[index];
+   if (!drv)
+      return NULL;
+   return drv;
 }
 
 /**
- * find_next_resampler_driver:
+ * audio_resampler_driver_find_ident:
+ * @index              : index of driver to get handle to.
  *
- * Finds next driver in resampler driver array.
+ * Returns: Human-readable identifier of audio resampler driver at index.
+ * Can be NULL if nothing found.
  **/
-void find_next_resampler_driver(void)
+const char *audio_resampler_driver_find_ident(int index)
 {
-   int i = find_resampler_driver_index(g_settings.audio.resampler);
-
-   if (i >= 0 && resampler_drivers[i + 1])
-      strlcpy(g_settings.audio.resampler, resampler_drivers[i + 1]->ident,
-            sizeof(g_settings.audio.resampler));
-   else
-      RARCH_WARN("Couldn't find any next resampler driver (current one: \"%s\").\n",
-            driver.resampler->ident);
+   const rarch_resampler_t *drv = resampler_drivers[index];
+   if (!drv)
+      return NULL;
+   return drv->ident;
 }
-#endif
 
 #ifndef DONT_HAVE_STRING_LIST
 /**
diff --git a/audio/resamplers/resampler.h b/audio/resamplers/resampler.h
index d392d9c217..8d376a4cb8 100644
--- a/audio/resamplers/resampler.h
+++ b/audio/resamplers/resampler.h
@@ -154,6 +154,24 @@ extern rarch_resampler_t nearest_resampler;
 const char* config_get_audio_resampler_driver_options(void);
 #endif
 
+/**
+ * audio_resampler_driver_find_handle:
+ * @index              : index of driver to get handle to.
+ *
+ * Returns: handle to audio resampler driver at index. Can be NULL
+ * if nothing found.
+ **/
+const void *audio_resampler_driver_find_handle(int index);
+
+/**
+ * audio_resampler_driver_find_ident:
+ * @index              : index of driver to get handle to.
+ *
+ * Returns: Human-readable identifier of audio resampler driver at index.
+ * Can be NULL if nothing found.
+ **/
+const char *audio_resampler_driver_find_ident(int index);
+
 /**
  * rarch_resampler_realloc:
  * @re                         : Resampler handle
diff --git a/driver.c b/driver.c
index d954303edb..48a49d5211 100644
--- a/driver.c
+++ b/driver.c
@@ -105,6 +105,12 @@ static const void *find_driver_nonempty(const char *label, int i,
       if (drv)
          strlcpy(str, audio_driver_find_ident(i), sizeof_str);
    }
+   else if (!strcmp(label, "audio_resampler_driver"))
+   {
+      drv = audio_resampler_driver_find_handle(i);
+      if (drv)
+         strlcpy(str, audio_resampler_driver_find_ident(i), sizeof_str);
+   }
 
    return drv;
 }
diff --git a/driver.h b/driver.h
index e6117ec89e..ef9c09019a 100644
--- a/driver.h
+++ b/driver.h
@@ -347,20 +347,6 @@ void find_prev_driver(const char *label, char *str, size_t sizeof_str);
  **/
 void find_next_driver(const char *label, char *str, size_t sizeof_str);
 
-/**
- * find_prev_resampler_driver:
- *
- * Find previous driver in resampler driver array.
- **/
-void find_prev_resampler_driver(void);
-
-/**
- * find_next_resampler_driver:
- *
- * Find next driver in resampler driver array.
- **/
-void find_next_resampler_driver(void);
-
 /**
  * driver_set_monitor_refresh_rate:
  * @hz                 : New refresh rate for monitor.
diff --git a/settings_data.c b/settings_data.c
index fee0b86835..bf7972534e 100644
--- a/settings_data.c
+++ b/settings_data.c
@@ -830,27 +830,6 @@ static int setting_data_string_action_toggle_driver(void *data,
    return 0;
 }
 
-static int setting_data_string_action_toggle_audio_resampler(void *data,
-      unsigned action)
-{
-   rarch_setting_t *setting = (rarch_setting_t*)data;
-
-   if (!setting)
-      return -1;
-
-   switch (action)
-   {
-      case MENU_ACTION_LEFT:
-         find_prev_resampler_driver();
-         break;
-      case MENU_ACTION_RIGHT:
-         find_next_resampler_driver();
-         break;
-   }
-
-   return 0;
-}
-
 int core_list_action_toggle(void *data, unsigned action)
 {
    rarch_setting_t *setting = (rarch_setting_t *)data;
@@ -3582,7 +3561,7 @@ static bool setting_data_append_list_driver_options(
          subgroup_info.name,
          NULL,
          NULL);
-   (*list)[list_info->index - 1].action_toggle = &setting_data_string_action_toggle_audio_resampler;
+   settings_data_list_current_add_flags(list, list_info, SD_FLAG_IS_DRIVER);
 
    CONFIG_STRING_OPTIONS(
          g_settings.camera.driver,