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