All of lore.kernel.org
 help / color / mirror / Atom feed
* Allow alsa configuration to be loaded from a alsa.conf.d folder
@ 2011-09-11 12:40 gmane
  2011-09-11 12:40 ` [PATCH] conf: Allow for a directory to be given as a config file gmane
  2011-09-13 21:03 ` Allow alsa configuration to be loaded from a alsa.conf.d folder v2 gmane
  0 siblings, 2 replies; 12+ messages in thread
From: gmane @ 2011-09-11 12:40 UTC (permalink / raw)
  To: alsa-devel

Hi,

This is a small patch for alsa-lib that supports the common ".d" folder
configs.

The idea here is to make it easier for packagers and distros to supply
plugin configuration without having to patch alsa-lib to do so (or
by managing a /etc/asound.conf file which may want to be tweaked by multiple
files)

If this patch is accepted, I'll modify alsa-plugins to inlcude a
pulseaudio.conf file in /usr/share/alsa/alsa.conf.d/ which defines
a pcm.pulse anc ctl.pulse. If distros want to default to PA, they should
include their own file in there that defines pcm|ctl.!default appropriately.

Similar configuration could be added for third party alsa plugins such as
the DTS encoder plugin being developed by Alexander Patrikov which are
shipped outside of alsa.

I don't think there is anything too controversial in here, so hopefully it'll
be accepted.

Cheers

Col

^ permalink raw reply	[flat|nested] 12+ messages in thread
* [PATCH] conf: Allow for a directory to be given as a config file.
@ 2011-09-16  9:04 gmane
  2011-09-20  8:09 ` Takashi Iwai
  0 siblings, 1 reply; 12+ messages in thread
From: gmane @ 2011-09-16  9:04 UTC (permalink / raw)
  To: alsa-devel; +Cc: tiwai, Colin Guthrie

From: Colin Guthrie <colin@mageia.org>

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 <colin@mageia.org>
---
 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:</P>
 #include <stdarg.h>
 #include <limits.h>
 #include <sys/stat.h>
+#include <dirent.h>
 #include <locale.h>
 #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

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2011-09-20  8:09 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-11 12:40 Allow alsa configuration to be loaded from a alsa.conf.d folder gmane
2011-09-11 12:40 ` [PATCH] conf: Allow for a directory to be given as a config file gmane
2011-09-12  6:57   ` Jaroslav Kysela
2011-09-12  8:23     ` Colin Guthrie
2011-09-12  8:27       ` Takashi Iwai
2011-09-13 21:00     ` Colin Guthrie
2011-09-13 21:03 ` Allow alsa configuration to be loaded from a alsa.conf.d folder v2 gmane
2011-09-13 21:04   ` [PATCH] conf: Allow for a directory to be given as a config file gmane
2011-09-16  6:51     ` Takashi Iwai
2011-09-16  8:28       ` Colin Guthrie
  -- strict thread matches above, loose matches on Subject: below --
2011-09-16  9:04 gmane
2011-09-20  8:09 ` Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.