{ lib, config, pkgs, ... }: with lib; let psCfg = config.pub-solar; cfg = config.pub-solar.audio; xdg = config.home-manager.users."${psCfg.user.name}".xdg; in { options.pub-solar.audio = { enable = mkEnableOption "Life in highs and lows"; mopidy.enable = mkEnableOption "Life with mopidy"; spotify.enable = mkEnableOption "Life in DRM"; spotify.username = mkOption { description = "Spotify login username or email"; type = types.str; example = "yourname@example.com"; default = ""; }; bluetooth.enable = mkEnableOption "Life with bluetooth"; }; config = mkIf cfg.enable { users.users = pkgs.lib.setAttrByPath [psCfg.user.name] { extraGroups = ["audio"]; }; home-manager = with pkgs; pkgs.lib.setAttrByPath ["users" psCfg.user.name] { home.packages = [ # easyeffects, e.g. for microphone noise filtering easyeffects mu pavucontrol pa_applet playerctl # Needed for pactl cmd, until pw-cli is more mature (vol up/down hotkeys?) pulseaudio vimpc ] ++ ( if cfg.spotify.enable then [pkgs.spotify-tui] else [] ); xdg.configFile."vimpc/vimpcrc".source = ./.config/vimpc/vimpcrc; systemd.user.services.easyeffects = import ./easyeffects.service.nix pkgs; services.spotifyd = mkIf cfg.spotify.enable { enable = true; settings = { global = { username = cfg.spotify.username; password_cmd = "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus ${pkgs.libsecret}/bin/secret-tool lookup spotify password"; bitrate = 320; volume_normalisation = true; no_audio_cache = false; max_cache_size = 1000000000; }; }; }; }; # rtkit is optional but recommended security.rtkit.enable = true; # Enable sound using pipewire-pulse, default config: # https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/daemon/pipewire.conf.in services.pipewire = { enable = true; alsa.enable = true; alsa.support32Bit = true; pulse.enable = true; config.pipewire = { context.default.clock = { allowed-rates = [44100 48000 88200 96000]; rate = 44100; quantum = 2048; min-quantum = 1024; max-quantum = 4096; }; }; config.pipewire-pulse = builtins.fromJSON (builtins.readFile ./pipewire-pulse.conf.json); }; # Make pulseaudio listen on port 4713 for mopidy, extending the default # config: https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/daemon/pipewire-pulse.conf.in environment.etc = mkIf cfg.mopidy.enable { "pipewire/pipewire-pulse.conf.d/99-custom.conf".text = '' { "context.modules": [ { "name": "libpipewire-module-protocol-pulse", "args": { "server.address": ["unix:native", "tcp:4713"], "vm.overrides": { "pulse.min.quantum": "1024/48000" } } } ] } ''; }; # Enable bluetooth hardware.bluetooth = mkIf cfg.bluetooth.enable { enable = true; # Disable bluetooth on startup to save battery powerOnBoot = false; # Disable useless SIM Access Profile plugin disabledPlugins = [ "sap" ]; settings = { General = { # Enables experimental features and interfaces. # Makes BlueZ Battery Provider available Experimental = true; }; }; }; services.blueman.enable = mkIf cfg.bluetooth.enable true; # Enable audio server & client services.mopidy = mkIf cfg.mopidy.enable ((import ./mopidy.nix) pkgs); }; }