diff --git a/0030-conf-Allow-for-a-directory-to-be-given-as-a-config-f.patch b/0030-conf-Allow-for-a-directory-to-be-given-as-a-config-f.patch
new file mode 100644
index 0000000..e47dd7c
--- /dev/null
+++ b/0030-conf-Allow-for-a-directory-to-be-given-as-a-config-f.patch
@@ -0,0 +1,201 @@
+From 7924500688fdfeac71e5968e5f5875726a8dce14 Mon Sep 17 00:00:00 2001
+From: Colin Guthrie
+Date: Fri, 16 Sep 2011 10:04:26 +0100
+Subject: [PATCH] conf: Allow for a directory to be given as a config file.
+
+When this is done, *.conf files can be placed in that directory and they
+will be processed by as if they were included directly.
+
+A directory (typically /usr/share/alsa/alsa.conf.d/) has been
+added into the distribution.
+
+v2: Used existing conf syntax rather than processing via autotools
+v3: Split file loading into separate function and made error handling
+more consistent.
+
+Signed-off-by: Colin Guthrie
+Signed-off-by: Takashi Iwai
+---
+ configure.in | 3 +-
+ src/conf.c | 78 ++++++++++++++++++++++++++++++++-----
+ src/conf/Makefile.am | 2 +-
+ src/conf/alsa.conf | 7 +++
+ src/conf/alsa.conf.d/Makefile.am | 8 ++++
+ src/conf/alsa.conf.d/README | 2 +
+ 6 files changed, 87 insertions(+), 13 deletions(-)
+ create mode 100644 src/conf/alsa.conf.d/Makefile.am
+ create mode 100644 src/conf/alsa.conf.d/README
+
+diff --git a/configure.in b/configure.in
+index 7ee0ccc..13e38b8 100644
+--- a/configure.in
++++ b/configure.in
+@@ -616,7 +616,8 @@ AC_OUTPUT(Makefile doc/Makefile doc/pictures/Makefile doc/doxygen.cfg \
+ src/pcm/Makefile src/pcm/scopes/Makefile \
+ src/rawmidi/Makefile src/timer/Makefile \
+ src/hwdep/Makefile src/seq/Makefile src/ucm/Makefile \
+- src/compat/Makefile src/alisp/Makefile src/conf/Makefile \
++ src/compat/Makefile src/alisp/Makefile \
++ src/conf/Makefile src/conf/alsa.conf.d/Makefile \
+ src/conf/cards/Makefile \
+ src/conf/pcm/Makefile \
+ modules/Makefile modules/mixer/Makefile modules/mixer/simple/Makefile \
+diff --git a/src/conf.c b/src/conf.c
+index ddefff6..5b1b5a6 100644
+--- a/src/conf.c
++++ b/src/conf.c
+@@ -417,6 +417,7 @@ beginning:
+ #include
+ #include
+ #include
++#include
+ #include
+ #include "local.h"
+ #ifdef HAVE_LIBPTHREAD
+@@ -3373,6 +3374,42 @@ static int snd_config_hooks(snd_config_t *config, snd_config_t *private_data)
+ return err;
+ }
+
++static int config_filename_filter(const struct dirent *dirent)
++{
++ size_t flen;
++
++ if (dirent == NULL)
++ return 0;
++ if (dirent->d_type == DT_DIR)
++ return 0;
++
++ flen = strlen(dirent->d_name);
++ if (flen <= 5)
++ return 0;
++
++ if (strncmp(&dirent->d_name[flen-5], ".conf", 5) == 0)
++ return 1;
++
++ return 0;
++}
++
++static int config_file_open(snd_config_t *root, const char *filename)
++{
++ snd_input_t *in;
++ int err;
++
++ err = snd_input_stdio_open(&in, filename, "r");
++ if (err >= 0) {
++ err = snd_config_load(root, in);
++ snd_input_close(in);
++ if (err < 0)
++ SNDERR("%s may be old or corrupted: consider to remove or fix it", filename);
++ } else
++ SNDERR("cannot access file %s", filename);
++
++ return err;
++}
++
+ /**
+ * \brief Loads and parses the given configurations files.
+ * \param[in] root Handle to the root configuration node.
+@@ -3457,20 +3494,39 @@ int snd_config_hook_load(snd_config_t *root, snd_config_t *config, snd_config_t
+ }
+ } while (hit);
+ for (idx = 0; idx < fi_count; idx++) {
+- snd_input_t *in;
++ struct stat st;
+ if (!errors && access(fi[idx].name, R_OK) < 0)
+ continue;
+- err = snd_input_stdio_open(&in, fi[idx].name, "r");
+- if (err >= 0) {
+- err = snd_config_load(root, in);
+- snd_input_close(in);
+- if (err < 0) {
+- SNDERR("%s may be old or corrupted: consider to remove or fix it", fi[idx].name);
+- goto _err;
+- }
+- } else {
+- SNDERR("cannot access file %s", fi[idx].name);
++ if (stat(fi[idx].name, &st) < 0) {
++ SNDERR("cannot stat file/directory %s", fi[idx].name);
++ continue;
+ }
++ if (S_ISDIR(st.st_mode)) {
++ struct dirent **namelist;
++ int n;
++
++ n = scandir(fi[idx].name, &namelist, config_filename_filter, versionsort);
++ if (n > 0) {
++ int j;
++ err = 0;
++ for (j = 0; j < n; ++j) {
++ if (err >= 0) {
++ int sl = strlen(fi[idx].name) + strlen(namelist[j]->d_name) + 2;
++ char *filename = malloc(sl);
++ snprintf(filename, sl, "%s/%s", fi[idx].name, namelist[j]->d_name);
++ filename[sl-1] = '\0';
++
++ err = config_file_open(root, filename);
++ free(filename);
++ }
++ free(namelist[j]);
++ }
++ free(namelist);
++ if (err < 0)
++ goto _err;
++ }
++ } else if (config_file_open(root, fi[idx].name) < 0)
++ goto _err;
+ }
+ *dst = NULL;
+ err = 0;
+diff --git a/src/conf/Makefile.am b/src/conf/Makefile.am
+index 2e5d0bf..456454f 100644
+--- a/src/conf/Makefile.am
++++ b/src/conf/Makefile.am
+@@ -1,4 +1,4 @@
+-SUBDIRS=cards pcm
++SUBDIRS=cards pcm alsa.conf.d
+
+ cfg_files = alsa.conf
+ if BUILD_ALISP
+diff --git a/src/conf/alsa.conf b/src/conf/alsa.conf
+index a33c24e..bc91df3 100644
+--- a/src/conf/alsa.conf
++++ b/src/conf/alsa.conf
+@@ -8,6 +8,13 @@
+ {
+ func load
+ files [
++ {
++ @func concat
++ strings [
++ { @func datadir }
++ "/alsa.conf.d/"
++ ]
++ }
+ "/etc/asound.conf"
+ "~/.asoundrc"
+ ]
+diff --git a/src/conf/alsa.conf.d/Makefile.am b/src/conf/alsa.conf.d/Makefile.am
+new file mode 100644
+index 0000000..c91661e
+--- /dev/null
++++ b/src/conf/alsa.conf.d/Makefile.am
+@@ -0,0 +1,8 @@
++alsaconfigdir = @ALSA_CONFIG_DIR@
++alsadir = $(alsaconfigdir)/alsa.conf.d
++cfg_files = README
++
++alsa_DATA = $(cfg_files)
++
++EXTRA_DIST = \
++ $(cfg_files)
+diff --git a/src/conf/alsa.conf.d/README b/src/conf/alsa.conf.d/README
+new file mode 100644
+index 0000000..9997884
+--- /dev/null
++++ b/src/conf/alsa.conf.d/README
+@@ -0,0 +1,2 @@
++You can place files named *.conf in this folder and they will be processed
++when initialising alsa-lib.
+--
+1.7.6.1
+
diff --git a/alsa.changes b/alsa.changes
index 0bd3be2..79f651d 100644
--- a/alsa.changes
+++ b/alsa.changes
@@ -1,3 +1,8 @@
+-------------------------------------------------------------------
+Tue Sep 20 09:45:12 CEST 2011 - tiwai@suse.de
+
+- Add support of /usr/share/alsa/conf.d/* files.
+
-------------------------------------------------------------------
Sat Sep 17 09:02:24 UTC 2011 - jengelh@medozas.de
diff --git a/alsa.spec b/alsa.spec
index 03c44b7..11ce233 100644
--- a/alsa.spec
+++ b/alsa.spec
@@ -78,6 +78,7 @@ Patch26: 0026-Add-RME-RPM-to-HDSP_IO_Type.patch
Patch27: 0027-ucm-fix-seg-fault-in-execute_cset.patch
Patch28: 0028-ucm-tivial-code-style-fix.patch
Patch29: 0029-ucm-add-another-sequence-msleep.patch
+Patch30: 0030-conf-Allow-for-a-directory-to-be-given-as-a-config-f.patch
Patch99: alsa-lib-doxygen-avoid-crash-for-11.3.diff
Url: http://www.alsa-project.org/
BuildRoot: %{_tmppath}/%{name}-%{version}-build
@@ -154,6 +155,7 @@ Architecture.
%patch27 -p1
%patch28 -p1
%patch29 -p1
+%patch30 -p1
%if %suse_version == 1130
%patch99 -p1
%endif