{ 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 error, warn, notice, info, or debug. ''; }; }; }; ###### 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"; stopOn = "shutdown"; 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}" ''; }; }; }