summary refs log tree commit diff
path: root/modules/services/audio/alsa.nix
blob: 9181a86b377847b957e41cd0a0c9625f7f94c225 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# ALSA sound support.
{ config, pkgs, ... }:

with pkgs.lib;

let

  inherit (pkgs) alsaUtils;

  soundState = "/var/lib/alsa/asound.state";

in

{

  ###### interface
  
  options = {
  
    sound = {

      enable = mkOption {
        default = true;
        description = ''
          Whether to enable ALSA sound.
        '';
        merge = mergeEnableOption;
      };
      
      enableOSSEmulation = mkOption {
        default = true;
	description = ''
	  Whether to enable ALSA OSS emulation (with certain cards sound mixing may not work!).
	'';
      };

    };
    
  };


  ###### implementation
  
  config = mkIf config.sound.enable {
  
    environment.systemPackages = [alsaUtils];

    users.extraGroups = singleton
      { # Alsalib seems to require the existence of this group, even
        # if it's not used (e.g., doesn't own any devices).
        name = "audio";
        gid = config.ids.gids.audio;
      };

    jobs.alsa =
      { startOn = "stopped udevtrigger";

        preStart =
          ''
            mkdir -m 0755 -p $(dirname ${soundState})

            # Load some additional modules.
	    ${optionalString config.sound.enableOSSEmulation
	      ''
                for mod in snd_pcm_oss; do
                  ${config.system.sbin.modprobe}/sbin/modprobe $mod || true
                done
	      ''
	    }

            # Restore the sound state.
            ${alsaUtils}/sbin/alsactl -f ${soundState} restore || true
          '';

        postStop =
          ''
            # Save the sound state.
            ${alsaUtils}/sbin/alsactl -f ${soundState} store
          '';
      };
      
  };

}