diff options
Diffstat (limited to 'custom')
-rw-r--r-- | custom/trivmix-service.nix | 94 |
1 files changed, 65 insertions, 29 deletions
diff --git a/custom/trivmix-service.nix b/custom/trivmix-service.nix index 44044504..e8cb5072 100644 --- a/custom/trivmix-service.nix +++ b/custom/trivmix-service.nix | |||
@@ -1,40 +1,69 @@ | |||
1 | { name | 1 | { config, lib, pkgs, ... }: |
2 | , run ? null | 2 | |
3 | , connectOut ? null | 3 | with lib; |
4 | , connectIn ? null | ||
5 | , group ? null | ||
6 | , initial ? null | ||
7 | , adjustable ? true | ||
8 | , trivmix | ||
9 | , stdenv | ||
10 | , makeWrapper | ||
11 | , jack2Full | ||
12 | , coreutils | ||
13 | , writeScript | ||
14 | }: | ||
15 | 4 | ||
16 | let | 5 | let |
17 | connect = (! isNull connectOut) || (! isNull connectIn); | 6 | cfg = config.services.trivmix; |
18 | connectScript = writeScript "connect" '' | ||
19 | #!${stdenv.shell} | ||
20 | 7 | ||
21 | PATH=${jack2Full}/bin:$PATH | 8 | mixerModule = { |
9 | connectIn = mkOption { | ||
10 | type = with types; either str (listOf str); | ||
11 | default = []; | ||
12 | description = "Ports to connect mixer input to"; | ||
13 | }; | ||
22 | 14 | ||
23 | ${optionalString (! isNull connectIn) "jack_connect ${connectIn} $1"} | 15 | connectOut = mkOption { |
24 | ${optionalString (! isNull connectOut) "jack_connect $2 ${connectOut}"} | 16 | type = with types; either str (listOf str); |
25 | ''; | 17 | default = []; |
26 | inherit (stdenv.lib) optionalString; | 18 | description = "Ports to connect mixer output to"; |
27 | in { | 19 | }; |
28 | out = { | 20 | |
21 | onConnect = mkOption { | ||
22 | type = types.lines; | ||
23 | default = ""; | ||
24 | description = "Additional shell commands to run after connections are set up"; | ||
25 | }; | ||
26 | |||
27 | adjustable = mkOption { | ||
28 | type = types.bool; | ||
29 | default = true; | ||
30 | description = "Should the volume on this mixer be adjustable?"; | ||
31 | }; | ||
32 | |||
33 | group = mkOption { | ||
34 | type = types.nullOr types.str; | ||
35 | default = null; | ||
36 | description = "Volumes of mixers that share a group name are synchronised"; | ||
37 | }; | ||
38 | |||
39 | initial = mkOption { | ||
40 | type = types.str; | ||
41 | default = "1"; | ||
42 | description = "Initial volume"; | ||
43 | }; | ||
44 | }; | ||
45 | |||
46 | service = name: mixerCfg: with mixerCfg; let | ||
47 | connectIn = if isList mixerCfg.connectIn then mixerCfg.connectIn else singleton mixerCfg.connectIn; | ||
48 | connectOut = if isList mixerCfg.connectOut then mixerCfg.connectOut else singleton mixerCfg.connectOut; | ||
49 | |||
50 | connectScript = '' | ||
51 | #!${pkgs.stdenv.shell} | ||
52 | |||
53 | ${concatMapStringsSep "\n" (port: "jack_connect ${port} $1") connectIn} | ||
54 | ${concatMapStringsSep "\n" (port: "jack_connect $2 ${port}") connectOut} | ||
55 | ${onConnect} | ||
56 | ''; | ||
57 | |||
58 | connect = (connectOut != []) || (connectIn != []) || (onConnect != []); | ||
59 | in { | ||
29 | wantedBy = [ "sound.target" ]; | 60 | wantedBy = [ "sound.target" ]; |
30 | requires = [ "jack.service" ]; | 61 | requires = [ "jack.service" ]; |
31 | before = [ "mpd.service" ]; | ||
32 | serviceConfig = { | 62 | serviceConfig = { |
33 | Type = "simple"; | 63 | Type = "simple"; |
34 | ExecStart = ''${trivmix}/bin/trivmix --client ${name} \ | 64 | ExecStart = ''${pkgs.trivmix}/bin/trivmix --client ${name} \ |
35 | ${optionalString connect "--run ${connectScript}"} \ | 65 | ${optionalString connect "--run ${connectScript}"} \ |
36 | ${optionalString (! isNull run) "--run ${run}"} \ | 66 | "--level ${initial}" \ |
37 | ${optionalString (! isNull initial) "--level ${initial}"} \ | ||
38 | ${optionalString (adjustable && isNull group) "/dev/shm/mix/${name}/level"} \ | 67 | ${optionalString (adjustable && isNull group) "/dev/shm/mix/${name}/level"} \ |
39 | ${optionalString (! isNull group) "/dev/shm/mix/${group}/level"} | 68 | ${optionalString (! isNull group) "/dev/shm/mix/${group}/level"} |
40 | ''; | 69 | ''; |
@@ -43,6 +72,13 @@ in { | |||
43 | Nice = "-10"; | 72 | Nice = "-10"; |
44 | LimitRTPRIO = "95:95"; | 73 | LimitRTPRIO = "95:95"; |
45 | LimitMEMLOCK = "infinity"; | 74 | LimitMEMLOCK = "infinity"; |
46 | }; | ||
47 | }; | 75 | }; |
76 | in { | ||
77 | options.services.trivmix = mkOption { | ||
78 | type = types.attrsOf (types.submodule mixerModule); | ||
79 | default = []; | ||
80 | description = "Definition of mixers"; | ||
81 | }; | ||
82 | |||
83 | config.systemd.services = mapAttrs service cfg; | ||
48 | } | 84 | } |