python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / services / audio / alsa.nix
blob155780199fd648515c4dad3a7459465a501e4811
1 # ALSA sound support.
2 { config, lib, pkgs, ... }:
4 with lib;
6 let
8   inherit (pkgs) alsa-utils;
10   pulseaudioEnabled = config.hardware.pulseaudio.enable;
15   imports = [
16     (mkRenamedOptionModule [ "sound" "enableMediaKeys" ] [ "sound" "mediaKeys" "enable" ])
17   ];
19   ###### interface
21   options = {
23     sound = {
25       enable = mkOption {
26         type = types.bool;
27         default = false;
28         description = lib.mdDoc ''
29           Whether to enable ALSA sound.
30         '';
31       };
33       enableOSSEmulation = mkOption {
34         type = types.bool;
35         default = false;
36         description = lib.mdDoc ''
37           Whether to enable ALSA OSS emulation (with certain cards sound mixing may not work!).
38         '';
39       };
41       extraConfig = mkOption {
42         type = types.lines;
43         default = "";
44         example = ''
45           defaults.pcm.!card 3
46         '';
47         description = lib.mdDoc ''
48           Set addition configuration for system-wide alsa.
49         '';
50       };
52       mediaKeys = {
54         enable = mkOption {
55           type = types.bool;
56           default = false;
57           description = lib.mdDoc ''
58             Whether to enable volume and capture control with keyboard media keys.
60             You want to leave this disabled if you run a desktop environment
61             like KDE, Gnome, Xfce, etc, as those handle such things themselves.
62             You might want to enable this if you run a minimalistic desktop
63             environment or work from bare linux ttys/framebuffers.
65             Enabling this will turn on {option}`services.actkbd`.
66           '';
67         };
69         volumeStep = mkOption {
70           type = types.str;
71           default = "1";
72           example = "1%";
73           description = lib.mdDoc ''
74             The value by which to increment/decrement volume on media keys.
76             See amixer(1) for allowed values.
77           '';
78         };
80       };
82     };
84   };
87   ###### implementation
89   config = mkIf config.sound.enable {
91     environment.systemPackages = [ alsa-utils ];
93     environment.etc = mkIf (!pulseaudioEnabled && config.sound.extraConfig != "")
94       { "asound.conf".text = config.sound.extraConfig; };
96     # ALSA provides a udev rule for restoring volume settings.
97     services.udev.packages = [ alsa-utils ];
99     boot.kernelModules = optional config.sound.enableOSSEmulation "snd_pcm_oss";
101     systemd.services.alsa-store =
102       { description = "Store Sound Card State";
103         wantedBy = [ "multi-user.target" ];
104         unitConfig.RequiresMountsFor = "/var/lib/alsa";
105         unitConfig.ConditionVirtualization = "!systemd-nspawn";
106         serviceConfig = {
107           Type = "oneshot";
108           RemainAfterExit = true;
109           ExecStart = "${pkgs.coreutils}/bin/mkdir -p /var/lib/alsa";
110           ExecStop = "${alsa-utils}/sbin/alsactl store --ignore";
111         };
112       };
114     services.actkbd = mkIf config.sound.mediaKeys.enable {
115       enable = true;
116       bindings = [
117         # "Mute" media key
118         { keys = [ 113 ]; events = [ "key" ];       command = "${alsa-utils}/bin/amixer -q set Master toggle"; }
120         # "Lower Volume" media key
121         { keys = [ 114 ]; events = [ "key" "rep" ]; command = "${alsa-utils}/bin/amixer -q set Master ${config.sound.mediaKeys.volumeStep}- unmute"; }
123         # "Raise Volume" media key
124         { keys = [ 115 ]; events = [ "key" "rep" ]; command = "${alsa-utils}/bin/amixer -q set Master ${config.sound.mediaKeys.volumeStep}+ unmute"; }
126         # "Mic Mute" media key
127         { keys = [ 190 ]; events = [ "key" ];       command = "${alsa-utils}/bin/amixer -q set Capture toggle"; }
128       ];
129     };
131   };