{ 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; }; }; }; }; # Enable sound using pipewire-pulse 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); }; # Bluetooth configuration using wireplumber # https://nixos.wiki/wiki/PipeWire#Bluetooth_Configuration environment.etc = mkIf cfg.bluetooth.enable { "wireplumber/bluetooth.lua.d/51-bluez-config.lua".text = '' bluez_monitor.properties = { ["bluez5.enable-sbc-xq"] = true, ["bluez5.enable-msbc"] = true, ["bluez5.enable-hw-volume"] = true, ["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]" } ''; }; # Enable bluetooth hardware.bluetooth.enable = mkIf cfg.bluetooth.enable true; services.blueman.enable = mkIf cfg.bluetooth.enable true; # Enable audio server & client services.mopidy = mkIf cfg.mopidy.enable ((import ./mopidy.nix) pkgs); }; }