refactor
This commit is contained in:
		
							parent
							
								
									66c05f9093
								
							
						
					
					
						commit
						45d6f4b0f3
					
				
					 205 changed files with 9040 additions and 342 deletions
				
			
		
							
								
								
									
										200
									
								
								modules/nixos/hardware/audio/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										200
									
								
								modules/nixos/hardware/audio/default.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,200 @@
 | 
			
		|||
{ options
 | 
			
		||||
, config
 | 
			
		||||
, pkgs
 | 
			
		||||
, lib
 | 
			
		||||
, ...
 | 
			
		||||
}:
 | 
			
		||||
# FIXME: The transition to wireplumber from media-session has completely
 | 
			
		||||
# broken my setup. I'll need to invest some time to figure out how to override Alsa things
 | 
			
		||||
# again...
 | 
			
		||||
with lib;
 | 
			
		||||
with lib.plusultra; let
 | 
			
		||||
  cfg = config.plusultra.hardware.audio;
 | 
			
		||||
 | 
			
		||||
  lua-format = {
 | 
			
		||||
    type = with lib.types; let
 | 
			
		||||
      valueType =
 | 
			
		||||
        nullOr
 | 
			
		||||
          (oneOf [
 | 
			
		||||
            bool
 | 
			
		||||
            int
 | 
			
		||||
            float
 | 
			
		||||
            str
 | 
			
		||||
            path
 | 
			
		||||
            (attrsOf valueType)
 | 
			
		||||
            (listOf valueType)
 | 
			
		||||
          ])
 | 
			
		||||
        // {
 | 
			
		||||
          description = "Lua value";
 | 
			
		||||
        };
 | 
			
		||||
    in
 | 
			
		||||
    valueType;
 | 
			
		||||
 | 
			
		||||
    generate = name: value:
 | 
			
		||||
      let
 | 
			
		||||
        toLuaValue = value:
 | 
			
		||||
          if value == null
 | 
			
		||||
          then "null"
 | 
			
		||||
          else if value == true
 | 
			
		||||
          then "true"
 | 
			
		||||
          else if value == false
 | 
			
		||||
          then "false"
 | 
			
		||||
          else if builtins.isInt value || builtins.isFloat value
 | 
			
		||||
          then builtins.toString value
 | 
			
		||||
          else if builtins.isString value
 | 
			
		||||
          then toLuaString value
 | 
			
		||||
          else if builtins.isAttrs value
 | 
			
		||||
          then toLuaTable value
 | 
			
		||||
          else if builtins.isList value
 | 
			
		||||
          then toLuaList value
 | 
			
		||||
          else builtins.abort "Unsupported value used with formats.lua.generate: ${value}";
 | 
			
		||||
 | 
			
		||||
        toLuaString = value: "\"${builtins.toString value}\"";
 | 
			
		||||
 | 
			
		||||
        toLuaTable = value:
 | 
			
		||||
          let
 | 
			
		||||
            pairs =
 | 
			
		||||
              mapAttrsToList
 | 
			
		||||
                (name: value: "[${toLuaString name}] = ${toLuaValue value}")
 | 
			
		||||
                value;
 | 
			
		||||
            content = concatStringsSep ", " pairs;
 | 
			
		||||
          in
 | 
			
		||||
          "{ ${content} }";
 | 
			
		||||
 | 
			
		||||
        toLuaList = value:
 | 
			
		||||
          let
 | 
			
		||||
            parts = builtins.map toLuaValue value;
 | 
			
		||||
            content = concatStringsSep ", " parts;
 | 
			
		||||
          in
 | 
			
		||||
          "{ ${content} }";
 | 
			
		||||
      in
 | 
			
		||||
      toLuaValue value;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  pipewire-config = {
 | 
			
		||||
    "context.objects" = cfg.nodes ++ [ ];
 | 
			
		||||
    "context.modules" =
 | 
			
		||||
      [
 | 
			
		||||
        {
 | 
			
		||||
          name = "libpipewire-module-rtkit";
 | 
			
		||||
          args = { };
 | 
			
		||||
          flags = [ "ifexists" "nofail" ];
 | 
			
		||||
        }
 | 
			
		||||
        { name = "libpipewire-module-protocol-native"; }
 | 
			
		||||
        { name = "libpipewire-module-profiler"; }
 | 
			
		||||
        # {
 | 
			
		||||
        #   name = "libpipewire-module-metadata";
 | 
			
		||||
        #   flags = [ "ifexists" "nofail" ];
 | 
			
		||||
        # }
 | 
			
		||||
        { name = "libpipewire-module-spa-device-factory"; }
 | 
			
		||||
        { name = "libpipewire-module-spa-node-factory"; }
 | 
			
		||||
        # {
 | 
			
		||||
        #   name = "libpipewire-module-client-node";
 | 
			
		||||
        #   flags = [ "ifexists" "nofail" ];
 | 
			
		||||
        # }
 | 
			
		||||
        # {
 | 
			
		||||
        #   name = "libpipewire-module-client-device";
 | 
			
		||||
        #   flags = [ "ifexists" "nofail" ];
 | 
			
		||||
        # }
 | 
			
		||||
        {
 | 
			
		||||
          name = "libpipewire-module-portal";
 | 
			
		||||
          flags = [ "ifexists" "nofail" ];
 | 
			
		||||
        }
 | 
			
		||||
        {
 | 
			
		||||
          name = "libpipewire-module-access";
 | 
			
		||||
          args = { };
 | 
			
		||||
        }
 | 
			
		||||
        { name = "libpipewire-module-adapter"; }
 | 
			
		||||
        { name = "libpipewire-module-link-factory"; }
 | 
			
		||||
        { name = "libpipewire-module-session-manager"; }
 | 
			
		||||
      ]
 | 
			
		||||
      ++ cfg.modules;
 | 
			
		||||
    "context.components" = [
 | 
			
		||||
      {
 | 
			
		||||
        name = "libwireplumber-module-lua-scripting";
 | 
			
		||||
        type = "module";
 | 
			
		||||
      }
 | 
			
		||||
      {
 | 
			
		||||
        name = "config.lua";
 | 
			
		||||
        type = "config/lua";
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  alsa-config = {
 | 
			
		||||
    alsa_monitor = cfg.alsa-monitor;
 | 
			
		||||
  };
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  options.plusultra.hardware.audio = with types; {
 | 
			
		||||
    enable = mkBoolOpt false "Whether or not to enable audio support.";
 | 
			
		||||
    alsa-monitor = mkOpt attrs { } "Alsa configuration.";
 | 
			
		||||
    nodes =
 | 
			
		||||
      mkOpt (listOf attrs) [ ]
 | 
			
		||||
        "Audio nodes to pass to Pipewire as `context.objects`.";
 | 
			
		||||
    modules =
 | 
			
		||||
      mkOpt (listOf attrs) [ ]
 | 
			
		||||
        "Audio modules to pass to Pipewire as `context.modules`.";
 | 
			
		||||
    extra-packages = mkOpt (listOf package) [
 | 
			
		||||
      pkgs.qjackctl
 | 
			
		||||
      pkgs.easyeffects
 | 
			
		||||
    ] "Additional packages to install.";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  config = mkIf cfg.enable {
 | 
			
		||||
    security.rtkit.enable = true;
 | 
			
		||||
 | 
			
		||||
    services.pipewire = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      alsa.enable = true;
 | 
			
		||||
      pulse.enable = true;
 | 
			
		||||
      jack.enable = true;
 | 
			
		||||
 | 
			
		||||
      wireplumber.enable = true;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    environment.etc = {
 | 
			
		||||
      # "pipewire/pipewire.conf.d/10-pipewire.conf".source =
 | 
			
		||||
      #   pkgs.writeText "pipewire.conf" (builtins.toJSON pipewire-config);
 | 
			
		||||
      # "pipewire/pipewire.conf.d/21-alsa.conf".source =
 | 
			
		||||
      #   pkgs.writeText "pipewire.conf" (builtins.toJSON alsa-config);
 | 
			
		||||
 | 
			
		||||
      #       "wireplumber/wireplumber.conf".source =
 | 
			
		||||
      #         pkgs.writeText "pipewire.conf" (builtins.toJSON pipewire-config);
 | 
			
		||||
 | 
			
		||||
      # "wireplumber/scripts/config.lua.d/alsa.lua".text = ''
 | 
			
		||||
      #   local input = ${lua-format.generate "sample.lua" cfg.alsa-monitor}
 | 
			
		||||
 | 
			
		||||
      #   if input.rules == nil then
 | 
			
		||||
      #    input.rules = {}
 | 
			
		||||
      #   end
 | 
			
		||||
 | 
			
		||||
      #   local rules = input.rules
 | 
			
		||||
 | 
			
		||||
      #   for _, rule in ipairs(input.rules) do
 | 
			
		||||
      #     table.insert(alsa_monitor.rules, rule)
 | 
			
		||||
      #   end
 | 
			
		||||
      # '';
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    hardware.pulseaudio.enable = mkForce false;
 | 
			
		||||
 | 
			
		||||
    environment.systemPackages = with pkgs;
 | 
			
		||||
      [
 | 
			
		||||
        pulsemixer
 | 
			
		||||
        pavucontrol
 | 
			
		||||
      ]
 | 
			
		||||
      ++ cfg.extra-packages;
 | 
			
		||||
 | 
			
		||||
    plusultra.user.extraGroups = [ "audio" ];
 | 
			
		||||
 | 
			
		||||
    plusultra.home.extraOptions = {
 | 
			
		||||
      systemd.user.services.mpris-proxy = {
 | 
			
		||||
        Unit.Description = "Mpris proxy";
 | 
			
		||||
        Unit.After = [ "network.target" "sound.target" ];
 | 
			
		||||
        Service.ExecStart = "${pkgs.bluez}/bin/mpris-proxy";
 | 
			
		||||
        Install.WantedBy = [ "default.target" ];
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue