Merge pull request #106 from rickynils/pulseaudio
Merge hardware.pulseaudio and services.pulseaudio
This commit is contained in:
commit
f3d063f398
|
@ -1,91 +1,147 @@
|
||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
with pkgs.lib;
|
with pkgs.lib;
|
||||||
|
with pkgs;
|
||||||
|
|
||||||
let cfg = config.hardware.pulseaudio; in
|
let
|
||||||
|
|
||||||
{
|
cfg = config.hardware.pulseaudio;
|
||||||
|
|
||||||
|
uid = config.ids.uids.pulseaudio;
|
||||||
|
gid = config.ids.gids.pulseaudio;
|
||||||
|
|
||||||
|
pulseRuntimePath = "/var/run/pulse";
|
||||||
|
|
||||||
|
# Create pulse/client.conf even if PulseAudio is disabled so
|
||||||
|
# that we can disable the autospawn feature in programs that
|
||||||
|
# are built with PulseAudio support (like KDE).
|
||||||
|
clientConf = writeText "client.conf" ''
|
||||||
|
autospawn=${if (cfg.enable && !cfg.systemWide) then "yes" else "no"}
|
||||||
|
${optionalString (cfg.enable && !cfg.systemWide)
|
||||||
|
"daemon-binary=${cfg.package}/bin/pulseaudio"}
|
||||||
|
'';
|
||||||
|
|
||||||
|
# Write an /etc/asound.conf that causes all ALSA applications to
|
||||||
|
# be re-routed to the PulseAudio server through ALSA's Pulse
|
||||||
|
# plugin.
|
||||||
|
alsaConf = writeText "asound.conf" ''
|
||||||
|
pcm_type.pulse {
|
||||||
|
lib ${alsaPlugins}/lib/alsa-lib/libasound_module_pcm_pulse.so
|
||||||
|
}
|
||||||
|
pcm.!default {
|
||||||
|
type pulse
|
||||||
|
hint.description "Default Audio Device (via PulseAudio)"
|
||||||
|
}
|
||||||
|
ctl_type.pulse {
|
||||||
|
lib ${alsaPlugins}/lib/alsa-lib/libasound_module_ctl_pulse.so
|
||||||
|
}
|
||||||
|
ctl.!default {
|
||||||
|
type pulse
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
in {
|
||||||
|
|
||||||
options = {
|
options = {
|
||||||
|
|
||||||
hardware.pulseaudio.enable = mkOption {
|
hardware.pulseaudio = {
|
||||||
|
enable = mkOption {
|
||||||
default = false;
|
default = false;
|
||||||
description = ''
|
description = ''
|
||||||
Whether to enable the PulseAudio sound server.
|
Whether to enable the PulseAudio sound server.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
hardware.pulseaudio.package = mkOption {
|
systemWide = mkOption {
|
||||||
default = pkgs.pulseaudio;
|
type = types.bool;
|
||||||
example = "pkgs.pulseaudio.override { jackaudioSupport = true; }";
|
default = false;
|
||||||
|
description = ''
|
||||||
|
If false, a PulseAudio server is launched automatically for
|
||||||
|
each user that tries to use the sound system. The server runs
|
||||||
|
with user priviliges. This is the recommended and most secure
|
||||||
|
way to use PulseAudio. If true, one system-wide PulseAudio
|
||||||
|
server is launched on boot, running as the user "pulse".
|
||||||
|
Please read the PulseAudio documentation for more details.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
configFile = mkOption {
|
||||||
|
type = types.uniq types.path;
|
||||||
|
default = "${pulseaudio}/etc/pulse/default.pa";
|
||||||
|
description = ''
|
||||||
|
The path to the configuration the PulseAudio server
|
||||||
|
should use. By default, the "default.pa" configuration
|
||||||
|
from the PulseAudio distribution is used.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
package = mkOption {
|
||||||
|
default = pulseaudio;
|
||||||
|
example = "pulseaudio.override { jackaudioSupport = true; }";
|
||||||
description = ''
|
description = ''
|
||||||
The PulseAudio derivation to use. This can be used to enable
|
The PulseAudio derivation to use. This can be used to enable
|
||||||
features (such as JACK support) that are not enabled in the
|
features (such as JACK support) that are not enabled in the
|
||||||
default PulseAudio in Nixpkgs.
|
default PulseAudio in Nixpkgs.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
config = mkMerge
|
config = mkMerge [
|
||||||
[ # Create pulse/client.conf even if PulseAudio is disabled so
|
{
|
||||||
# that we can disable the autospawn feature in programs that
|
environment.etc = singleton {
|
||||||
# are built with PulseAudio support (like KDE).
|
target = "pulse/client.conf";
|
||||||
{ environment.etc = singleton
|
source = clientConf;
|
||||||
{ target = "pulse/client.conf";
|
|
||||||
source = pkgs.writeText "client.conf"
|
|
||||||
''
|
|
||||||
autospawn=${if cfg.enable then "yes" else "no"}
|
|
||||||
${optionalString cfg.enable ''
|
|
||||||
daemon-binary=${cfg.package}/bin/pulseaudio
|
|
||||||
''}
|
|
||||||
'';
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
(mkIf cfg.enable {
|
(mkIf cfg.enable {
|
||||||
|
|
||||||
environment.systemPackages = [ cfg.package ];
|
environment.systemPackages = [ cfg.package ];
|
||||||
|
|
||||||
environment.etc =
|
environment.etc = singleton {
|
||||||
[ # Write an /etc/asound.conf that causes all ALSA applications to
|
target = "asound.conf";
|
||||||
# be re-routed to the PulseAudio server through ALSA's Pulse
|
source = alsaConf;
|
||||||
# plugin.
|
};
|
||||||
{ target = "asound.conf";
|
|
||||||
source = pkgs.writeText "asound.conf"
|
|
||||||
''
|
|
||||||
pcm_type.pulse {
|
|
||||||
lib ${pkgs.alsaPlugins}/lib/alsa-lib/libasound_module_pcm_pulse.so
|
|
||||||
}
|
|
||||||
|
|
||||||
pcm.!default {
|
|
||||||
type pulse
|
|
||||||
hint.description "Default Audio Device (via PulseAudio)"
|
|
||||||
}
|
|
||||||
|
|
||||||
ctl_type.pulse {
|
|
||||||
lib ${pkgs.alsaPlugins}/lib/alsa-lib/libasound_module_ctl_pulse.so
|
|
||||||
}
|
|
||||||
|
|
||||||
ctl.!default {
|
|
||||||
type pulse
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
}
|
|
||||||
|
|
||||||
{ target = "pulse/default.pa";
|
|
||||||
source = "${cfg.package}/etc/pulse/default.pa";
|
|
||||||
}
|
|
||||||
|
|
||||||
{ target = "pulse/system.pa";
|
|
||||||
source = "${cfg.package}/etc/pulse/system.pa";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
# Allow PulseAudio to get realtime priority using rtkit.
|
# Allow PulseAudio to get realtime priority using rtkit.
|
||||||
security.rtkit.enable = true;
|
security.rtkit.enable = true;
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkIf (cfg.enable && !cfg.systemWide) {
|
||||||
|
environment.etc = singleton {
|
||||||
|
target = "pulse/default.pa";
|
||||||
|
source = cfg.configFile;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkIf (cfg.enable && cfg.systemWide) {
|
||||||
|
users.extraUsers.pulse = {
|
||||||
|
# For some reason, PulseAudio wants UID == GID.
|
||||||
|
uid = assert uid == gid; uid;
|
||||||
|
group = "pulse";
|
||||||
|
extraGroups = [ "audio" ];
|
||||||
|
description = "PulseAudio system service user";
|
||||||
|
home = pulseRuntimePath;
|
||||||
|
};
|
||||||
|
|
||||||
|
users.extraGroups.pulse.gid = gid;
|
||||||
|
|
||||||
|
systemd.services.pulseaudio = {
|
||||||
|
description = "PulseAudio system-wide server";
|
||||||
|
wantedBy = [ "sound.target" ];
|
||||||
|
before = [ "sound.target" ];
|
||||||
|
path = [ pulseaudio ];
|
||||||
|
environment.PULSE_RUNTIME_PATH = pulseRuntimePath;
|
||||||
|
preStart = ''
|
||||||
|
mkdir -p --mode 755 ${pulseRuntimePath}
|
||||||
|
chown -R pulse:pulse ${pulseRuntimePath}
|
||||||
|
'';
|
||||||
|
script = ''
|
||||||
|
exec pulseaudio --system -n --file="${cfg.configFile}"
|
||||||
|
'';
|
||||||
|
};
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,6 @@
|
||||||
./services/audio/alsa.nix
|
./services/audio/alsa.nix
|
||||||
./services/audio/fuppes.nix
|
./services/audio/fuppes.nix
|
||||||
./services/audio/mpd.nix
|
./services/audio/mpd.nix
|
||||||
./services/audio/pulseaudio.nix
|
|
||||||
./services/backup/mysql-backup.nix
|
./services/backup/mysql-backup.nix
|
||||||
./services/backup/postgresql-backup.nix
|
./services/backup/postgresql-backup.nix
|
||||||
./services/backup/sitecopy-backup.nix
|
./services/backup/sitecopy-backup.nix
|
||||||
|
|
|
@ -1,87 +0,0 @@
|
||||||
{ config, pkgs, ... }:
|
|
||||||
|
|
||||||
with pkgs.lib;
|
|
||||||
|
|
||||||
let
|
|
||||||
|
|
||||||
uid = config.ids.uids.pulseaudio;
|
|
||||||
gid = config.ids.gids.pulseaudio;
|
|
||||||
|
|
||||||
in
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
###### interface
|
|
||||||
|
|
||||||
options = {
|
|
||||||
|
|
||||||
services.pulseaudio = {
|
|
||||||
|
|
||||||
enable = mkOption {
|
|
||||||
default = false;
|
|
||||||
description = ''
|
|
||||||
Whether to enable the PulseAudio system-wide audio server.
|
|
||||||
Note that the documentation recommends running PulseAudio
|
|
||||||
daemons per-user rather than system-wide on desktop machines.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
logLevel = mkOption {
|
|
||||||
default = "notice";
|
|
||||||
example = "debug";
|
|
||||||
description = ''
|
|
||||||
A string denoting the log level: one of
|
|
||||||
<literal>error</literal>, <literal>warn</literal>,
|
|
||||||
<literal>notice</literal>, <literal>info</literal>,
|
|
||||||
or <literal>debug</literal>.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
###### implementation
|
|
||||||
|
|
||||||
config = mkIf config.services.pulseaudio.enable {
|
|
||||||
|
|
||||||
environment.systemPackages = [ pkgs.pulseaudio ];
|
|
||||||
|
|
||||||
users.extraUsers = singleton
|
|
||||||
{ name = "pulse";
|
|
||||||
# For some reason, PulseAudio wants UID == GID.
|
|
||||||
uid = assert uid == gid; uid;
|
|
||||||
group = "pulse";
|
|
||||||
description = "PulseAudio system-wide daemon";
|
|
||||||
home = "/var/run/pulse";
|
|
||||||
};
|
|
||||||
|
|
||||||
users.extraGroups = singleton
|
|
||||||
{ name = "pulse";
|
|
||||||
inherit gid;
|
|
||||||
};
|
|
||||||
|
|
||||||
jobs.pulseaudio =
|
|
||||||
{ description = "PulseAudio system-wide server";
|
|
||||||
|
|
||||||
startOn = "startup";
|
|
||||||
|
|
||||||
preStart =
|
|
||||||
''
|
|
||||||
test -d /var/run/pulse || \
|
|
||||||
( mkdir -p --mode 755 /var/run/pulse && \
|
|
||||||
chown pulse:pulse /var/run/pulse )
|
|
||||||
'';
|
|
||||||
|
|
||||||
exec =
|
|
||||||
''
|
|
||||||
${pkgs.pulseaudio}/bin/pulseaudio \
|
|
||||||
--system --daemonize \
|
|
||||||
--log-level="${config.services.pulseaudio.logLevel}"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue