In a fashion like udev's support, this patch allows configurations from packages
to be merged in to directories for PulseAudio to read from. Currently supported
directories are the alsa-mixer mdoule's profile-sets and paths.

This is accomplished by patching PulseAudio to read directories from environment
variables globally defined by NixOS rather from the data path in the Nix store.
Modules that support it (such as the alsa module) can still be configured at
runtime to use specific paths, this just changes the default paths.

The environment variables are only used if they're defined, as such the previous
behaviour can be reverted to if the variables are unset or NixOS isn't running.
---
 nixos/modules/config/pulseaudio.nix       | 43 +++++++++++++++++++++++++
 pkgs/servers/pulseaudio/custom-dirs.patch | 52 +++++++++++++++++++++++++++++++
 pkgs/servers/pulseaudio/default.nix       |  2 +-
 3 files changed, 96 insertions(+), 1 deletion(-)
 create mode 100644 pkgs/servers/pulseaudio/custom-dirs.patch

diff --git a/nixos/modules/config/pulseaudio.nix 
b/nixos/modules/config/pulseaudio.nix
index 2ebc612..bad4bf3 100644
--- a/nixos/modules/config/pulseaudio.nix
+++ b/nixos/modules/config/pulseaudio.nix
@@ -52,6 +52,37 @@ let
     }
   '');
 
+  # Create a directory full of configuration files for PulseAudio to use for
+  # various modules. Packages are scanned similiar how udev does it.
+  moduleEnvVars = {
+    PA_ALSA_PATHS_DIR = "${moduleConf}/alsa-paths";
+    PA_ALSA_PROFILE_SETS_DIR = "${moduleConf}/alsa-profiles";
+  };
+  moduleConf = stdenv.mkDerivation {
+    name = "pulseaudio-moduleconf";
+
+    preferLocalBuild = true;
+    allowSubstitutes = false;
+
+    buildCommand = ''
+      mkdir -p $out/{alsa-profiles,alsa-paths}
+      shopt -s nullglob
+      set +o pipefail
+
+      function copy_dir() {
+        for j in $1/$2/*; do
+          echo "Copying $i to $out/$3/$(basename $j)"
+          cat $j > $out/$3/$(basename $j)
+        done
+      }
+
+      for i in ${toString cfg.packages}; do
+        echo "Adding configuration for package $i"
+        copy_dir $i/usr/share/pulseaudio/alsa-mixer profile-sets alsa-profiles
+        copy_dir $i/usr/share/pulseaudio/alsa-mixer paths alsa-paths
+      done
+    '';
+  };
 in {
 
   options = {
@@ -96,6 +127,17 @@ in {
         '';
       };
 
+      packages = mkOption {
+        type = types.listOf types.path;
+        description = ''
+          List of packages containing additional PulseAudio configuration.
+          All files found in the following directories:
+          
<filename><replaceable>pkg</replaceable>/usr/share/lib/pulseaudio/alsa-mixer/profile-sets</filename>
+          
<filename><replaceable>pkg</replaceable>/usr/share/lib/pulseaudio/alsa-mixer/paths</filename>
+          will be included.
+        '';
+      };
+
       package = mkOption {
         type = types.package;
         default = pulseaudioLight;
@@ -130,6 +172,7 @@ in {
       };
 
       hardware.pulseaudio.configFile = mkDefault 
"${cfg.package}/etc/pulse/default.pa";
+      environment.sessionVariables = moduleEnvVars;
     }
 
     (mkIf cfg.enable {
diff --git a/pkgs/servers/pulseaudio/custom-dirs.patch 
b/pkgs/servers/pulseaudio/custom-dirs.patch
new file mode 100644
index 0000000..00e2ee7
--- /dev/null
+++ b/pkgs/servers/pulseaudio/custom-dirs.patch
@@ -0,0 +1,52 @@
+diff -Naur pulseaudio-7.0/src/modules/alsa/alsa-mixer.c 
pulseaudio-7.0.new/src/modules/alsa/alsa-mixer.c
+--- pulseaudio-7.0/src/modules/alsa/alsa-mixer.c       2015-09-15 
14:46:06.000000000 +1000
++++ pulseaudio-7.0.new/src/modules/alsa/alsa-mixer.c   2015-11-18 
12:58:33.490001078 +1100
+@@ -2521,10 +2521,11 @@
+ }
+ 
+ static const char *get_default_paths_dir(void) {
++    char *env = getenv("PA_ALSA_PATHS_DIR");
+     if (pa_run_from_build_tree())
+         return PA_SRCDIR "/modules/alsa/mixer/paths/";
+     else
+-        return PA_ALSA_PATHS_DIR;
++        return (env ? env : PA_ALSA_PATHS_DIR);
+ }
+ 
+ pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, 
pa_alsa_direction_t direction) {
+@@ -4347,6 +4348,7 @@
+     pa_alsa_profile *p;
+     pa_alsa_mapping *m;
+     pa_alsa_decibel_fix *db_fix;
++    char *env;
+     char *fn;
+     int r;
+     void *state;
+@@ -4392,9 +4394,10 @@
+     if (!fname)
+         fname = "default.conf";
+ 
++    env = getenv("PA_ALSA_PROFILE_SETS_DIR");
+     fn = pa_maybe_prefix_path(fname,
+                               pa_run_from_build_tree() ? PA_SRCDIR 
"/modules/alsa/mixer/profile-sets/" :
+-                              PA_ALSA_PROFILE_SETS_DIR);
++                              (env ? env : PA_ALSA_PROFILE_SETS_DIR));
+ 
+     r = pa_config_parse(fn, NULL, items, NULL, ps);
+     pa_xfree(fn);
+diff -Naur pulseaudio-7.0/src/tests/alsa-mixer-path-test.c 
pulseaudio-7.0.new/src/tests/alsa-mixer-path-test.c
+--- pulseaudio-7.0/src/tests/alsa-mixer-path-test.c    2014-02-15 
03:06:12.000000000 +1100
++++ pulseaudio-7.0.new/src/tests/alsa-mixer-path-test.c        2015-11-18 
12:57:40.750001071 +1100
+@@ -15,10 +15,11 @@
+ 
+ /* This function was copied from alsa-mixer.c */
+ static const char *get_default_paths_dir(void) {
++    char *env = getenv("PA_ALSA_PATHS_DIR");
+     if (pa_run_from_build_tree())
+         return PA_SRCDIR "/modules/alsa/mixer/paths/";
+     else
+-        return PA_ALSA_PATHS_DIR;
++        return (env ? env : PA_ALSA_PATHS_DIR);
+ }
+ 
+ static pa_strlist *load_makefile() {
diff --git a/pkgs/servers/pulseaudio/default.nix 
b/pkgs/servers/pulseaudio/default.nix
index d1888e1..fcef7cf 100644
--- a/pkgs/servers/pulseaudio/default.nix
+++ b/pkgs/servers/pulseaudio/default.nix
@@ -41,7 +41,7 @@ stdenv.mkDerivation rec {
     sha256 = "1yp8x8z4wigrzik131kjdyhn7hznazvbkbp2zz1vy9l9gqvy26na";
   };
 
-  patches = [ ./caps-fix.patch ];
+  patches = [ ./caps-fix.patch ./custom-dirs.patch ];
 
   nativeBuildInputs = [ pkgconfig intltool autoreconfHook ];
 
-- 
2.5.3

_______________________________________________
nix-dev mailing list
nix-dev@lists.science.uu.nl
http://lists.science.uu.nl/mailman/listinfo/nix-dev

Reply via email to