From 0fd29f6ce02e37e14565ac5ccf2650d181ccbe21 Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Wed, 3 Feb 2021 22:57:38 +0200 Subject: pipewire: move pipewire-media-session to its own output and module --- .../desktops/pipewire/pipewire-media-session.nix | 336 +++++++++++++++++++++ .../services/desktops/pipewire/pipewire.nix | 265 ++++++++++++++++ 2 files changed, 601 insertions(+) create mode 100644 nixos/modules/services/desktops/pipewire/pipewire-media-session.nix create mode 100644 nixos/modules/services/desktops/pipewire/pipewire.nix (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix new file mode 100644 index 00000000000..b91bdcd6700 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix @@ -0,0 +1,336 @@ +# pipewire example session manager. +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.services.pipewire.pwms; + enable32BitAlsaPlugins = cfg.alsa.support32Bit + && pkgs.stdenv.isx86_64 + && pkgs.pkgsi686Linux.pipewire != null; + + # Helpers for generating the pipewire JSON config file + mkSPAValueString = v: + if builtins.isList v then "[${lib.concatMapStringsSep " " mkSPAValueString v}]" + else if lib.types.attrs.check v then + "{${lib.concatStringsSep " " (mkSPAKeyValue v)}}" + else lib.generators.mkValueStringDefault { } v; + + mkSPAKeyValue = attrs: map (def: def.content) ( + lib.sortProperties + ( + lib.mapAttrsToList + (k: v: lib.mkOrder (v._priority or 1000) "${lib.escape [ "=" ] k} = ${mkSPAValueString (v._content or v)}") + attrs + ) + ); + + toSPAJSON = attrs: lib.concatStringsSep "\n" (mkSPAKeyValue attrs); +in { + + meta = { + maintainers = teams.freedesktop.members; + }; + + ###### interface + options = { + services.pipewire.pwms = { + enable = mkEnableOption "Example pipewire session manager"; + + package = mkOption { + type = types.package; + default = pkgs.pipewire.mediaSession; + example = literalExample "pkgs.pipewire.mediaSession"; + description = '' + The pipewire-media-session derivation to use. + ''; + }; + + config = mkOption { + type = types.attrs; + description = '' + Configuration for the media session core. + ''; + default = { + # media-session config file + properties = { + # Properties to configure the session and some + # modules + #mem.mlock-all = false + #context.profile.modules = default,rtkit + }; + + spa-libs = { + # Mapping from factory name to library. + "api.bluez5.*" = "bluez5/libspa-bluez5"; + "api.alsa.*" = "alsa/libspa-alsa"; + "api.v4l2.*" = "v4l2/libspa-v4l2"; + "api.libcamera.*" = "libcamera/libspa-libcamera"; + }; + + modules = { + # These are the modules that are enabled when a file with + # the key name is found in the media-session.d config directory. + # the default bundle is always enabled. + + default = [ + "flatpak" # manages flatpak access + "portal" # manage portal permissions + "v4l2" # video for linux udev detection + #"libcamera" # libcamera udev detection + "suspend-node" # suspend inactive nodes + "policy-node" # configure and link nodes + #"metadata" # export metadata API + #"default-nodes" # restore default nodes + #"default-profile" # restore default profiles + #"default-routes" # restore default route + #"streams-follow-default" # move streams when default changes + #"alsa-seq" # alsa seq midi support + #"alsa-monitor" # alsa udev detection + #"bluez5" # bluetooth support + #"restore-stream" # restore stream settings + ]; + "with-audio" = [ + "metadata" + "default-nodes" + "default-profile" + "default-routes" + "alsa-seq" + "alsa-monitor" + ]; + "with-alsa" = [ + "with-audio" + ]; + "with-jack" = [ + "with-audio" + ]; + "with-pulseaudio" = [ + "with-audio" + "bluez5" + "restore-stream" + "streams-follow-default" + ]; + }; + }; + }; + + alsaMonitorConfig = mkOption { + type = types.attrs; + description = '' + Configuration for the alsa monitor. + ''; + default = { + # alsa-monitor config file + properties = { + #alsa.jack-device = true + }; + + rules = [ + # an array of matches/actions to evaluate + { + # rules for matching a device or node. It is an array of + # properties that all need to match the regexp. If any of the + # matches work, the actions are executed for the object. + matches = [ + { + # this matches all cards + device.name = "~alsa_card.*"; + } + ]; + actions = { + # actions can update properties on the matched object. + update-props = { + api.alsa.use-acp = true; + #api.alsa.use-ucm = true + #api.alsa.soft-mixer = false + #api.alsa.ignore-dB = false + #device.profile-set = "profileset-name" + #device.profile = "default profile name" + api.acp.auto-profile = false; + api.acp.auto-port = false; + #device.nick = "My Device" + }; + }; + } + { + matches = [ + { + # matches all sinks + node.name = "~alsa_input.*"; + } + { + # matches all sources + node.name = "~alsa_output.*"; + } + ]; + actions = { + update-props = { + #node.nick = "My Node" + #node.nick = null + #priority.driver = 100 + #priority.session = 100 + #node.pause-on-idle = false + #resample.quality = 4 + #channelmix.normalize = false + #channelmix.mix-lfe = false + #audio.channels = 2 + #audio.format = "S16LE" + #audio.rate = 44100 + #audio.position = "FL,FR" + #api.alsa.period-size = 1024 + #api.alsa.headroom = 0 + #api.alsa.disable-mmap = false + #api.alsa.disable-batch = false + }; + }; + } + ]; + }; + }; + + bluezMonitorConfig = mkOption { + type = types.attrs; + description = '' + Configuration for the bluez5 monitor. + ''; + default = { + # bluez-monitor config file + properties = { + # msbc is not expected to work on all headset + adapter combinations. + #bluez5.msbc-support = true + #bluez5.sbc-xq-support = true + + # Enabled headset roles (default: [ hsp_hs hfp_ag ]), this + # property only applies to native backend. Currently some headsets + # (Sony WH-1000XM3) are not working with both hsp_ag and hfp_ag + # enabled, disable either hsp_ag or hfp_ag to work around it. + # + # Supported headset roles: hsp_hs (HSP Headset), + # hsp_ag (HSP Audio Gateway), + # hfp_ag (HFP Audio Gateway) + #bluez5.headset-roles = [ hsp_hs hsp_ag hfp_ag ] + + # Enabled A2DP codecs (default: all) + #bluez5.codecs = [ sbc aac ldac aptx aptx_hd ] + }; + + rules = [ + # an array of matches/actions to evaluate + { + # rules for matching a device or node. It is an array of + # properties that all need to match the regexp. If any of the + # matches work, the actions are executed for the object. + matches = [ + { + # this matches all cards + device.name = "~bluez_card.*"; + } + ]; + actions = { + # actions can update properties on the matched object. + update-props = { + #device.nick = "My Device" + }; + }; + } + { + matches = [ + { + # matches all sinks + node.name = "~bluez_input.*"; + } + { + # matches all sources + node.name = "~bluez_output.*"; + } + ]; + actions = { + update-props = { + #node.nick = "My Node" + #node.nick = null + #priority.driver = 100 + #priority.session = 100 + #node.pause-on-idle = false + #resample.quality = 4 + #channelmix.normalize = false + #channelmix.mix-lfe = false + }; + }; + } + ]; + }; + }; + + v4l2MonitorConfig = mkOption { + type = types.attrs; + description = '' + Configuration for the V4L2 monitor. + ''; + default = { + # v4l2-monitor config file + properties = { + }; + + rules = [ + # an array of matches/actions to evaluate + { + # rules for matching a device or node. It is an array of + # properties that all need to match the regexp. If any of the + # matches work, the actions are executed for the object. + matches = [ + { + # this matches all devices + device.name = "~v4l2_device.*"; + } + ]; + actions = { + # actions can update properties on the matched object. + update-props = { + #device.nick = "My Device" + }; + }; + } + { + matches = [ + { + # matches all sinks + node.name = "~v4l2_input.*"; + } + { + # matches all sources + node.name = "~v4l2_output.*"; + } + ]; + actions = { + update-props = { + #node.nick = "My Node" + #node.nick = null + #priority.driver = 100 + #priority.session = 100 + #node.pause-on-idle = true + }; + }; + } + ]; + }; + }; + }; + }; + + ###### implementation + config = mkIf cfg.enable { + environment.systemPackages = [ cfg.package ]; + services.pipewire.sessionManagerExecutable = "${cfg.package}/bin/pipewire-media-session"; + + environment.etc."pipewire/media-session.d/media-session.conf" = { text = toSPAJSON cfg.config; }; + environment.etc."pipewire/media-session.d/v4l2-monitor.conf" = { text = toSPAJSON cfg.v4l2MonitorConfig; }; + + environment.etc."pipewire/media-session.d/with-alsa" = mkIf config.services.pipewire.alsa.enable { text = ""; }; + environment.etc."pipewire/media-session.d/alsa-monitor.conf" = mkIf config.services.pipewire.alsa.enable { text = toSPAJSON cfg.alsaMonitorConfig; }; + + environment.etc."pipewire/media-session.d/with-pulseaudio" = mkIf config.services.pipewire.pulse.enable { text = ""; }; + environment.etc."pipewire/media-session.d/bluez-monitor.conf" = mkIf config.services.pipewire.pulse.enable { text = toSPAJSON cfg.bluezMonitorConfig; }; + + environment.etc."pipewire/media-session.d/with-jack" = mkIf config.services.pipewire.jack.enable { text = ""; }; + }; +} diff --git a/nixos/modules/services/desktops/pipewire/pipewire.nix b/nixos/modules/services/desktops/pipewire/pipewire.nix new file mode 100644 index 00000000000..3deaff38bc8 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/pipewire.nix @@ -0,0 +1,265 @@ +# pipewire service. +{ config, lib, pkgs, ... }: + +with lib; + +let + cfg = config.services.pipewire; + enable32BitAlsaPlugins = cfg.alsa.support32Bit + && pkgs.stdenv.isx86_64 + && pkgs.pkgsi686Linux.pipewire != null; + + # The package doesn't output to $out/lib/pipewire directly so that the + # overlays can use the outputs to replace the originals in FHS environments. + # + # This doesn't work in general because of missing development information. + jack-libs = pkgs.runCommand "jack-libs" {} '' + mkdir -p "$out/lib" + ln -s "${cfg.package.jack}/lib" "$out/lib/pipewire" + ''; + + # Helpers for generating the pipewire JSON config file + mkSPAValueString = v: + if builtins.isList v then "[${lib.concatMapStringsSep " " mkSPAValueString v}]" + else if lib.types.attrs.check v then + "{${lib.concatStringsSep " " (mkSPAKeyValue v)}}" + else lib.generators.mkValueStringDefault { } v; + + mkSPAKeyValue = attrs: map (def: def.content) ( + lib.sortProperties + ( + lib.mapAttrsToList + (k: v: lib.mkOrder (v._priority or 1000) "${lib.escape [ "=" ] k} = ${mkSPAValueString (v._content or v)}") + attrs + ) + ); + + toSPAJSON = attrs: lib.concatStringsSep "\n" (mkSPAKeyValue attrs); +in { + + meta = { + maintainers = teams.freedesktop.members; + }; + + ###### interface + options = { + services.pipewire = { + enable = mkEnableOption "pipewire service"; + + package = mkOption { + type = types.package; + default = pkgs.pipewire; + defaultText = "pkgs.pipewire"; + example = literalExample "pkgs.pipewire"; + description = '' + The pipewire derivation to use. + ''; + }; + + socketActivation = mkOption { + default = true; + type = types.bool; + description = '' + Automatically run pipewire when connections are made to the pipewire socket. + ''; + }; + + config = mkOption { + type = types.attrs; + description = '' + Configuration for the pipewire daemon. + ''; + default = { + properties = { + ## set-prop is used to configure properties in the system + # + # "library.name.system" = "support/libspa-support"; + # "context.data-loop.library.name.system" = "support/libspa-support"; + "link.max-buffers" = 64; # version < 3 clients can't handle more than 16 + "mem.allow-mlock" = true; + "mem.mlock-all" = true; + # https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/pipewire/pipewire.h#L93 + "log.level" = 3; # 5 is trace, which is verbose as hell, default is 2 which is warnings, 4 is debug output, 3 is info + + ## Properties for the DSP configuration + # + "default.clock.rate" = 48000; # 48000 is probably saner, 96000 has gaps in audio + "default.clock.quantum" = 128; # equivalent to buffer size which is correlated to latency + "default.clock.min-quantum" = 32; # No audio through bluetooth if 512 isn't allowed, 16 is the absolute minimum + "default.clock.max-quantum" = 1024; # qemu seems to use 16384 but 8192 is the absolute maximum + # "default.video.width" = 640; + # "default.video.height" = 480; + # "default.video.rate.num" = 25; + # "default.video.rate.denom" = 1; + }; + + spa-libs = { + ## add-spa-lib + # + # used to find spa factory names. It maps an spa factory name + # regular expression to a library name that should contain + # that factory. + # + "audio.convert*" = "audioconvert/libspa-audioconvert"; + "api.alsa.*" = "alsa/libspa-alsa"; + "api.v4l2.*" = "v4l2/libspa-v4l2"; + "api.libcamera.*" = "libcamera/libspa-libcamera"; + "api.bluez5.*" = "bluez5/libspa-bluez5"; + "api.vulkan.*" = "vulkan/libspa-vulkan"; + "api.jack.*" = "jack/libspa-jack"; + "support.*" = "support/libspa-support"; + # "videotestsrc" = "videotestsrc/libspa-videotestsrc"; + # "audiotestsrc" = "audiotestsrc/libspa-audiotestsrc"; + }; + + modules = { + ## = { [args = "= ..."] + # [flags = ifexists] } + # [flags = [ifexists]|[nofail]} + # + # Loads a module with the given parameters. + # If ifexists is given, the module is ignoed when it is not found. + # If nofail is given, module initialization failures are ignored. + # + libpipewire-module-rtkit = { + args = { + rt.prio = 20; + rt.time.soft = 200000; + rt.time.hard = 200000; + nice.level = -11; + }; + flags = "ifexists|nofail"; + }; + libpipewire-module-protocol-native = { _priority = -100; _content = "null"; }; + libpipewire-module-profiler = "null"; + libpipewire-module-metadata = "null"; + libpipewire-module-spa-device-factory = "null"; + libpipewire-module-spa-node-factory = "null"; + libpipewire-module-client-node = "null"; + libpipewire-module-client-device = "null"; + libpipewire-module-portal = "null"; + libpipewire-module-access = { + args.access = { + allowed = ["${builtins.unsafeDiscardStringContext cfg.sessionManagerExecutable}"]; + rejected = []; + restricted = []; + force = "flatpak"; + }; + }; + libpipewire-module-adapter = "null"; + libpipewire-module-link-factory = "null"; + libpipewire-module-session-manager = "null"; + }; + + objects = { + ## create-object [-nofail] [= ...] + # + # Creates an object from a PipeWire factory with the given parameters. + # If -nofail is given, errors are ignored (and no object is created) + # + }; + + + exec = { + ## exec + # + # Execute the given program. This is usually used to start the + # session manager. run the session manager with -h for options + # + "${builtins.unsafeDiscardStringContext cfg.sessionManagerExecutable}" = { args = "\"${lib.concatStringsSep " " cfg.sessionManagerArguments}\""; }; + }; + }; + }; + + sessionManagerExecutable = mkOption { + type = types.str; + default = ""; + example = literalExample ''${pkgs.pipewire.mediaSession}/bin/pipewire-media-session''; + description = '' + Path to the session manager executable. + ''; + }; + + sessionManagerArguments = mkOption { + type = types.listOf types.str; + default = []; + example = literalExample ''["-p" "bluez5.msbc-support=true"]''; + description = '' + Arguments passed to the pipewire session manager. + ''; + }; + + alsa = { + enable = mkEnableOption "ALSA support"; + support32Bit = mkEnableOption "32-bit ALSA support on 64-bit systems"; + }; + + jack = { + enable = mkEnableOption "JACK audio emulation"; + }; + + pulse = { + enable = mkEnableOption "PulseAudio server emulation"; + }; + }; + }; + + + ###### implementation + config = mkIf cfg.enable { + assertions = [ + { + assertion = cfg.pulse.enable -> !config.hardware.pulseaudio.enable; + message = "PipeWire based PulseAudio server emulation replaces PulseAudio. This option requires `hardware.pulseaudio.enable` to be set to false"; + } + { + assertion = cfg.jack.enable -> !config.services.jack.jackd.enable; + message = "PipeWire based JACK emulation doesn't use the JACK service. This option requires `services.jack.jackd.enable` to be set to false"; + } + ]; + + environment.systemPackages = [ cfg.package ] + ++ lib.optional cfg.jack.enable jack-libs; + + systemd.packages = [ cfg.package ] + ++ lib.optional cfg.pulse.enable cfg.package.pulse; + + # PipeWire depends on DBUS but doesn't list it. Without this booting + # into a terminal results in the service crashing with an error. + systemd.user.sockets.pipewire.wantedBy = lib.mkIf cfg.socketActivation [ "sockets.target" ]; + systemd.user.sockets.pipewire-pulse.wantedBy = lib.mkIf (cfg.socketActivation && cfg.pulse.enable) ["sockets.target"]; + systemd.user.services.pipewire.bindsTo = [ "dbus.service" ]; + services.udev.packages = [ cfg.package ]; + + # If any paths are updated here they must also be updated in the package test. + environment.etc."alsa/conf.d/49-pipewire-modules.conf" = mkIf cfg.alsa.enable { + text = '' + pcm_type.pipewire { + libs.native = ${cfg.package.lib}/lib/alsa-lib/libasound_module_pcm_pipewire.so ; + ${optionalString enable32BitAlsaPlugins + "libs.32Bit = ${pkgs.pkgsi686Linux.pipewire.lib}/lib/alsa-lib/libasound_module_pcm_pipewire.so ;"} + } + ctl_type.pipewire { + libs.native = ${cfg.package.lib}/lib/alsa-lib/libasound_module_ctl_pipewire.so ; + ${optionalString enable32BitAlsaPlugins + "libs.32Bit = ${pkgs.pkgsi686Linux.pipewire.lib}/lib/alsa-lib/libasound_module_ctl_pipewire.so ;"} + } + ''; + }; + environment.etc."alsa/conf.d/50-pipewire.conf" = mkIf cfg.alsa.enable { + source = "${cfg.package}/share/alsa/alsa.conf.d/50-pipewire.conf"; + }; + environment.etc."alsa/conf.d/99-pipewire-default.conf" = mkIf cfg.alsa.enable { + source = "${cfg.package}/share/alsa/alsa.conf.d/99-pipewire-default.conf"; + }; + + environment.sessionVariables.LD_LIBRARY_PATH = + lib.optional cfg.jack.enable "/run/current-system/sw/lib/pipewire"; + + # https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/464#note_723554 + systemd.user.services.pipewire.environment = { + "PIPEWIRE_LINK_PASSIVE" = "1"; + "PIPEWIRE_CONFIG_FILE" = pkgs.writeText "pipewire.conf" (toSPAJSON cfg.config); + }; + }; +} -- cgit 1.4.1 From b9b9fff6d6658d89810b48983bc0dda1a993190e Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Wed, 10 Feb 2021 19:32:58 +0200 Subject: pipewire: use strictly upstream defaults --- .../desktops/pipewire/pipewire-media-session.nix | 84 +++++++++++----------- .../services/desktops/pipewire/pipewire.nix | 34 ++++----- pkgs/development/libraries/pipewire/default.nix | 2 +- 3 files changed, 60 insertions(+), 60 deletions(-) (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix index b91bdcd6700..4043d7dcfc4 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix @@ -56,8 +56,8 @@ in { properties = { # Properties to configure the session and some # modules - #mem.mlock-all = false - #context.profile.modules = default,rtkit + #mem.mlock-all = false; + #context.profile.modules = "default,rtkit"; }; spa-libs = { @@ -141,14 +141,14 @@ in { # actions can update properties on the matched object. update-props = { api.alsa.use-acp = true; - #api.alsa.use-ucm = true - #api.alsa.soft-mixer = false - #api.alsa.ignore-dB = false - #device.profile-set = "profileset-name" - #device.profile = "default profile name" + #api.alsa.use-ucm = true; + #api.alsa.soft-mixer = false; + #api.alsa.ignore-dB = false; + #device.profile-set = "profileset-name"; + #device.profile = "default profile name"; api.acp.auto-profile = false; api.acp.auto-port = false; - #device.nick = "My Device" + #device.nick = "My Device"; }; }; } @@ -165,22 +165,22 @@ in { ]; actions = { update-props = { - #node.nick = "My Node" - #node.nick = null - #priority.driver = 100 - #priority.session = 100 - #node.pause-on-idle = false - #resample.quality = 4 - #channelmix.normalize = false - #channelmix.mix-lfe = false - #audio.channels = 2 - #audio.format = "S16LE" - #audio.rate = 44100 - #audio.position = "FL,FR" - #api.alsa.period-size = 1024 - #api.alsa.headroom = 0 - #api.alsa.disable-mmap = false - #api.alsa.disable-batch = false + #node.nick = "My Node"; + #node.nick = null; + #priority.driver = 100; + #priority.session = 100; + #node.pause-on-idle = false; + #resample.quality = 4; + #channelmix.normalize = false; + #channelmix.mix-lfe = false; + #audio.channels = 2; + #audio.format = "S16LE"; + #audio.rate = 44100; + #audio.position = "FL,FR"; + #api.alsa.period-size = 1024; + #api.alsa.headroom = 0; + #api.alsa.disable-mmap = false; + #api.alsa.disable-batch = false; }; }; } @@ -197,8 +197,8 @@ in { # bluez-monitor config file properties = { # msbc is not expected to work on all headset + adapter combinations. - #bluez5.msbc-support = true - #bluez5.sbc-xq-support = true + #bluez5.msbc-support = true; + #bluez5.sbc-xq-support = true; # Enabled headset roles (default: [ hsp_hs hfp_ag ]), this # property only applies to native backend. Currently some headsets @@ -208,10 +208,10 @@ in { # Supported headset roles: hsp_hs (HSP Headset), # hsp_ag (HSP Audio Gateway), # hfp_ag (HFP Audio Gateway) - #bluez5.headset-roles = [ hsp_hs hsp_ag hfp_ag ] + #bluez5.headset-roles = [ "hsp_hs" "hsp_ag" "hfp_ag" ]; # Enabled A2DP codecs (default: all) - #bluez5.codecs = [ sbc aac ldac aptx aptx_hd ] + #bluez5.codecs = [ "sbc" "aac" "ldac" "aptx" "aptx_hd" ]; }; rules = [ @@ -229,7 +229,7 @@ in { actions = { # actions can update properties on the matched object. update-props = { - #device.nick = "My Device" + #device.nick = "My Device"; }; }; } @@ -247,13 +247,13 @@ in { actions = { update-props = { #node.nick = "My Node" - #node.nick = null - #priority.driver = 100 - #priority.session = 100 - #node.pause-on-idle = false - #resample.quality = 4 - #channelmix.normalize = false - #channelmix.mix-lfe = false + #node.nick = null; + #priority.driver = 100; + #priority.session = 100; + #node.pause-on-idle = false; + #resample.quality = 4; + #channelmix.normalize = false; + #channelmix.mix-lfe = false; }; }; } @@ -286,7 +286,7 @@ in { actions = { # actions can update properties on the matched object. update-props = { - #device.nick = "My Device" + #device.nick = "My Device"; }; }; } @@ -303,11 +303,11 @@ in { ]; actions = { update-props = { - #node.nick = "My Node" - #node.nick = null - #priority.driver = 100 - #priority.session = 100 - #node.pause-on-idle = true + #node.nick = "My Node"; + #node.nick = null; + #priority.driver = 100; + #priority.session = 100; + #node.pause-on-idle = true; }; }; } diff --git a/nixos/modules/services/desktops/pipewire/pipewire.nix b/nixos/modules/services/desktops/pipewire/pipewire.nix index 3deaff38bc8..044120de7c7 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire.nix @@ -75,22 +75,22 @@ in { # # "library.name.system" = "support/libspa-support"; # "context.data-loop.library.name.system" = "support/libspa-support"; - "link.max-buffers" = 64; # version < 3 clients can't handle more than 16 - "mem.allow-mlock" = true; - "mem.mlock-all" = true; - # https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/pipewire/pipewire.h#L93 - "log.level" = 3; # 5 is trace, which is verbose as hell, default is 2 which is warnings, 4 is debug output, 3 is info + "link.max-buffers" = 16; # version < 3 clients can't handle more than 16 + #"mem.allow-mlock" = false; + #"mem.mlock-all" = true; + ## https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/pipewire/pipewire.h#L93 + #"log.level" = 2; # 5 is trace, which is verbose as hell, default is 2 which is warnings, 4 is debug output, 3 is info ## Properties for the DSP configuration # - "default.clock.rate" = 48000; # 48000 is probably saner, 96000 has gaps in audio - "default.clock.quantum" = 128; # equivalent to buffer size which is correlated to latency - "default.clock.min-quantum" = 32; # No audio through bluetooth if 512 isn't allowed, 16 is the absolute minimum - "default.clock.max-quantum" = 1024; # qemu seems to use 16384 but 8192 is the absolute maximum - # "default.video.width" = 640; - # "default.video.height" = 480; - # "default.video.rate.num" = 25; - # "default.video.rate.denom" = 1; + #"default.clock.rate" = 48000; + #"default.clock.quantum" = 1024; + #"default.clock.min-quantum" = 32; + #"default.clock.max-quantum" = 8192; + #"default.video.width" = 640; + #"default.video.height" = 480; + #"default.video.rate.num" = 25; + #"default.video.rate.denom" = 1; }; spa-libs = { @@ -123,10 +123,10 @@ in { # libpipewire-module-rtkit = { args = { - rt.prio = 20; - rt.time.soft = 200000; - rt.time.hard = 200000; - nice.level = -11; + #rt.prio = 20; + #rt.time.soft = 200000; + #rt.time.hard = 200000; + #nice.level = -11; }; flags = "ifexists|nofail"; }; diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index 9a89d7e06cd..fc566d91e91 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -128,7 +128,7 @@ let moveToOutput "bin/pipewire-media-session" "$mediaSession" ''; - passthru = { + passthru.tests = { installedTests = nixosTests.installed-tests.pipewire; # This ensures that all the paths used by the NixOS module are found. -- cgit 1.4.1 From 3d69688289324d0b7167454fa42b240f543c6c93 Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Fri, 12 Feb 2021 15:27:44 +0200 Subject: pipewire: rename pwms to media-session --- .../services/desktops/pipewire/pipewire-media-session.nix | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix index 4043d7dcfc4..168cf13a88c 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix @@ -4,7 +4,7 @@ with lib; let - cfg = config.services.pipewire.pwms; + cfg = config.services.pipewire.media-session; enable32BitAlsaPlugins = cfg.alsa.support32Bit && pkgs.stdenv.isx86_64 && pkgs.pkgsi686Linux.pipewire != null; @@ -34,8 +34,12 @@ in { ###### interface options = { - services.pipewire.pwms = { - enable = mkEnableOption "Example pipewire session manager"; + services.pipewire.media-session = { + enable = mkOption { + type = types.bool; + default = true; + description = "Example pipewire session manager"; + }; package = mkOption { type = types.package; -- cgit 1.4.1 From f3918b4bc39b95915c2dac471f16b11a2b891e28 Mon Sep 17 00:00:00 2001 From: Jörg Thalheim Date: Sat, 20 Feb 2021 13:14:54 +0100 Subject: nixos/pipewire: only enable media-session if pipewire is enabled --- nixos/modules/services/desktops/pipewire/pipewire-media-session.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix index 168cf13a88c..81f4762e1e6 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix @@ -37,7 +37,8 @@ in { services.pipewire.media-session = { enable = mkOption { type = types.bool; - default = true; + default = config.services.pipewire.enable; + defaultText = "config.services.pipewire.enable"; description = "Example pipewire session manager"; }; -- cgit 1.4.1 From 78bfbdd77aa9e42302ed71072cf0b3110f350f46 Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Thu, 25 Feb 2021 16:22:40 +0200 Subject: pipewire: 0.3.21 -> 0.3.22 --- .../desktops/pipewire/alsa-monitor.conf.json | 48 ++++ .../desktops/pipewire/bluez-monitor.conf.json | 38 +++ .../services/desktops/pipewire/client-rt.conf.json | 22 ++ .../services/desktops/pipewire/client.conf.json | 15 + .../services/desktops/pipewire/jack.conf.json | 19 ++ .../desktops/pipewire/media-session.conf.json | 53 ++++ .../desktops/pipewire/pipewire-media-session.nix | 319 ++++----------------- .../desktops/pipewire/pipewire-pulse.conf.json | 27 ++ .../services/desktops/pipewire/pipewire.conf.json | 54 ++++ .../services/desktops/pipewire/pipewire.nix | 188 ++++++------ .../desktops/pipewire/v4l2-monitor.conf.json | 38 +++ pkgs/development/libraries/pipewire/default.nix | 112 +++++++- .../patches-0.3.22/0005-fix-some-warnings.patch | 23 ++ pkgs/development/libraries/pipewire/test-paths.nix | 1 + 14 files changed, 581 insertions(+), 376 deletions(-) create mode 100644 nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json create mode 100644 nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json create mode 100644 nixos/modules/services/desktops/pipewire/client-rt.conf.json create mode 100644 nixos/modules/services/desktops/pipewire/client.conf.json create mode 100644 nixos/modules/services/desktops/pipewire/jack.conf.json create mode 100644 nixos/modules/services/desktops/pipewire/media-session.conf.json create mode 100644 nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json create mode 100644 nixos/modules/services/desktops/pipewire/pipewire.conf.json create mode 100644 nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json create mode 100644 pkgs/development/libraries/pipewire/patches-0.3.22/0005-fix-some-warnings.patch (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json b/nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json new file mode 100644 index 00000000000..5e8e1de6986 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json @@ -0,0 +1,48 @@ +{ + "properties": {}, + "rules": [ + { + "actions": { + "update-props": { + "api": { + "acp": { + "auto-port": false, + "auto-profile": false + }, + "alsa": { + "use-acp": true + } + } + } + }, + "matches": [ + { + "device": { + "name": "~alsa_card.*" + } + } + ] + }, + { + "actions": { + "update-props": { + "node": { + "pause-on-idle": false + } + } + }, + "matches": [ + { + "node": { + "name": "~alsa_input.*" + } + }, + { + "node": { + "name": "~alsa_output.*" + } + } + ] + } + ] +} diff --git a/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json b/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json new file mode 100644 index 00000000000..d8f74f32943 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json @@ -0,0 +1,38 @@ +{ + "properties": {}, + "rules": [ + { + "actions": { + "update-props": {} + }, + "matches": [ + { + "device": { + "name": "~bluez_card.*" + } + } + ] + }, + { + "actions": { + "update-props": { + "node": { + "pause-on-idle": false + } + } + }, + "matches": [ + { + "node": { + "name": "~bluez_input.*" + } + }, + { + "node": { + "name": "~bluez_output.*" + } + } + ] + } + ] +} diff --git a/nixos/modules/services/desktops/pipewire/client-rt.conf.json b/nixos/modules/services/desktops/pipewire/client-rt.conf.json new file mode 100644 index 00000000000..701b1916599 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/client-rt.conf.json @@ -0,0 +1,22 @@ +{ + "context.properties": {}, + "context.spa-libs": { + "audio.convert.*": "audioconvert/libspa-audioconvert", + "support.*": "support/libspa-support" + }, + "context.modules": { + "libpipewire-module-rtkit": { + "args": {}, + "flags": [ + "ifexists", + "nofail" + ] + }, + "libpipewire-module-protocol-native": null, + "libpipewire-module-client-node": null, + "libpipewire-module-client-device": null, + "libpipewire-module-adapter": null, + "libpipewire-module-metadata": null, + "libpipewire-module-session-manager": null + } +} diff --git a/nixos/modules/services/desktops/pipewire/client.conf.json b/nixos/modules/services/desktops/pipewire/client.conf.json new file mode 100644 index 00000000000..24c10309329 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/client.conf.json @@ -0,0 +1,15 @@ +{ + "context.properties": {}, + "context.spa-libs": { + "audio.convert.*": "audioconvert/libspa-audioconvert", + "support.*": "support/libspa-support" + }, + "context.modules": { + "libpipewire-module-protocol-native": null, + "libpipewire-module-client-node": null, + "libpipewire-module-client-device": null, + "libpipewire-module-adapter": null, + "libpipewire-module-metadata": null, + "libpipewire-module-session-manager": null + } +} diff --git a/nixos/modules/services/desktops/pipewire/jack.conf.json b/nixos/modules/services/desktops/pipewire/jack.conf.json new file mode 100644 index 00000000000..0219269f615 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/jack.conf.json @@ -0,0 +1,19 @@ +{ + "context.properties": {}, + "context.spa-libs": { + "support.*": "support/libspa-support" + }, + "context.modules": { + "libpipewire-module-rtkit": { + "args": {}, + "flags": [ + "ifexists", + "nofail" + ] + }, + "libpipewire-module-protocol-native": null, + "libpipewire-module-client-node": null, + "libpipewire-module-metadata": null + }, + "jack.properties": {} +} diff --git a/nixos/modules/services/desktops/pipewire/media-session.conf.json b/nixos/modules/services/desktops/pipewire/media-session.conf.json new file mode 100644 index 00000000000..a8fc2d93fb0 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/media-session.conf.json @@ -0,0 +1,53 @@ +{ + "context.modules": { + "libpipewire-module-protocol-native": null, + "libpipewire-module-adapter": null, + "libpipewire-module-client-device": null, + "libpipewire-module-client-node": null, + "libpipewire-module-metadata": null, + "libpipewire-module-rtkit": { + "args": {}, + "flags": [ + "ifexists", + "nofail" + ] + }, + "libpipewire-module-session-manager": null + }, + "context.properties": {}, + "context.spa-libs": { + "api.alsa.*": "alsa/libspa-alsa", + "api.bluez5.*": "bluez5/libspa-bluez5", + "api.libcamera.*": "libcamera/libspa-libcamera", + "api.v4l2.*": "v4l2/libspa-v4l2" + }, + "session.modules": { + "default": [ + "flatpak", + "portal", + "v4l2", + "suspend-node", + "policy-node" + ], + "with-alsa": [ + "with-audio" + ], + "with-audio": [ + "metadata", + "default-nodes", + "default-profile", + "default-routes", + "alsa-seq", + "alsa-monitor" + ], + "with-jack": [ + "with-audio" + ], + "with-pulseaudio": [ + "with-audio", + "bluez5", + "restore-stream", + "streams-follow-default" + ] + } +} diff --git a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix index 81f4762e1e6..b324bfa1b74 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix @@ -9,18 +9,36 @@ let && pkgs.stdenv.isx86_64 && pkgs.pkgsi686Linux.pipewire != null; + prioritizeNativeProtocol = { + "context.modules" = { + "libpipewire-module-protocol-native" = { + _priority = -100; + _content = null; + }; + }; + }; + + # Use upstream config files passed through spa-json-dump as the base + # Patched here as necessary for them to work with this module + defaults = { + alsa-monitor = (builtins.fromJSON (builtins.readFile ./alsa-monitor.conf.json)); + bluez-monitor = (builtins.fromJSON (builtins.readFile ./bluez-monitor.conf.json)); + media-session = recursiveUpdate (builtins.fromJSON (builtins.readFile ./media-session.conf.json)) prioritizeNativeProtocol; + v4l2-monitor = (builtins.fromJSON (builtins.readFile ./v4l2-monitor.conf.json)); + }; # Helpers for generating the pipewire JSON config file mkSPAValueString = v: if builtins.isList v then "[${lib.concatMapStringsSep " " mkSPAValueString v}]" else if lib.types.attrs.check v then "{${lib.concatStringsSep " " (mkSPAKeyValue v)}}" + else if builtins.isString v then "\"${lib.generators.mkValueStringDefault { } v}\"" else lib.generators.mkValueStringDefault { } v; mkSPAKeyValue = attrs: map (def: def.content) ( lib.sortProperties ( lib.mapAttrsToList - (k: v: lib.mkOrder (v._priority or 1000) "${lib.escape [ "=" ] k} = ${mkSPAValueString (v._content or v)}") + (k: v: lib.mkOrder (v._priority or 1000) "${lib.escape [ "=" ":" ] k} = ${mkSPAValueString (v._content or v)}") attrs ) ); @@ -51,272 +69,41 @@ in { ''; }; - config = mkOption { - type = types.attrs; - description = '' - Configuration for the media session core. - ''; - default = { - # media-session config file - properties = { - # Properties to configure the session and some - # modules - #mem.mlock-all = false; - #context.profile.modules = "default,rtkit"; - }; - - spa-libs = { - # Mapping from factory name to library. - "api.bluez5.*" = "bluez5/libspa-bluez5"; - "api.alsa.*" = "alsa/libspa-alsa"; - "api.v4l2.*" = "v4l2/libspa-v4l2"; - "api.libcamera.*" = "libcamera/libspa-libcamera"; - }; - - modules = { - # These are the modules that are enabled when a file with - # the key name is found in the media-session.d config directory. - # the default bundle is always enabled. - - default = [ - "flatpak" # manages flatpak access - "portal" # manage portal permissions - "v4l2" # video for linux udev detection - #"libcamera" # libcamera udev detection - "suspend-node" # suspend inactive nodes - "policy-node" # configure and link nodes - #"metadata" # export metadata API - #"default-nodes" # restore default nodes - #"default-profile" # restore default profiles - #"default-routes" # restore default route - #"streams-follow-default" # move streams when default changes - #"alsa-seq" # alsa seq midi support - #"alsa-monitor" # alsa udev detection - #"bluez5" # bluetooth support - #"restore-stream" # restore stream settings - ]; - "with-audio" = [ - "metadata" - "default-nodes" - "default-profile" - "default-routes" - "alsa-seq" - "alsa-monitor" - ]; - "with-alsa" = [ - "with-audio" - ]; - "with-jack" = [ - "with-audio" - ]; - "with-pulseaudio" = [ - "with-audio" - "bluez5" - "restore-stream" - "streams-follow-default" - ]; - }; + config = { + media-session = mkOption { + type = types.attrs; + description = '' + Configuration for the media session core. For details see + https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/media-session.d/media-session.conf + ''; + default = {}; }; - }; - - alsaMonitorConfig = mkOption { - type = types.attrs; - description = '' - Configuration for the alsa monitor. - ''; - default = { - # alsa-monitor config file - properties = { - #alsa.jack-device = true - }; - rules = [ - # an array of matches/actions to evaluate - { - # rules for matching a device or node. It is an array of - # properties that all need to match the regexp. If any of the - # matches work, the actions are executed for the object. - matches = [ - { - # this matches all cards - device.name = "~alsa_card.*"; - } - ]; - actions = { - # actions can update properties on the matched object. - update-props = { - api.alsa.use-acp = true; - #api.alsa.use-ucm = true; - #api.alsa.soft-mixer = false; - #api.alsa.ignore-dB = false; - #device.profile-set = "profileset-name"; - #device.profile = "default profile name"; - api.acp.auto-profile = false; - api.acp.auto-port = false; - #device.nick = "My Device"; - }; - }; - } - { - matches = [ - { - # matches all sinks - node.name = "~alsa_input.*"; - } - { - # matches all sources - node.name = "~alsa_output.*"; - } - ]; - actions = { - update-props = { - #node.nick = "My Node"; - #node.nick = null; - #priority.driver = 100; - #priority.session = 100; - #node.pause-on-idle = false; - #resample.quality = 4; - #channelmix.normalize = false; - #channelmix.mix-lfe = false; - #audio.channels = 2; - #audio.format = "S16LE"; - #audio.rate = 44100; - #audio.position = "FL,FR"; - #api.alsa.period-size = 1024; - #api.alsa.headroom = 0; - #api.alsa.disable-mmap = false; - #api.alsa.disable-batch = false; - }; - }; - } - ]; + alsa-monitor = mkOption { + type = types.attrs; + description = '' + Configuration for the alsa monitor. For details see + https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/media-session.d/alsa-monitor.conf + ''; + default = {}; }; - }; - - bluezMonitorConfig = mkOption { - type = types.attrs; - description = '' - Configuration for the bluez5 monitor. - ''; - default = { - # bluez-monitor config file - properties = { - # msbc is not expected to work on all headset + adapter combinations. - #bluez5.msbc-support = true; - #bluez5.sbc-xq-support = true; - # Enabled headset roles (default: [ hsp_hs hfp_ag ]), this - # property only applies to native backend. Currently some headsets - # (Sony WH-1000XM3) are not working with both hsp_ag and hfp_ag - # enabled, disable either hsp_ag or hfp_ag to work around it. - # - # Supported headset roles: hsp_hs (HSP Headset), - # hsp_ag (HSP Audio Gateway), - # hfp_ag (HFP Audio Gateway) - #bluez5.headset-roles = [ "hsp_hs" "hsp_ag" "hfp_ag" ]; - - # Enabled A2DP codecs (default: all) - #bluez5.codecs = [ "sbc" "aac" "ldac" "aptx" "aptx_hd" ]; - }; - - rules = [ - # an array of matches/actions to evaluate - { - # rules for matching a device or node. It is an array of - # properties that all need to match the regexp. If any of the - # matches work, the actions are executed for the object. - matches = [ - { - # this matches all cards - device.name = "~bluez_card.*"; - } - ]; - actions = { - # actions can update properties on the matched object. - update-props = { - #device.nick = "My Device"; - }; - }; - } - { - matches = [ - { - # matches all sinks - node.name = "~bluez_input.*"; - } - { - # matches all sources - node.name = "~bluez_output.*"; - } - ]; - actions = { - update-props = { - #node.nick = "My Node" - #node.nick = null; - #priority.driver = 100; - #priority.session = 100; - #node.pause-on-idle = false; - #resample.quality = 4; - #channelmix.normalize = false; - #channelmix.mix-lfe = false; - }; - }; - } - ]; + bluez-monitor = mkOption { + type = types.attrs; + description = '' + Configuration for the bluez5 monitor. For details see + https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/media-session.d/bluez-monitor.conf + ''; + default = {}; }; - }; - - v4l2MonitorConfig = mkOption { - type = types.attrs; - description = '' - Configuration for the V4L2 monitor. - ''; - default = { - # v4l2-monitor config file - properties = { - }; - rules = [ - # an array of matches/actions to evaluate - { - # rules for matching a device or node. It is an array of - # properties that all need to match the regexp. If any of the - # matches work, the actions are executed for the object. - matches = [ - { - # this matches all devices - device.name = "~v4l2_device.*"; - } - ]; - actions = { - # actions can update properties on the matched object. - update-props = { - #device.nick = "My Device"; - }; - }; - } - { - matches = [ - { - # matches all sinks - node.name = "~v4l2_input.*"; - } - { - # matches all sources - node.name = "~v4l2_output.*"; - } - ]; - actions = { - update-props = { - #node.nick = "My Node"; - #node.nick = null; - #priority.driver = 100; - #priority.session = 100; - #node.pause-on-idle = true; - }; - }; - } - ]; + v4l2-monitor = mkOption { + type = types.attrs; + description = '' + Configuration for the V4L2 monitor. For details see + https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/media-session.d/v4l2-monitor.conf + ''; + default = {}; }; }; }; @@ -325,16 +112,16 @@ in { ###### implementation config = mkIf cfg.enable { environment.systemPackages = [ cfg.package ]; - services.pipewire.sessionManagerExecutable = "${cfg.package}/bin/pipewire-media-session"; + services.pipewire.sessionManagerExecutable = builtins.unsafeDiscardStringContext "${cfg.package}/bin/pipewire-media-session"; - environment.etc."pipewire/media-session.d/media-session.conf" = { text = toSPAJSON cfg.config; }; - environment.etc."pipewire/media-session.d/v4l2-monitor.conf" = { text = toSPAJSON cfg.v4l2MonitorConfig; }; + environment.etc."pipewire/media-session.d/media-session.conf" = { text = toSPAJSON (recursiveUpdate defaults.media-session cfg.config.media-session); }; + environment.etc."pipewire/media-session.d/v4l2-monitor.conf" = { text = toSPAJSON (recursiveUpdate defaults.v4l2-monitor cfg.config.v4l2-monitor); }; environment.etc."pipewire/media-session.d/with-alsa" = mkIf config.services.pipewire.alsa.enable { text = ""; }; - environment.etc."pipewire/media-session.d/alsa-monitor.conf" = mkIf config.services.pipewire.alsa.enable { text = toSPAJSON cfg.alsaMonitorConfig; }; + environment.etc."pipewire/media-session.d/alsa-monitor.conf" = mkIf config.services.pipewire.alsa.enable { text = toSPAJSON (recursiveUpdate defaults.alsa-monitor cfg.config.alsa-monitor); }; environment.etc."pipewire/media-session.d/with-pulseaudio" = mkIf config.services.pipewire.pulse.enable { text = ""; }; - environment.etc."pipewire/media-session.d/bluez-monitor.conf" = mkIf config.services.pipewire.pulse.enable { text = toSPAJSON cfg.bluezMonitorConfig; }; + environment.etc."pipewire/media-session.d/bluez-monitor.conf" = mkIf config.services.pipewire.pulse.enable { text = toSPAJSON (recursiveUpdate defaults.bluez-monitor cfg.config.bluez-monitor); }; environment.etc."pipewire/media-session.d/with-jack" = mkIf config.services.pipewire.jack.enable { text = ""; }; }; diff --git a/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json b/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json new file mode 100644 index 00000000000..5fe6ec2b064 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json @@ -0,0 +1,27 @@ +{ + "context.properties": {}, + "context.spa-libs": { + "audio.convert.*": "audioconvert/libspa-audioconvert", + "support.*": "support/libspa-support" + }, + "context.modules": { + "libpipewire-module-rtkit": { + "args": {}, + "flags": [ + "ifexists", + "nofail" + ] + }, + "libpipewire-module-protocol-native": null, + "libpipewire-module-client-node": null, + "libpipewire-module-adapter": null, + "libpipewire-module-metadata": null, + "libpipewire-module-protocol-pulse": { + "args": { + "server.address": [ + "unix:native" + ] + } + } + } +} diff --git a/nixos/modules/services/desktops/pipewire/pipewire.conf.json b/nixos/modules/services/desktops/pipewire/pipewire.conf.json new file mode 100644 index 00000000000..b8e23e04c8a --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/pipewire.conf.json @@ -0,0 +1,54 @@ +{ + "context.properties": { + "link.max-buffers": 16, + "core.daemon": true, + "core.name": "pipewire-0" + }, + "context.spa-libs": { + "audio.convert.*": "audioconvert/libspa-audioconvert", + "api.alsa.*": "alsa/libspa-alsa", + "api.v4l2.*": "v4l2/libspa-v4l2", + "api.libcamera.*": "libcamera/libspa-libcamera", + "api.bluez5.*": "bluez5/libspa-bluez5", + "api.vulkan.*": "vulkan/libspa-vulkan", + "api.jack.*": "jack/libspa-jack", + "support.*": "support/libspa-support" + }, + "context.modules": { + "libpipewire-module-rtkit": { + "args": {}, + "flags": [ + "ifexists", + "nofail" + ] + }, + "libpipewire-module-protocol-native": null, + "libpipewire-module-profiler": null, + "libpipewire-module-metadata": null, + "libpipewire-module-spa-device-factory": null, + "libpipewire-module-spa-node-factory": null, + "libpipewire-module-client-node": null, + "libpipewire-module-client-device": null, + "libpipewire-module-portal": null, + "libpipewire-module-access": { + "args": {} + }, + "libpipewire-module-adapter": null, + "libpipewire-module-link-factory": null, + "libpipewire-module-session-manager": null + }, + "context.objects": { + "spa-node-factory": { + "args": { + "factory.name": "support.node.driver", + "node.name": "Dummy-Driver", + "priority.driver": 8000 + } + } + }, + "context.exec": { + "/nix/store/1q65a09arb7r4sdfz657p473kn3lqknk-pipewire-0.3.22/bin/pipewire-media-session": { + "args": "" + } + } +} diff --git a/nixos/modules/services/desktops/pipewire/pipewire.nix b/nixos/modules/services/desktops/pipewire/pipewire.nix index 044120de7c7..77aa7043ee4 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire.nix @@ -18,11 +18,40 @@ let ln -s "${cfg.package.jack}/lib" "$out/lib/pipewire" ''; + prioritizeNativeProtocol = { + "context.modules" = { + "libpipewire-module-protocol-native" = { + _priority = -100; + _content = null; + }; + }; + }; + + sessionManagerInvocation = { + "context.exec" = { + "${cfg.sessionManagerExecutable}" = { + args = "${lib.concatStringsSep " " cfg.sessionManagerArguments}"; + }; + }; + }; + + # Use upstream config files passed through spa-json-dump as the base + # Patched here as necessary for them to work with this module + defaults = { + client = recursiveUpdate (builtins.fromJSON (builtins.readFile ./client.conf.json)) prioritizeNativeProtocol; + client-rt = recursiveUpdate (builtins.fromJSON (builtins.readFile ./client-rt.conf.json)) prioritizeNativeProtocol; + jack = recursiveUpdate (builtins.fromJSON (builtins.readFile ./jack.conf.json)) prioritizeNativeProtocol; + # Remove session manager invocation from the upstream generated file, it points to the wrong path + pipewire = recursiveUpdate ((removeAttrs (builtins.fromJSON (builtins.readFile ./pipewire.conf.json)) ["context.exec"]) // sessionManagerInvocation) prioritizeNativeProtocol; + pipewire-pulse = recursiveUpdate (builtins.fromJSON (builtins.readFile ./pipewire-pulse.conf.json)) prioritizeNativeProtocol; + }; + # Helpers for generating the pipewire JSON config file mkSPAValueString = v: if builtins.isList v then "[${lib.concatMapStringsSep " " mkSPAValueString v}]" else if lib.types.attrs.check v then "{${lib.concatStringsSep " " (mkSPAKeyValue v)}}" + else if builtins.isString v then "\"${lib.generators.mkValueStringDefault { } v}\"" else lib.generators.mkValueStringDefault { } v; mkSPAKeyValue = attrs: map (def: def.content) ( @@ -64,110 +93,50 @@ in { ''; }; - config = mkOption { - type = types.attrs; - description = '' - Configuration for the pipewire daemon. - ''; - default = { - properties = { - ## set-prop is used to configure properties in the system - # - # "library.name.system" = "support/libspa-support"; - # "context.data-loop.library.name.system" = "support/libspa-support"; - "link.max-buffers" = 16; # version < 3 clients can't handle more than 16 - #"mem.allow-mlock" = false; - #"mem.mlock-all" = true; - ## https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/master/src/pipewire/pipewire.h#L93 - #"log.level" = 2; # 5 is trace, which is verbose as hell, default is 2 which is warnings, 4 is debug output, 3 is info - - ## Properties for the DSP configuration - # - #"default.clock.rate" = 48000; - #"default.clock.quantum" = 1024; - #"default.clock.min-quantum" = 32; - #"default.clock.max-quantum" = 8192; - #"default.video.width" = 640; - #"default.video.height" = 480; - #"default.video.rate.num" = 25; - #"default.video.rate.denom" = 1; - }; - - spa-libs = { - ## add-spa-lib - # - # used to find spa factory names. It maps an spa factory name - # regular expression to a library name that should contain - # that factory. - # - "audio.convert*" = "audioconvert/libspa-audioconvert"; - "api.alsa.*" = "alsa/libspa-alsa"; - "api.v4l2.*" = "v4l2/libspa-v4l2"; - "api.libcamera.*" = "libcamera/libspa-libcamera"; - "api.bluez5.*" = "bluez5/libspa-bluez5"; - "api.vulkan.*" = "vulkan/libspa-vulkan"; - "api.jack.*" = "jack/libspa-jack"; - "support.*" = "support/libspa-support"; - # "videotestsrc" = "videotestsrc/libspa-videotestsrc"; - # "audiotestsrc" = "audiotestsrc/libspa-audiotestsrc"; - }; - - modules = { - ## = { [args = "= ..."] - # [flags = ifexists] } - # [flags = [ifexists]|[nofail]} - # - # Loads a module with the given parameters. - # If ifexists is given, the module is ignoed when it is not found. - # If nofail is given, module initialization failures are ignored. - # - libpipewire-module-rtkit = { - args = { - #rt.prio = 20; - #rt.time.soft = 200000; - #rt.time.hard = 200000; - #nice.level = -11; - }; - flags = "ifexists|nofail"; - }; - libpipewire-module-protocol-native = { _priority = -100; _content = "null"; }; - libpipewire-module-profiler = "null"; - libpipewire-module-metadata = "null"; - libpipewire-module-spa-device-factory = "null"; - libpipewire-module-spa-node-factory = "null"; - libpipewire-module-client-node = "null"; - libpipewire-module-client-device = "null"; - libpipewire-module-portal = "null"; - libpipewire-module-access = { - args.access = { - allowed = ["${builtins.unsafeDiscardStringContext cfg.sessionManagerExecutable}"]; - rejected = []; - restricted = []; - force = "flatpak"; - }; - }; - libpipewire-module-adapter = "null"; - libpipewire-module-link-factory = "null"; - libpipewire-module-session-manager = "null"; - }; - - objects = { - ## create-object [-nofail] [= ...] - # - # Creates an object from a PipeWire factory with the given parameters. - # If -nofail is given, errors are ignored (and no object is created) - # - }; - - - exec = { - ## exec - # - # Execute the given program. This is usually used to start the - # session manager. run the session manager with -h for options - # - "${builtins.unsafeDiscardStringContext cfg.sessionManagerExecutable}" = { args = "\"${lib.concatStringsSep " " cfg.sessionManagerArguments}\""; }; - }; + config = { + client = mkOption { + type = types.attrs; + default = {}; + description = '' + Configuration for pipewire clients. For details see + https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/client.conf.in + ''; + }; + + client-rt = mkOption { + type = types.attrs; + default = {}; + description = '' + Configuration for realtime pipewire clients. For details see + https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/client-rt.conf.in + ''; + }; + + jack = mkOption { + type = types.attrs; + default = {}; + description = '' + Configuration for the pipewire daemon's jack module. For details see + https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/jack.conf.in + ''; + }; + + pipewire = mkOption { + type = types.attrs; + default = {}; + description = '' + Configuration for the pipewire daemon. For details see + https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/pipewire.conf.in + ''; + }; + + pipewire-pulse = mkOption { + type = types.attrs; + default = {}; + description = '' + Configuration for the pipewire-pulse daemon. For details see + https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/pipewire-pulse.conf.in + ''; }; }; @@ -253,13 +222,16 @@ in { source = "${cfg.package}/share/alsa/alsa.conf.d/99-pipewire-default.conf"; }; + environment.etc."pipewire/client.conf" = { text = toSPAJSON (recursiveUpdate defaults.client cfg.config.client); }; + environment.etc."pipewire/client-rt.conf" = { text = toSPAJSON (recursiveUpdate defaults.client-rt cfg.config.client-rt); }; + environment.etc."pipewire/jack.conf" = { text = toSPAJSON (recursiveUpdate defaults.jack cfg.config.jack); }; + environment.etc."pipewire/pipewire.conf" = { text = toSPAJSON (recursiveUpdate defaults.pipewire cfg.config.pipewire); }; + environment.etc."pipewire/pipewire-pulse.conf" = { text = toSPAJSON (recursiveUpdate defaults.pipewire-pulse cfg.config.pipewire-pulse); }; + environment.sessionVariables.LD_LIBRARY_PATH = lib.optional cfg.jack.enable "/run/current-system/sw/lib/pipewire"; # https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/464#note_723554 - systemd.user.services.pipewire.environment = { - "PIPEWIRE_LINK_PASSIVE" = "1"; - "PIPEWIRE_CONFIG_FILE" = pkgs.writeText "pipewire.conf" (toSPAJSON cfg.config); - }; + systemd.user.services.pipewire.environment."PIPEWIRE_LINK_PASSIVE" = "1"; }; } diff --git a/nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json b/nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json new file mode 100644 index 00000000000..ca404fabbfc --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json @@ -0,0 +1,38 @@ +{ + "properties": {}, + "rules": [ + { + "actions": { + "update-props": {} + }, + "matches": [ + { + "device": { + "name": "~v4l2_device.*" + } + } + ] + }, + { + "actions": { + "update-props": { + "node": { + "pause-on-idle": false + } + } + }, + "matches": [ + { + "node": { + "name": "~v4l2_input.*" + } + }, + { + "node": { + "name": "~v4l2_output.*" + } + } + ] + } + ] +} diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index fc566d91e91..8dd94f4ba13 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -17,6 +17,7 @@ , udev , libva , libsndfile +, SDL2 , vulkan-headers , vulkan-loader , ncurses @@ -42,7 +43,7 @@ let self = stdenv.mkDerivation rec { pname = "pipewire"; - version = "0.3.21"; + version = "0.3.22"; outputs = [ "out" @@ -60,7 +61,7 @@ let owner = "pipewire"; repo = "pipewire"; rev = version; - hash = "sha256:2YJzPTMPIoQQeNja3F53SD4gtpdSlbD/i77hBWiQfuQ="; + hash = "sha256:6SEOUivyehccVR5zt79Qw2rjN2KcO5x3TEejXVxRlvs="; }; patches = [ @@ -72,6 +73,94 @@ let ./pipewire-pulse-path.patch # Add flag to specify configuration directory (different from the installation directory). ./pipewire-config-dir.patch + + # Various quality of life improvements that didn't make it into 0.3.22 + (fetchpatch { + name = "0001-bluez5-include-a2dp-codec-profiles-in-route-profiles.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/df1dbee687c819095a6fddce3b24943f9ac47dbc.patch"; + sha256 = "sha256-MesteaIcfKMr53TdObEfqRyKEgalB1GEWpsTexawPgg="; + }) + (fetchpatch { + name = "0001-pulse-server-don-t-use-the-pending_sample-after-free.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/72acd752f68a35c40641262be1c69014170d0734.patch"; + sha256 = "sha256-F3+aVfOYH4SLTwWhdIKuNUo85NBoS+67vkUrcsaldSs="; + }) + ./patches-0.3.22/0005-fix-some-warnings.patch + (fetchpatch { + name = "0006-spa-escape-double-quotes.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/6a219092818a7a7e357441256d8070ae77ac2d3a.patch"; + sha256 = "sha256-NUjxOSthe3Jw2LUrO11QnTWTx0PQNBJkQSv3ux58jZw="; + }) + (fetchpatch { + name = "0009-bluez5-volumes-need-to-be-distributed-to-all-channel.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/8c5ca000ef7fddd9be9cd2211d880736e97b956d.patch"; + sha256 = "sha256-9NhbYSXlNOYmoPg8tj561QHisaD216fBG7ccNIfoZ64="; + }) + (fetchpatch { + name = "0010-bluez5-set-the-right-volumes-on-the-node.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/930b411075a5c1b0d9ddcfe7dd2dbfdc27baab90.patch"; + sha256 = "sha256-xsL92H8wSrBzoxLtraCVxPZdXWTwj+j+O2XlfhcJ7IQ="; + }) + (fetchpatch { + name = "0011-bluez5-backend-native-Check-volume-values.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/7a5a94470453e0cbd3a087b1be2aa8960ff43c07.patch"; + sha256 = "sha256-HKWcfkwMmmlEB7l+SETJDsUZ2eLggcodtbNOpqY/wWY="; + }) + (fetchpatch { + name = "0012-media-session-don-t-switch-to-pro-audio-by-default.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/84fc63e60168e2c2f43875423899b4ae3bd89a7b.patch"; + sha256 = "sha256-tZwgBMZS+HJd0lrRji3aevbP/yJfvWYK60KMpfiFrOY="; + }) + (fetchpatch { + name = "0013-audioconvert-keep-better-track-of-param-changes.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/44919c83fc51aa5e1a22c903e841897c1b4d274c.patch"; + sha256 = "sha256-DIZUfEjUCaK4yY3k7/KLHv1igTKz6Ek4QbWECs1sr9E="; + }) + (fetchpatch { + name = "0018-pulse-server-print-encoding-name-in-format_info.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/4b591df145afa316e8e047764f9b98fc10cbacd9.patch"; + sha256 = "sha256-Dr6w6tI4R+6wrl0rVk9Eifw3YleuisVmXzsv+H2jtXc="; + }) + (fetchpatch { + name = "0019-pulse-server-handle-unsupported-formats.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/fcf00b3d352d931446a384a768b999520662b599.patch"; + sha256 = "sha256-kQ3vRoojLVTOJi8V4eODkZC8agsla2PjKf6sJnm/1C4="; + }) + (fetchpatch { + name = "0021-jack-handle-client-init-error-with-EIO.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/715a3a642a4f1c1f624e0a9dc0394b1819b69f93.patch"; + sha256 = "sha256-DglHcH9pHSWuVxZuLt8J+gDmxOaQSoiThVE2wePfH1I="; + }) + (fetchpatch { + name = "0022-pw-cli-always-output-to-stdout.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/91875c1fd8ece6b1b94130c50304b715654f8681.patch"; + sha256 = "sha256-3Sf/Tr39bdBihq/CFborm7GcBWtSvqO3KtRtFBcHcmc="; + }) + (fetchpatch { + name = "0024-policy-node-don-t-crash-without-metadata.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/3673265ae20d7b59e89cad6c5238c232796731b2.patch"; + sha256 = "sha256-YRdh1gqBYqa+sbSfHuJZ+Xc6w4QTOOpt/fppFNxsj+8="; + }) + (fetchpatch { + name = "0025-bluez5-route-shouldn-t-list-a2dp-profiles-when-not-c.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/a5dc2493dfccfc168cef01162f38f90e986b8af4.patch"; + sha256 = "sha256-zu7zqHIMOcxLAhvelKNWDB+804x+ocCo5FAMUSSOnVo="; + }) + (fetchpatch { + name = "0027-jack-apply-PIPEWIRE_PROPS-after-reading-config.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/149319819aa5d4e39770c35a0c00f6c2963e2bf3.patch"; + sha256 = "sha256-SwKQJkg8NIL9D0GAL6hnEgi8kvuToo1bpDm52adtKxA="; + }) + (fetchpatch { + name = "0038-jack-add-config-option-to-shorten-and-filter-names.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/d54da879bf5f9fa9009e1ab27e8d52eae3141764.patch"; + sha256 = "sha256-iYOmZTWNODHYWpYGfRTQhBLV1HeFOUvHN3Ta0f1ZS8M="; + }) + (fetchpatch { + name = "0046-jack-fix-names-of-our-ports.patch"; + url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/e340a44a357e4550e169bc8825c6aa8b4ceb76db.patch"; + sha256 = "sha256-rfv2IzgYyNB1s51eRFhJzZCyso6PIEj2qg9fpPpOZ5Q="; + }) ]; nativeBuildInputs = [ @@ -93,6 +182,7 @@ let vulkan-headers vulkan-loader valgrind + SDL2 systemd ] ++ lib.optionals gstreamerSupport [ gst_all_1.gst-plugins-base gst_all_1.gstreamer ] ++ lib.optional ffmpegSupport ffmpeg @@ -122,10 +212,17 @@ let doCheck = true; postInstall = '' + mkdir -p $out/nix-support/etc/pipewire/media-session. + for f in etc/pipewire/*.conf; do $out/bin/spa-json-dump "$f" > "$out/nix-support/$f.json"; done + moveToOutput "share/systemd/user/pipewire-pulse.*" "$pulse" moveToOutput "lib/systemd/user/pipewire-pulse.*" "$pulse" moveToOutput "bin/pipewire-pulse" "$pulse" + + mkdir -p $mediaSession/nix-support/etc/pipewire/media-session.d + for f in etc/pipewire/media-session.d/*.conf; do $out/bin/spa-json-dump "$f" > "$mediaSession/nix-support/$f.json"; done moveToOutput "bin/pipewire-media-session" "$mediaSession" + moveToOutput "etc/pipewire/media-session.d/*.conf" "$mediaSession" ''; passthru.tests = { @@ -135,6 +232,17 @@ let test-paths = callPackage ./test-paths.nix { paths-out = [ "share/alsa/alsa.conf.d/50-pipewire.conf" + "nix-support/etc/pipewire/client.conf.json" + "nix-support/etc/pipewire/client-rt.conf.json" + "nix-support/etc/pipewire/jack.conf.json" + "nix-support/etc/pipewire/pipewire.conf.json" + "nix-support/etc/pipewire/pipewire-pulse.conf.json" + ]; + paths-out-media-session = [ + "nix-support/etc/pipewire/media-session.d/alsa-monitor.conf.json" + "nix-support/etc/pipewire/media-session.d/bluez-monitor.conf.json" + "nix-support/etc/pipewire/media-session.d/media-session.conf.json" + "nix-support/etc/pipewire/media-session.d/v4l2-monitor.conf.json" ]; paths-lib = [ "lib/alsa-lib/libasound_module_pcm_pipewire.so" diff --git a/pkgs/development/libraries/pipewire/patches-0.3.22/0005-fix-some-warnings.patch b/pkgs/development/libraries/pipewire/patches-0.3.22/0005-fix-some-warnings.patch new file mode 100644 index 00000000000..56987bf4d1d --- /dev/null +++ b/pkgs/development/libraries/pipewire/patches-0.3.22/0005-fix-some-warnings.patch @@ -0,0 +1,23 @@ +From 63a3811aa76802e9585e04cf12bf8de617442105 Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Thu, 18 Feb 2021 12:42:06 +0100 +Subject: [PATCH 05/30] fix some warnings + +--- + spa/plugins/bluez5/backend-native.c | 2 +- + src/examples/media-session/default-routes.c | 18 +++++++++++++----- + 2 files changed, 14 insertions(+), 6 deletions(-) + +diff --git a/spa/plugins/bluez5/backend-native.c b/spa/plugins/bluez5/backend-native.c +index 4df714088..b4d4e5edf 100644 +--- a/spa/plugins/bluez5/backend-native.c ++++ b/spa/plugins/bluez5/backend-native.c +@@ -437,7 +437,7 @@ static bool rfcomm_hfp_hf(struct spa_source *source, char* buf) + struct rfcomm *rfcomm = source->data; + struct spa_bt_backend *backend = rfcomm->backend; + unsigned int features; +- unsigned int gain; ++ unsigned int SPA_UNUSED gain; + unsigned int selected_codec; + char* token; + char separators[] = "\r\n:"; diff --git a/pkgs/development/libraries/pipewire/test-paths.nix b/pkgs/development/libraries/pipewire/test-paths.nix index 0ae69374194..11d00e7c2ca 100644 --- a/pkgs/development/libraries/pipewire/test-paths.nix +++ b/pkgs/development/libraries/pipewire/test-paths.nix @@ -14,6 +14,7 @@ let in runCommand "pipewire-test-paths" { } '' touch $out + ${check-output pipewire.mediaSession paths-out-media-session} ${check-output pipewire.lib paths-lib} ${check-output pipewire paths-out} -- cgit 1.4.1 From b012ecaae7a273a9b09adbf608f7bf44374b8869 Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Fri, 5 Mar 2021 00:41:02 +0200 Subject: pipewire: 0.3.22 -> 0.3.23 --- .../desktops/pipewire/alsa-monitor.conf.json | 46 +++----- .../desktops/pipewire/bluez-monitor.conf.json | 34 +++--- .../services/desktops/pipewire/client-rt.conf.json | 8 +- .../services/desktops/pipewire/client.conf.json | 8 +- .../services/desktops/pipewire/jack.conf.json | 4 +- .../desktops/pipewire/media-session.conf.json | 30 ++--- .../desktops/pipewire/pipewire-media-session.nix | 3 +- .../desktops/pipewire/pipewire-pulse.conf.json | 3 +- .../services/desktops/pipewire/pipewire.conf.json | 13 ++- .../services/desktops/pipewire/pipewire.nix | 41 +++---- .../desktops/pipewire/v4l2-monitor.conf.json | 34 +++--- .../pipewire/0040-alsa-profiles-use-libdir.patch | 13 +++ .../pipewire/0050-pipewire-pulse-path.patch | 27 +++++ .../0055-pipewire-media-session-path.patch | 27 +++++ .../pipewire/0070-installed-tests-path.patch | 29 +++++ .../pipewire/0080-pipewire-config-dir.patch | 30 +++++ .../pipewire/alsa-profiles-use-libdir.patch | 13 --- pkgs/development/libraries/pipewire/default.nix | 125 ++++----------------- .../libraries/pipewire/installed-tests-path.patch | 29 ----- .../patches-0.3.22/0005-fix-some-warnings.patch | 23 ---- .../libraries/pipewire/pipewire-config-dir.patch | 30 ----- .../libraries/pipewire/pipewire-pulse-path.patch | 27 ----- 22 files changed, 250 insertions(+), 347 deletions(-) create mode 100644 pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch create mode 100644 pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch create mode 100644 pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch create mode 100644 pkgs/development/libraries/pipewire/0070-installed-tests-path.patch create mode 100644 pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch delete mode 100644 pkgs/development/libraries/pipewire/alsa-profiles-use-libdir.patch delete mode 100644 pkgs/development/libraries/pipewire/installed-tests-path.patch delete mode 100644 pkgs/development/libraries/pipewire/patches-0.3.22/0005-fix-some-warnings.patch delete mode 100644 pkgs/development/libraries/pipewire/pipewire-config-dir.patch delete mode 100644 pkgs/development/libraries/pipewire/pipewire-pulse-path.patch (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json b/nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json index 5e8e1de6986..53fc9cc9634 100644 --- a/nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json +++ b/nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json @@ -2,47 +2,33 @@ "properties": {}, "rules": [ { - "actions": { - "update-props": { - "api": { - "acp": { - "auto-port": false, - "auto-profile": false - }, - "alsa": { - "use-acp": true - } - } - } - }, "matches": [ { - "device": { - "name": "~alsa_card.*" - } + "device.name": "~alsa_card.*" } - ] - }, - { + ], "actions": { "update-props": { - "node": { - "pause-on-idle": false - } + "api.alsa.use-acp": true, + "api.acp.auto-profile": false, + "api.acp.auto-port": false } - }, + } + }, + { "matches": [ { - "node": { - "name": "~alsa_input.*" - } + "node.name": "~alsa_input.*" }, { - "node": { - "name": "~alsa_output.*" - } + "node.name": "~alsa_output.*" + } + ], + "actions": { + "update-props": { + "node.pause-on-idle": false } - ] + } } ] } diff --git a/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json b/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json index d8f74f32943..4d50cb9f1ad 100644 --- a/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json +++ b/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json @@ -2,37 +2,29 @@ "properties": {}, "rules": [ { - "actions": { - "update-props": {} - }, "matches": [ { - "device": { - "name": "~bluez_card.*" - } + "device.name": "~bluez_card.*" } - ] + ], + "actions": { + "update-props": {} + } }, { - "actions": { - "update-props": { - "node": { - "pause-on-idle": false - } - } - }, "matches": [ { - "node": { - "name": "~bluez_input.*" - } + "node.name": "~bluez_input.*" }, { - "node": { - "name": "~bluez_output.*" - } + "node.name": "~bluez_output.*" + } + ], + "actions": { + "update-props": { + "node.pause-on-idle": false } - ] + } } ] } diff --git a/nixos/modules/services/desktops/pipewire/client-rt.conf.json b/nixos/modules/services/desktops/pipewire/client-rt.conf.json index 701b1916599..d294927b4f6 100644 --- a/nixos/modules/services/desktops/pipewire/client-rt.conf.json +++ b/nixos/modules/services/desktops/pipewire/client-rt.conf.json @@ -1,5 +1,7 @@ { - "context.properties": {}, + "context.properties": { + "log.level": 0 + }, "context.spa-libs": { "audio.convert.*": "audioconvert/libspa-audioconvert", "support.*": "support/libspa-support" @@ -18,5 +20,7 @@ "libpipewire-module-adapter": null, "libpipewire-module-metadata": null, "libpipewire-module-session-manager": null - } + }, + "filter.properties": {}, + "stream.properties": {} } diff --git a/nixos/modules/services/desktops/pipewire/client.conf.json b/nixos/modules/services/desktops/pipewire/client.conf.json index 24c10309329..224938abbbc 100644 --- a/nixos/modules/services/desktops/pipewire/client.conf.json +++ b/nixos/modules/services/desktops/pipewire/client.conf.json @@ -1,5 +1,7 @@ { - "context.properties": {}, + "context.properties": { + "log.level": 0 + }, "context.spa-libs": { "audio.convert.*": "audioconvert/libspa-audioconvert", "support.*": "support/libspa-support" @@ -11,5 +13,7 @@ "libpipewire-module-adapter": null, "libpipewire-module-metadata": null, "libpipewire-module-session-manager": null - } + }, + "filter.properties": {}, + "stream.properties": {} } diff --git a/nixos/modules/services/desktops/pipewire/jack.conf.json b/nixos/modules/services/desktops/pipewire/jack.conf.json index 0219269f615..2de04036b31 100644 --- a/nixos/modules/services/desktops/pipewire/jack.conf.json +++ b/nixos/modules/services/desktops/pipewire/jack.conf.json @@ -1,5 +1,7 @@ { - "context.properties": {}, + "context.properties": { + "log.level": 0 + }, "context.spa-libs": { "support.*": "support/libspa-support" }, diff --git a/nixos/modules/services/desktops/pipewire/media-session.conf.json b/nixos/modules/services/desktops/pipewire/media-session.conf.json index a8fc2d93fb0..4b2505ff816 100644 --- a/nixos/modules/services/desktops/pipewire/media-session.conf.json +++ b/nixos/modules/services/desktops/pipewire/media-session.conf.json @@ -1,10 +1,12 @@ { + "context.properties": {}, + "context.spa-libs": { + "api.bluez5.*": "bluez5/libspa-bluez5", + "api.alsa.*": "alsa/libspa-alsa", + "api.v4l2.*": "v4l2/libspa-v4l2", + "api.libcamera.*": "libcamera/libspa-libcamera" + }, "context.modules": { - "libpipewire-module-protocol-native": null, - "libpipewire-module-adapter": null, - "libpipewire-module-client-device": null, - "libpipewire-module-client-node": null, - "libpipewire-module-metadata": null, "libpipewire-module-rtkit": { "args": {}, "flags": [ @@ -12,15 +14,13 @@ "nofail" ] }, + "libpipewire-module-protocol-native": null, + "libpipewire-module-client-node": null, + "libpipewire-module-client-device": null, + "libpipewire-module-adapter": null, + "libpipewire-module-metadata": null, "libpipewire-module-session-manager": null }, - "context.properties": {}, - "context.spa-libs": { - "api.alsa.*": "alsa/libspa-alsa", - "api.bluez5.*": "bluez5/libspa-bluez5", - "api.libcamera.*": "libcamera/libspa-libcamera", - "api.v4l2.*": "v4l2/libspa-v4l2" - }, "session.modules": { "default": [ "flatpak", @@ -29,9 +29,6 @@ "suspend-node", "policy-node" ], - "with-alsa": [ - "with-audio" - ], "with-audio": [ "metadata", "default-nodes", @@ -40,6 +37,9 @@ "alsa-seq", "alsa-monitor" ], + "with-alsa": [ + "with-audio" + ], "with-jack": [ "with-audio" ], diff --git a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix index b324bfa1b74..b41ea349fb8 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix @@ -112,7 +112,8 @@ in { ###### implementation config = mkIf cfg.enable { environment.systemPackages = [ cfg.package ]; - services.pipewire.sessionManagerExecutable = builtins.unsafeDiscardStringContext "${cfg.package}/bin/pipewire-media-session"; + systemd.packages = [ cfg.package ]; + systemd.user.services.pipewire-media-session.wantedBy = [ "pipewire.service" ]; environment.etc."pipewire/media-session.d/media-session.conf" = { text = toSPAJSON (recursiveUpdate defaults.media-session cfg.config.media-session); }; environment.etc."pipewire/media-session.d/v4l2-monitor.conf" = { text = toSPAJSON (recursiveUpdate defaults.v4l2-monitor cfg.config.v4l2-monitor); }; diff --git a/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json b/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json index 5fe6ec2b064..da08bcea2c9 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json +++ b/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json @@ -23,5 +23,6 @@ ] } } - } + }, + "stream.properties": {} } diff --git a/nixos/modules/services/desktops/pipewire/pipewire.conf.json b/nixos/modules/services/desktops/pipewire/pipewire.conf.json index b8e23e04c8a..59e2afca093 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.conf.json +++ b/nixos/modules/services/desktops/pipewire/pipewire.conf.json @@ -29,7 +29,12 @@ "libpipewire-module-spa-node-factory": null, "libpipewire-module-client-node": null, "libpipewire-module-client-device": null, - "libpipewire-module-portal": null, + "libpipewire-module-portal": { + "flags": [ + "ifexists", + "nofail" + ] + }, "libpipewire-module-access": { "args": {} }, @@ -46,9 +51,5 @@ } } }, - "context.exec": { - "/nix/store/1q65a09arb7r4sdfz657p473kn3lqknk-pipewire-0.3.22/bin/pipewire-media-session": { - "args": "" - } - } + "context.exec": {} } diff --git a/nixos/modules/services/desktops/pipewire/pipewire.nix b/nixos/modules/services/desktops/pipewire/pipewire.nix index 77aa7043ee4..2577e77c4a1 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire.nix @@ -20,6 +20,7 @@ let prioritizeNativeProtocol = { "context.modules" = { + # Most other modules depend on this, so put it first "libpipewire-module-protocol-native" = { _priority = -100; _content = null; @@ -27,10 +28,22 @@ let }; }; - sessionManagerInvocation = { - "context.exec" = { - "${cfg.sessionManagerExecutable}" = { - args = "${lib.concatStringsSep " " cfg.sessionManagerArguments}"; + fixDaemonModulePriorities = { + "context.modules" = { + # Most other modules depend on thism so put it first + "libpipewire-module-protocol-native" = { + _priority = -100; + _content = null; + }; + # Needs to be before libpipewire-module-access + "libpipewire-module-portal" = { + _priority = -50; + _content = { + flags = [ + "ifexists" + "nofail" + ]; + }; }; }; }; @@ -42,7 +55,7 @@ let client-rt = recursiveUpdate (builtins.fromJSON (builtins.readFile ./client-rt.conf.json)) prioritizeNativeProtocol; jack = recursiveUpdate (builtins.fromJSON (builtins.readFile ./jack.conf.json)) prioritizeNativeProtocol; # Remove session manager invocation from the upstream generated file, it points to the wrong path - pipewire = recursiveUpdate ((removeAttrs (builtins.fromJSON (builtins.readFile ./pipewire.conf.json)) ["context.exec"]) // sessionManagerInvocation) prioritizeNativeProtocol; + pipewire = recursiveUpdate (builtins.fromJSON (builtins.readFile ./pipewire.conf.json)) fixDaemonModulePriorities; pipewire-pulse = recursiveUpdate (builtins.fromJSON (builtins.readFile ./pipewire-pulse.conf.json)) prioritizeNativeProtocol; }; @@ -140,24 +153,6 @@ in { }; }; - sessionManagerExecutable = mkOption { - type = types.str; - default = ""; - example = literalExample ''${pkgs.pipewire.mediaSession}/bin/pipewire-media-session''; - description = '' - Path to the session manager executable. - ''; - }; - - sessionManagerArguments = mkOption { - type = types.listOf types.str; - default = []; - example = literalExample ''["-p" "bluez5.msbc-support=true"]''; - description = '' - Arguments passed to the pipewire session manager. - ''; - }; - alsa = { enable = mkEnableOption "ALSA support"; support32Bit = mkEnableOption "32-bit ALSA support on 64-bit systems"; diff --git a/nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json b/nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json index ca404fabbfc..b08cba1b604 100644 --- a/nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json +++ b/nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json @@ -2,37 +2,29 @@ "properties": {}, "rules": [ { - "actions": { - "update-props": {} - }, "matches": [ { - "device": { - "name": "~v4l2_device.*" - } + "device.name": "~v4l2_device.*" } - ] + ], + "actions": { + "update-props": {} + } }, { - "actions": { - "update-props": { - "node": { - "pause-on-idle": false - } - } - }, "matches": [ { - "node": { - "name": "~v4l2_input.*" - } + "node.name": "~v4l2_input.*" }, { - "node": { - "name": "~v4l2_output.*" - } + "node.name": "~v4l2_output.*" + } + ], + "actions": { + "update-props": { + "node.pause-on-idle": false } - ] + } } ] } diff --git a/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch b/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch new file mode 100644 index 00000000000..c657d12f7d0 --- /dev/null +++ b/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch @@ -0,0 +1,13 @@ +diff --git a/meson.build b/meson.build +index ffee41b4..f3e4ec74 100644 +--- a/meson.build ++++ b/meson.build +@@ -53,7 +53,7 @@ endif + + spa_plugindir = join_paths(pipewire_libdir, spa_name) + +-alsadatadir = join_paths(pipewire_datadir, 'alsa-card-profile', 'mixer') ++alsadatadir = join_paths(pipewire_libdir, '..', 'share', 'alsa-card-profile', 'mixer') + + pipewire_headers_dir = join_paths(pipewire_name, 'pipewire') + diff --git a/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch b/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch new file mode 100644 index 00000000000..4a6b21dd431 --- /dev/null +++ b/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch @@ -0,0 +1,27 @@ +diff --git a/meson_options.txt b/meson_options.txt +index ce364d93..a6c8af72 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -152,6 +152,9 @@ option('udev', + option('udevrulesdir', + type : 'string', + description : 'Directory for udev rules (defaults to /lib/udev/rules.d)') ++option('pipewire_pulse_prefix', ++ type : 'string', ++ description: 'Install directory for the pipewire-pulse daemon') + option('systemd-user-unit-dir', + type : 'string', + description : 'Directory for user systemd units (defaults to /usr/lib/systemd/user)') +diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build +index 0a5e5042..4a70b0b0 100644 +--- a/src/daemon/systemd/user/meson.build ++++ b/src/daemon/systemd/user/meson.build +@@ -9,7 +9,7 @@ install_data( + + systemd_config = configuration_data() + systemd_config.set('PW_BINARY', join_paths(pipewire_bindir, 'pipewire')) +-systemd_config.set('PW_PULSE_BINARY', join_paths(pipewire_bindir, 'pipewire-pulse')) ++systemd_config.set('PW_PULSE_BINARY', join_paths(get_option('pipewire_pulse_prefix'), 'bin/pipewire-pulse')) + systemd_config.set('PW_MEDIA_SESSION_BINARY', join_paths(pipewire_bindir, 'pipewire-media-session')) + + configure_file(input : 'pipewire.service.in', diff --git a/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch b/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch new file mode 100644 index 00000000000..ce1085f37f7 --- /dev/null +++ b/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch @@ -0,0 +1,27 @@ +diff --git a/meson_options.txt b/meson_options.txt +index a6c8af72..8e5c3d73 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -10,6 +10,9 @@ option('media-session', + description: 'Build and install pipewire-media-session', + type: 'boolean', + value: true) ++option('media-session-prefix', ++ description: 'Install directory for pipewire-media-session and its support files', ++ type: 'string') + option('man', + description: 'Build manpages', + type: 'boolean', +diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build +index 4a70b0b0..84c9a19e 100644 +--- a/src/daemon/systemd/user/meson.build ++++ b/src/daemon/systemd/user/meson.build +@@ -10,7 +10,7 @@ install_data( + systemd_config = configuration_data() + systemd_config.set('PW_BINARY', join_paths(pipewire_bindir, 'pipewire')) + systemd_config.set('PW_PULSE_BINARY', join_paths(get_option('pipewire_pulse_prefix'), 'bin/pipewire-pulse')) +-systemd_config.set('PW_MEDIA_SESSION_BINARY', join_paths(pipewire_bindir, 'pipewire-media-session')) ++systemd_config.set('PW_MEDIA_SESSION_BINARY', join_paths(get_option('media-session-prefix'), 'bin/pipewire-media-session')) + + configure_file(input : 'pipewire.service.in', + output : 'pipewire.service', diff --git a/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch b/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch new file mode 100644 index 00000000000..2a92711626b --- /dev/null +++ b/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch @@ -0,0 +1,29 @@ +diff --git a/meson.build b/meson.build +index ffee41b4..bab6f019 100644 +--- a/meson.build ++++ b/meson.build +@@ -318,8 +318,8 @@ alsa_dep = (get_option('pipewire-alsa') + ? dependency('alsa', version : '>=1.1.7') + : dependency('', required: false)) + +-installed_tests_metadir = join_paths(pipewire_datadir, 'installed-tests', pipewire_name) +-installed_tests_execdir = join_paths(pipewire_libexecdir, 'installed-tests', pipewire_name) ++installed_tests_metadir = join_paths(get_option('installed_test_prefix'), 'share', 'installed-tests', pipewire_name) ++installed_tests_execdir = join_paths(get_option('installed_test_prefix'), 'libexec', 'installed-tests', pipewire_name) + installed_tests_enabled = get_option('installed_tests') + installed_tests_template = files('template.test.in') + +diff --git a/meson_options.txt b/meson_options.txt +index f03033c3..32df6c53 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -18,6 +18,9 @@ option('installed_tests', + description: 'Install manual and automated test executables', + type: 'boolean', + value: false) ++option('installed_test_prefix', ++ description: 'Prefix for installed tests', ++ type: 'string') + option('gstreamer', + description: 'Build GStreamer plugins', + type: 'boolean', diff --git a/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch b/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch new file mode 100644 index 00000000000..ad1ae93684b --- /dev/null +++ b/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch @@ -0,0 +1,30 @@ +diff --git a/meson.build b/meson.build +index 0073eb13..0ffc6863 100644 +--- a/meson.build ++++ b/meson.build +@@ -34,7 +34,10 @@ pipewire_libexecdir = join_paths(prefix, get_option('libexecdir')) + pipewire_localedir = join_paths(prefix, get_option('localedir')) + pipewire_sysconfdir = join_paths(prefix, get_option('sysconfdir')) + +-pipewire_configdir = join_paths(pipewire_sysconfdir, 'pipewire') ++pipewire_configdir = get_option('pipewire_config_dir') ++if pipewire_configdir == '' ++ pipewire_configdir = join_paths(pipewire_sysconfdir, 'pipewire') ++endif + modules_install_dir = join_paths(pipewire_libdir, pipewire_name) + + if host_machine.system() == 'linux' +diff --git a/meson_options.txt b/meson_options.txt +index 4b9e46b8..8c301459 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -56,6 +56,9 @@ option('pipewire-pulseaudio', + option('libpulse-path', + description: 'Where to install the libpulse.so library', + type: 'string') ++option('pipewire_config_dir', ++ type : 'string', ++ description : 'Directory for pipewire configuration (defaults to /etc/pipewire)') + option('spa-plugins', + description: 'Enable spa plugins integration', + type: 'boolean', diff --git a/pkgs/development/libraries/pipewire/alsa-profiles-use-libdir.patch b/pkgs/development/libraries/pipewire/alsa-profiles-use-libdir.patch deleted file mode 100644 index c657d12f7d0..00000000000 --- a/pkgs/development/libraries/pipewire/alsa-profiles-use-libdir.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/meson.build b/meson.build -index ffee41b4..f3e4ec74 100644 ---- a/meson.build -+++ b/meson.build -@@ -53,7 +53,7 @@ endif - - spa_plugindir = join_paths(pipewire_libdir, spa_name) - --alsadatadir = join_paths(pipewire_datadir, 'alsa-card-profile', 'mixer') -+alsadatadir = join_paths(pipewire_libdir, '..', 'share', 'alsa-card-profile', 'mixer') - - pipewire_headers_dir = join_paths(pipewire_name, 'pipewire') - diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index 8dd94f4ba13..5c5578abc8d 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -43,7 +43,7 @@ let self = stdenv.mkDerivation rec { pname = "pipewire"; - version = "0.3.22"; + version = "0.3.23"; outputs = [ "out" @@ -61,106 +61,20 @@ let owner = "pipewire"; repo = "pipewire"; rev = version; - hash = "sha256:6SEOUivyehccVR5zt79Qw2rjN2KcO5x3TEejXVxRlvs="; + hash = "sha256:1HMUrE1NBmrdBRMKX3LRlXaCEH3wqP2jGtW8Rp9oyQA="; }; patches = [ # Break up a dependency cycle between outputs. - ./alsa-profiles-use-libdir.patch - # Move installed tests into their own output. - ./installed-tests-path.patch + ./0040-alsa-profiles-use-libdir.patch # Change the path of the pipewire-pulse binary in the service definition. - ./pipewire-pulse-path.patch + ./0050-pipewire-pulse-path.patch + # Change the path of the pipewire-media-session binary in the service definition. + ./0055-pipewire-media-session-path.patch + # Move installed tests into their own output. + ./0070-installed-tests-path.patch # Add flag to specify configuration directory (different from the installation directory). - ./pipewire-config-dir.patch - - # Various quality of life improvements that didn't make it into 0.3.22 - (fetchpatch { - name = "0001-bluez5-include-a2dp-codec-profiles-in-route-profiles.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/df1dbee687c819095a6fddce3b24943f9ac47dbc.patch"; - sha256 = "sha256-MesteaIcfKMr53TdObEfqRyKEgalB1GEWpsTexawPgg="; - }) - (fetchpatch { - name = "0001-pulse-server-don-t-use-the-pending_sample-after-free.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/72acd752f68a35c40641262be1c69014170d0734.patch"; - sha256 = "sha256-F3+aVfOYH4SLTwWhdIKuNUo85NBoS+67vkUrcsaldSs="; - }) - ./patches-0.3.22/0005-fix-some-warnings.patch - (fetchpatch { - name = "0006-spa-escape-double-quotes.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/6a219092818a7a7e357441256d8070ae77ac2d3a.patch"; - sha256 = "sha256-NUjxOSthe3Jw2LUrO11QnTWTx0PQNBJkQSv3ux58jZw="; - }) - (fetchpatch { - name = "0009-bluez5-volumes-need-to-be-distributed-to-all-channel.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/8c5ca000ef7fddd9be9cd2211d880736e97b956d.patch"; - sha256 = "sha256-9NhbYSXlNOYmoPg8tj561QHisaD216fBG7ccNIfoZ64="; - }) - (fetchpatch { - name = "0010-bluez5-set-the-right-volumes-on-the-node.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/930b411075a5c1b0d9ddcfe7dd2dbfdc27baab90.patch"; - sha256 = "sha256-xsL92H8wSrBzoxLtraCVxPZdXWTwj+j+O2XlfhcJ7IQ="; - }) - (fetchpatch { - name = "0011-bluez5-backend-native-Check-volume-values.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/7a5a94470453e0cbd3a087b1be2aa8960ff43c07.patch"; - sha256 = "sha256-HKWcfkwMmmlEB7l+SETJDsUZ2eLggcodtbNOpqY/wWY="; - }) - (fetchpatch { - name = "0012-media-session-don-t-switch-to-pro-audio-by-default.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/84fc63e60168e2c2f43875423899b4ae3bd89a7b.patch"; - sha256 = "sha256-tZwgBMZS+HJd0lrRji3aevbP/yJfvWYK60KMpfiFrOY="; - }) - (fetchpatch { - name = "0013-audioconvert-keep-better-track-of-param-changes.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/44919c83fc51aa5e1a22c903e841897c1b4d274c.patch"; - sha256 = "sha256-DIZUfEjUCaK4yY3k7/KLHv1igTKz6Ek4QbWECs1sr9E="; - }) - (fetchpatch { - name = "0018-pulse-server-print-encoding-name-in-format_info.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/4b591df145afa316e8e047764f9b98fc10cbacd9.patch"; - sha256 = "sha256-Dr6w6tI4R+6wrl0rVk9Eifw3YleuisVmXzsv+H2jtXc="; - }) - (fetchpatch { - name = "0019-pulse-server-handle-unsupported-formats.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/fcf00b3d352d931446a384a768b999520662b599.patch"; - sha256 = "sha256-kQ3vRoojLVTOJi8V4eODkZC8agsla2PjKf6sJnm/1C4="; - }) - (fetchpatch { - name = "0021-jack-handle-client-init-error-with-EIO.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/715a3a642a4f1c1f624e0a9dc0394b1819b69f93.patch"; - sha256 = "sha256-DglHcH9pHSWuVxZuLt8J+gDmxOaQSoiThVE2wePfH1I="; - }) - (fetchpatch { - name = "0022-pw-cli-always-output-to-stdout.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/91875c1fd8ece6b1b94130c50304b715654f8681.patch"; - sha256 = "sha256-3Sf/Tr39bdBihq/CFborm7GcBWtSvqO3KtRtFBcHcmc="; - }) - (fetchpatch { - name = "0024-policy-node-don-t-crash-without-metadata.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/3673265ae20d7b59e89cad6c5238c232796731b2.patch"; - sha256 = "sha256-YRdh1gqBYqa+sbSfHuJZ+Xc6w4QTOOpt/fppFNxsj+8="; - }) - (fetchpatch { - name = "0025-bluez5-route-shouldn-t-list-a2dp-profiles-when-not-c.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/a5dc2493dfccfc168cef01162f38f90e986b8af4.patch"; - sha256 = "sha256-zu7zqHIMOcxLAhvelKNWDB+804x+ocCo5FAMUSSOnVo="; - }) - (fetchpatch { - name = "0027-jack-apply-PIPEWIRE_PROPS-after-reading-config.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/149319819aa5d4e39770c35a0c00f6c2963e2bf3.patch"; - sha256 = "sha256-SwKQJkg8NIL9D0GAL6hnEgi8kvuToo1bpDm52adtKxA="; - }) - (fetchpatch { - name = "0038-jack-add-config-option-to-shorten-and-filter-names.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/d54da879bf5f9fa9009e1ab27e8d52eae3141764.patch"; - sha256 = "sha256-iYOmZTWNODHYWpYGfRTQhBLV1HeFOUvHN3Ta0f1ZS8M="; - }) - (fetchpatch { - name = "0046-jack-fix-names-of-our-ports.patch"; - url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/e340a44a357e4550e169bc8825c6aa8b4ceb76db.patch"; - sha256 = "sha256-rfv2IzgYyNB1s51eRFhJzZCyso6PIEj2qg9fpPpOZ5Q="; - }) + ./0080-pipewire-config-dir.patch ]; nativeBuildInputs = [ @@ -196,6 +110,7 @@ let "-Dinstalled_tests=true" "-Dinstalled_test_prefix=${placeholder "installedTests"}" "-Dpipewire_pulse_prefix=${placeholder "pulse"}" + "-Dmedia-session-prefix=${placeholder "mediaSession"}" "-Dlibjack-path=${placeholder "jack"}/lib" "-Dgstreamer=${mesonBool gstreamerSupport}" "-Dffmpeg=${mesonBool ffmpegSupport}" @@ -212,17 +127,23 @@ let doCheck = true; postInstall = '' - mkdir -p $out/nix-support/etc/pipewire/media-session. - for f in etc/pipewire/*.conf; do $out/bin/spa-json-dump "$f" > "$out/nix-support/$f.json"; done + pushd . + cd $out + mkdir -p $out/nix-support/etc/pipewire + for f in etc/pipewire/*.conf; do bin/spa-json-dump "$f" > "$out/nix-support/$f.json"; done + + mkdir -p $mediaSession/nix-support/etc/pipewire/media-session.d + for f in etc/pipewire/media-session.d/*.conf; do bin/spa-json-dump "$f" > "$mediaSession/nix-support/$f.json"; done + popd + + moveToOutput "etc/pipewire/media-session.d/*.conf" "$mediaSession" + moveToOutput "share/systemd/user/pipewire-media-session.*" "$mediaSession" + moveToOutput "lib/systemd/user/pipewire-media-session.*" "$mediaSession" + moveToOutput "bin/pipewire-media-session" "$mediaSession" moveToOutput "share/systemd/user/pipewire-pulse.*" "$pulse" moveToOutput "lib/systemd/user/pipewire-pulse.*" "$pulse" moveToOutput "bin/pipewire-pulse" "$pulse" - - mkdir -p $mediaSession/nix-support/etc/pipewire/media-session.d - for f in etc/pipewire/media-session.d/*.conf; do $out/bin/spa-json-dump "$f" > "$mediaSession/nix-support/$f.json"; done - moveToOutput "bin/pipewire-media-session" "$mediaSession" - moveToOutput "etc/pipewire/media-session.d/*.conf" "$mediaSession" ''; passthru.tests = { diff --git a/pkgs/development/libraries/pipewire/installed-tests-path.patch b/pkgs/development/libraries/pipewire/installed-tests-path.patch deleted file mode 100644 index 2a92711626b..00000000000 --- a/pkgs/development/libraries/pipewire/installed-tests-path.patch +++ /dev/null @@ -1,29 +0,0 @@ -diff --git a/meson.build b/meson.build -index ffee41b4..bab6f019 100644 ---- a/meson.build -+++ b/meson.build -@@ -318,8 +318,8 @@ alsa_dep = (get_option('pipewire-alsa') - ? dependency('alsa', version : '>=1.1.7') - : dependency('', required: false)) - --installed_tests_metadir = join_paths(pipewire_datadir, 'installed-tests', pipewire_name) --installed_tests_execdir = join_paths(pipewire_libexecdir, 'installed-tests', pipewire_name) -+installed_tests_metadir = join_paths(get_option('installed_test_prefix'), 'share', 'installed-tests', pipewire_name) -+installed_tests_execdir = join_paths(get_option('installed_test_prefix'), 'libexec', 'installed-tests', pipewire_name) - installed_tests_enabled = get_option('installed_tests') - installed_tests_template = files('template.test.in') - -diff --git a/meson_options.txt b/meson_options.txt -index f03033c3..32df6c53 100644 ---- a/meson_options.txt -+++ b/meson_options.txt -@@ -18,6 +18,9 @@ option('installed_tests', - description: 'Install manual and automated test executables', - type: 'boolean', - value: false) -+option('installed_test_prefix', -+ description: 'Prefix for installed tests', -+ type: 'string') - option('gstreamer', - description: 'Build GStreamer plugins', - type: 'boolean', diff --git a/pkgs/development/libraries/pipewire/patches-0.3.22/0005-fix-some-warnings.patch b/pkgs/development/libraries/pipewire/patches-0.3.22/0005-fix-some-warnings.patch deleted file mode 100644 index 56987bf4d1d..00000000000 --- a/pkgs/development/libraries/pipewire/patches-0.3.22/0005-fix-some-warnings.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 63a3811aa76802e9585e04cf12bf8de617442105 Mon Sep 17 00:00:00 2001 -From: Wim Taymans -Date: Thu, 18 Feb 2021 12:42:06 +0100 -Subject: [PATCH 05/30] fix some warnings - ---- - spa/plugins/bluez5/backend-native.c | 2 +- - src/examples/media-session/default-routes.c | 18 +++++++++++++----- - 2 files changed, 14 insertions(+), 6 deletions(-) - -diff --git a/spa/plugins/bluez5/backend-native.c b/spa/plugins/bluez5/backend-native.c -index 4df714088..b4d4e5edf 100644 ---- a/spa/plugins/bluez5/backend-native.c -+++ b/spa/plugins/bluez5/backend-native.c -@@ -437,7 +437,7 @@ static bool rfcomm_hfp_hf(struct spa_source *source, char* buf) - struct rfcomm *rfcomm = source->data; - struct spa_bt_backend *backend = rfcomm->backend; - unsigned int features; -- unsigned int gain; -+ unsigned int SPA_UNUSED gain; - unsigned int selected_codec; - char* token; - char separators[] = "\r\n:"; diff --git a/pkgs/development/libraries/pipewire/pipewire-config-dir.patch b/pkgs/development/libraries/pipewire/pipewire-config-dir.patch deleted file mode 100644 index ad1ae93684b..00000000000 --- a/pkgs/development/libraries/pipewire/pipewire-config-dir.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff --git a/meson.build b/meson.build -index 0073eb13..0ffc6863 100644 ---- a/meson.build -+++ b/meson.build -@@ -34,7 +34,10 @@ pipewire_libexecdir = join_paths(prefix, get_option('libexecdir')) - pipewire_localedir = join_paths(prefix, get_option('localedir')) - pipewire_sysconfdir = join_paths(prefix, get_option('sysconfdir')) - --pipewire_configdir = join_paths(pipewire_sysconfdir, 'pipewire') -+pipewire_configdir = get_option('pipewire_config_dir') -+if pipewire_configdir == '' -+ pipewire_configdir = join_paths(pipewire_sysconfdir, 'pipewire') -+endif - modules_install_dir = join_paths(pipewire_libdir, pipewire_name) - - if host_machine.system() == 'linux' -diff --git a/meson_options.txt b/meson_options.txt -index 4b9e46b8..8c301459 100644 ---- a/meson_options.txt -+++ b/meson_options.txt -@@ -56,6 +56,9 @@ option('pipewire-pulseaudio', - option('libpulse-path', - description: 'Where to install the libpulse.so library', - type: 'string') -+option('pipewire_config_dir', -+ type : 'string', -+ description : 'Directory for pipewire configuration (defaults to /etc/pipewire)') - option('spa-plugins', - description: 'Enable spa plugins integration', - type: 'boolean', diff --git a/pkgs/development/libraries/pipewire/pipewire-pulse-path.patch b/pkgs/development/libraries/pipewire/pipewire-pulse-path.patch deleted file mode 100644 index 99782e1bb21..00000000000 --- a/pkgs/development/libraries/pipewire/pipewire-pulse-path.patch +++ /dev/null @@ -1,27 +0,0 @@ -diff --git a/meson_options.txt b/meson_options.txt -index 050a4c31..c481e76c 100644 ---- a/meson_options.txt -+++ b/meson_options.txt -@@ -148,6 +148,9 @@ option('udev', - option('udevrulesdir', - type : 'string', - description : 'Directory for udev rules (defaults to /lib/udev/rules.d)') -+option('pipewire_pulse_prefix', -+ type : 'string', -+ description : 'Install directory for the pipewire-pulse daemon') - option('systemd-user-unit-dir', - type : 'string', - description : 'Directory for user systemd units (defaults to /usr/lib/systemd/user)') -diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build -index 46dfbbc8..0d975cec 100644 ---- a/src/daemon/systemd/user/meson.build -+++ b/src/daemon/systemd/user/meson.build -@@ -9,7 +9,7 @@ install_data( - - systemd_config = configuration_data() - systemd_config.set('PW_BINARY', join_paths(pipewire_bindir, 'pipewire')) --systemd_config.set('PW_PULSE_BINARY', join_paths(pipewire_bindir, 'pipewire-pulse')) -+systemd_config.set('PW_PULSE_BINARY', join_paths(get_option('pipewire_pulse_prefix'), 'bin/pipewire-pulse')) - - configure_file(input : 'pipewire.service.in', - output : 'pipewire.service', -- cgit 1.4.1 From fbdb248e54c1d824788b39b2274ff55319d7a411 Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Mon, 15 Mar 2021 01:38:20 +0200 Subject: pipewire: 0.3.23 -> 0.3.24 --- nixos/modules/services/desktops/pipewire/README.md | 6 +++ .../services/desktops/pipewire/client-rt.conf.json | 31 +++++++---- .../services/desktops/pipewire/client.conf.json | 28 +++++++--- .../services/desktops/pipewire/jack.conf.json | 19 ++++--- .../desktops/pipewire/media-session.conf.json | 31 +++++++---- .../desktops/pipewire/pipewire-media-session.nix | 11 +--- .../desktops/pipewire/pipewire-pulse.conf.json | 26 ++++++--- .../services/desktops/pipewire/pipewire.conf.json | 62 +++++++++++++++------- .../services/desktops/pipewire/pipewire.nix | 40 ++------------ .../0055-pipewire-media-session-path.patch | 10 ++-- .../pipewire/0070-installed-tests-path.patch | 24 ++++----- pkgs/development/libraries/pipewire/default.nix | 29 +++++----- 12 files changed, 182 insertions(+), 135 deletions(-) create mode 100644 nixos/modules/services/desktops/pipewire/README.md (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/README.md b/nixos/modules/services/desktops/pipewire/README.md new file mode 100644 index 00000000000..87288a81cfe --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/README.md @@ -0,0 +1,6 @@ +# Updating + +1. Update the version & hash in pkgs/development/libraries/pipewire/default.nix +2. run `nix build -f /path/to/nixpkgs/checkout pipewire pipewire.mediaSession` +3. copy all JSON files from result/etc/pipewire and result-mediaSession/etc/pipewire/media-session.d to this directory +4. add new files to the module config and passthru tests diff --git a/nixos/modules/services/desktops/pipewire/client-rt.conf.json b/nixos/modules/services/desktops/pipewire/client-rt.conf.json index d294927b4f6..284d8c394a6 100644 --- a/nixos/modules/services/desktops/pipewire/client-rt.conf.json +++ b/nixos/modules/services/desktops/pipewire/client-rt.conf.json @@ -6,21 +6,34 @@ "audio.convert.*": "audioconvert/libspa-audioconvert", "support.*": "support/libspa-support" }, - "context.modules": { - "libpipewire-module-rtkit": { + "context.modules": [ + { + "name": "libpipewire-module-rtkit", "args": {}, "flags": [ "ifexists", "nofail" ] }, - "libpipewire-module-protocol-native": null, - "libpipewire-module-client-node": null, - "libpipewire-module-client-device": null, - "libpipewire-module-adapter": null, - "libpipewire-module-metadata": null, - "libpipewire-module-session-manager": null - }, + { + "name": "libpipewire-module-protocol-native" + }, + { + "name": "libpipewire-module-client-node" + }, + { + "name": "libpipewire-module-client-device" + }, + { + "name": "libpipewire-module-adapter" + }, + { + "name": "libpipewire-module-metadata" + }, + { + "name": "libpipewire-module-session-manager" + } + ], "filter.properties": {}, "stream.properties": {} } diff --git a/nixos/modules/services/desktops/pipewire/client.conf.json b/nixos/modules/services/desktops/pipewire/client.conf.json index 224938abbbc..71294a0e78a 100644 --- a/nixos/modules/services/desktops/pipewire/client.conf.json +++ b/nixos/modules/services/desktops/pipewire/client.conf.json @@ -6,14 +6,26 @@ "audio.convert.*": "audioconvert/libspa-audioconvert", "support.*": "support/libspa-support" }, - "context.modules": { - "libpipewire-module-protocol-native": null, - "libpipewire-module-client-node": null, - "libpipewire-module-client-device": null, - "libpipewire-module-adapter": null, - "libpipewire-module-metadata": null, - "libpipewire-module-session-manager": null - }, + "context.modules": [ + { + "name": "libpipewire-module-protocol-native" + }, + { + "name": "libpipewire-module-client-node" + }, + { + "name": "libpipewire-module-client-device" + }, + { + "name": "libpipewire-module-adapter" + }, + { + "name": "libpipewire-module-metadata" + }, + { + "name": "libpipewire-module-session-manager" + } + ], "filter.properties": {}, "stream.properties": {} } diff --git a/nixos/modules/services/desktops/pipewire/jack.conf.json b/nixos/modules/services/desktops/pipewire/jack.conf.json index 2de04036b31..a6bd3491785 100644 --- a/nixos/modules/services/desktops/pipewire/jack.conf.json +++ b/nixos/modules/services/desktops/pipewire/jack.conf.json @@ -5,17 +5,24 @@ "context.spa-libs": { "support.*": "support/libspa-support" }, - "context.modules": { - "libpipewire-module-rtkit": { + "context.modules": [ + { + "name": "libpipewire-module-rtkit", "args": {}, "flags": [ "ifexists", "nofail" ] }, - "libpipewire-module-protocol-native": null, - "libpipewire-module-client-node": null, - "libpipewire-module-metadata": null - }, + { + "name": "libpipewire-module-protocol-native" + }, + { + "name": "libpipewire-module-client-node" + }, + { + "name": "libpipewire-module-metadata" + } + ], "jack.properties": {} } diff --git a/nixos/modules/services/desktops/pipewire/media-session.conf.json b/nixos/modules/services/desktops/pipewire/media-session.conf.json index 4b2505ff816..62e59935dbe 100644 --- a/nixos/modules/services/desktops/pipewire/media-session.conf.json +++ b/nixos/modules/services/desktops/pipewire/media-session.conf.json @@ -6,21 +6,34 @@ "api.v4l2.*": "v4l2/libspa-v4l2", "api.libcamera.*": "libcamera/libspa-libcamera" }, - "context.modules": { - "libpipewire-module-rtkit": { + "context.modules": [ + { + "name": "libpipewire-module-rtkit", "args": {}, "flags": [ "ifexists", "nofail" ] }, - "libpipewire-module-protocol-native": null, - "libpipewire-module-client-node": null, - "libpipewire-module-client-device": null, - "libpipewire-module-adapter": null, - "libpipewire-module-metadata": null, - "libpipewire-module-session-manager": null - }, + { + "name": "libpipewire-module-protocol-native" + }, + { + "name": "libpipewire-module-client-node" + }, + { + "name": "libpipewire-module-client-device" + }, + { + "name": "libpipewire-module-adapter" + }, + { + "name": "libpipewire-module-metadata" + }, + { + "name": "libpipewire-module-session-manager" + } + ], "session.modules": { "default": [ "flatpak", diff --git a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix index b41ea349fb8..539a4cf4469 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix @@ -9,21 +9,12 @@ let && pkgs.stdenv.isx86_64 && pkgs.pkgsi686Linux.pipewire != null; - prioritizeNativeProtocol = { - "context.modules" = { - "libpipewire-module-protocol-native" = { - _priority = -100; - _content = null; - }; - }; - }; - # Use upstream config files passed through spa-json-dump as the base # Patched here as necessary for them to work with this module defaults = { alsa-monitor = (builtins.fromJSON (builtins.readFile ./alsa-monitor.conf.json)); bluez-monitor = (builtins.fromJSON (builtins.readFile ./bluez-monitor.conf.json)); - media-session = recursiveUpdate (builtins.fromJSON (builtins.readFile ./media-session.conf.json)) prioritizeNativeProtocol; + media-session = (builtins.fromJSON (builtins.readFile ./media-session.conf.json)); v4l2-monitor = (builtins.fromJSON (builtins.readFile ./v4l2-monitor.conf.json)); }; # Helpers for generating the pipewire JSON config file diff --git a/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json b/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json index da08bcea2c9..3e776fe75a2 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json +++ b/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json @@ -4,25 +4,35 @@ "audio.convert.*": "audioconvert/libspa-audioconvert", "support.*": "support/libspa-support" }, - "context.modules": { - "libpipewire-module-rtkit": { + "context.modules": [ + { + "name": "libpipewire-module-rtkit", "args": {}, "flags": [ "ifexists", "nofail" ] }, - "libpipewire-module-protocol-native": null, - "libpipewire-module-client-node": null, - "libpipewire-module-adapter": null, - "libpipewire-module-metadata": null, - "libpipewire-module-protocol-pulse": { + { + "name": "libpipewire-module-protocol-native" + }, + { + "name": "libpipewire-module-client-node" + }, + { + "name": "libpipewire-module-adapter" + }, + { + "name": "libpipewire-module-metadata" + }, + { + "name": "libpipewire-module-protocol-pulse", "args": { "server.address": [ "unix:native" ] } } - }, + ], "stream.properties": {} } diff --git a/nixos/modules/services/desktops/pipewire/pipewire.conf.json b/nixos/modules/services/desktops/pipewire/pipewire.conf.json index 59e2afca093..bae87dd6637 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.conf.json +++ b/nixos/modules/services/desktops/pipewire/pipewire.conf.json @@ -14,42 +14,66 @@ "api.jack.*": "jack/libspa-jack", "support.*": "support/libspa-support" }, - "context.modules": { - "libpipewire-module-rtkit": { + "context.modules": [ + { + "name": "libpipewire-module-rtkit", "args": {}, "flags": [ "ifexists", "nofail" ] }, - "libpipewire-module-protocol-native": null, - "libpipewire-module-profiler": null, - "libpipewire-module-metadata": null, - "libpipewire-module-spa-device-factory": null, - "libpipewire-module-spa-node-factory": null, - "libpipewire-module-client-node": null, - "libpipewire-module-client-device": null, - "libpipewire-module-portal": { + { + "name": "libpipewire-module-protocol-native" + }, + { + "name": "libpipewire-module-profiler" + }, + { + "name": "libpipewire-module-metadata" + }, + { + "name": "libpipewire-module-spa-device-factory" + }, + { + "name": "libpipewire-module-spa-node-factory" + }, + { + "name": "libpipewire-module-client-node" + }, + { + "name": "libpipewire-module-client-device" + }, + { + "name": "libpipewire-module-portal", "flags": [ "ifexists", "nofail" ] }, - "libpipewire-module-access": { + { + "name": "libpipewire-module-access", "args": {} }, - "libpipewire-module-adapter": null, - "libpipewire-module-link-factory": null, - "libpipewire-module-session-manager": null - }, - "context.objects": { - "spa-node-factory": { + { + "name": "libpipewire-module-adapter" + }, + { + "name": "libpipewire-module-link-factory" + }, + { + "name": "libpipewire-module-session-manager" + } + ], + "context.objects": [ + { + "factory": "spa-node-factory", "args": { "factory.name": "support.node.driver", "node.name": "Dummy-Driver", "priority.driver": 8000 } } - }, - "context.exec": {} + ], + "context.exec": [] } diff --git a/nixos/modules/services/desktops/pipewire/pipewire.nix b/nixos/modules/services/desktops/pipewire/pipewire.nix index 2577e77c4a1..7cf19706a63 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire.nix @@ -18,45 +18,15 @@ let ln -s "${cfg.package.jack}/lib" "$out/lib/pipewire" ''; - prioritizeNativeProtocol = { - "context.modules" = { - # Most other modules depend on this, so put it first - "libpipewire-module-protocol-native" = { - _priority = -100; - _content = null; - }; - }; - }; - - fixDaemonModulePriorities = { - "context.modules" = { - # Most other modules depend on thism so put it first - "libpipewire-module-protocol-native" = { - _priority = -100; - _content = null; - }; - # Needs to be before libpipewire-module-access - "libpipewire-module-portal" = { - _priority = -50; - _content = { - flags = [ - "ifexists" - "nofail" - ]; - }; - }; - }; - }; - # Use upstream config files passed through spa-json-dump as the base # Patched here as necessary for them to work with this module defaults = { - client = recursiveUpdate (builtins.fromJSON (builtins.readFile ./client.conf.json)) prioritizeNativeProtocol; - client-rt = recursiveUpdate (builtins.fromJSON (builtins.readFile ./client-rt.conf.json)) prioritizeNativeProtocol; - jack = recursiveUpdate (builtins.fromJSON (builtins.readFile ./jack.conf.json)) prioritizeNativeProtocol; + client = builtins.fromJSON (builtins.readFile ./client.conf.json); + client-rt = builtins.fromJSON (builtins.readFile ./client-rt.conf.json); + jack = builtins.fromJSON (builtins.readFile ./jack.conf.json); # Remove session manager invocation from the upstream generated file, it points to the wrong path - pipewire = recursiveUpdate (builtins.fromJSON (builtins.readFile ./pipewire.conf.json)) fixDaemonModulePriorities; - pipewire-pulse = recursiveUpdate (builtins.fromJSON (builtins.readFile ./pipewire-pulse.conf.json)) prioritizeNativeProtocol; + pipewire = builtins.fromJSON (builtins.readFile ./pipewire.conf.json); + pipewire-pulse = builtins.fromJSON (builtins.readFile ./pipewire-pulse.conf.json); }; # Helpers for generating the pipewire JSON config file diff --git a/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch b/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch index ce1085f37f7..a4fb8b41e7a 100644 --- a/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch +++ b/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch @@ -1,19 +1,19 @@ diff --git a/meson_options.txt b/meson_options.txt -index a6c8af72..8e5c3d73 100644 +index e2a1e028..310029f2 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -10,6 +10,9 @@ option('media-session', description: 'Build and install pipewire-media-session', - type: 'boolean', - value: true) + type: 'feature', + value: 'auto') +option('media-session-prefix', + description: 'Install directory for pipewire-media-session and its support files', + type: 'string') option('man', description: 'Build manpages', - type: 'boolean', + type: 'feature', diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build -index 4a70b0b0..84c9a19e 100644 +index 5c4d1af0..7296220f 100644 --- a/src/daemon/systemd/user/meson.build +++ b/src/daemon/systemd/user/meson.build @@ -10,7 +10,7 @@ install_data( diff --git a/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch b/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch index 2a92711626b..cb695fa398c 100644 --- a/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch +++ b/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch @@ -1,29 +1,29 @@ diff --git a/meson.build b/meson.build -index ffee41b4..bab6f019 100644 +index 97d4d939..b17358e5 100644 --- a/meson.build +++ b/meson.build -@@ -318,8 +318,8 @@ alsa_dep = (get_option('pipewire-alsa') - ? dependency('alsa', version : '>=1.1.7') - : dependency('', required: false)) - +@@ -353,8 +353,8 @@ libinotify_dep = (build_machine.system() == 'freebsd' + + alsa_dep = dependency('alsa', version : '>=1.1.7', required: get_option('pipewire-alsa')) + -installed_tests_metadir = join_paths(pipewire_datadir, 'installed-tests', pipewire_name) -installed_tests_execdir = join_paths(pipewire_libexecdir, 'installed-tests', pipewire_name) +installed_tests_metadir = join_paths(get_option('installed_test_prefix'), 'share', 'installed-tests', pipewire_name) +installed_tests_execdir = join_paths(get_option('installed_test_prefix'), 'libexec', 'installed-tests', pipewire_name) - installed_tests_enabled = get_option('installed_tests') + installed_tests_enabled = not get_option('installed_tests').disabled() installed_tests_template = files('template.test.in') - + diff --git a/meson_options.txt b/meson_options.txt -index f03033c3..32df6c53 100644 +index fba0d647..8c6106cd 100644 --- a/meson_options.txt +++ b/meson_options.txt -@@ -18,6 +18,9 @@ option('installed_tests', +@@ -26,6 +26,9 @@ option('installed_tests', description: 'Install manual and automated test executables', - type: 'boolean', - value: false) + type: 'feature', + value: 'disabled') +option('installed_test_prefix', + description: 'Prefix for installed tests', + type: 'string') option('gstreamer', description: 'Build GStreamer plugins', - type: 'boolean', + type: 'feature', diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index 5c5578abc8d..955a4d9da6e 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -39,11 +39,11 @@ let fontDirectories = []; }; - mesonBool = b: if b then "true" else "false"; + mesonEnable = b: if b then "enabled" else "disabled"; self = stdenv.mkDerivation rec { pname = "pipewire"; - version = "0.3.23"; + version = "0.3.24"; outputs = [ "out" @@ -61,7 +61,7 @@ let owner = "pipewire"; repo = "pipewire"; rev = version; - hash = "sha256:1HMUrE1NBmrdBRMKX3LRlXaCEH3wqP2jGtW8Rp9oyQA="; + hash = "sha256:PcY20FTtUtJYAwCscEs+HfkdwDksYPFZIVTVORP1ooI="; }; patches = [ @@ -103,22 +103,23 @@ let ++ lib.optionals bluezSupport [ bluez libopenaptx ldacbt sbc fdk_aac ]; mesonFlags = [ - "-Ddocs=true" - "-Dman=false" # we don't have xmltoman - "-Dexamples=${mesonBool withMediaSession}" # only needed for `pipewire-media-session` + "-Ddocs=enabled" + "-Dman=disabled" # we don't have xmltoman + "-Dexamples=${mesonEnable withMediaSession}" # only needed for `pipewire-media-session` "-Dudevrulesdir=lib/udev/rules.d" - "-Dinstalled_tests=true" + "-Dinstalled_tests=enabled" "-Dinstalled_test_prefix=${placeholder "installedTests"}" "-Dpipewire_pulse_prefix=${placeholder "pulse"}" "-Dmedia-session-prefix=${placeholder "mediaSession"}" "-Dlibjack-path=${placeholder "jack"}/lib" - "-Dgstreamer=${mesonBool gstreamerSupport}" - "-Dffmpeg=${mesonBool ffmpegSupport}" - "-Dbluez5=${mesonBool bluezSupport}" - "-Dbluez5-backend-hsp-native=${mesonBool nativeHspSupport}" - "-Dbluez5-backend-hfp-native=${mesonBool nativeHfpSupport}" - "-Dbluez5-backend-ofono=${mesonBool ofonoSupport}" - "-Dbluez5-backend-hsphfpd=${mesonBool hsphfpdSupport}" + "-Dlibcamera=disabled" + "-Dgstreamer=${mesonEnable gstreamerSupport}" + "-Dffmpeg=${mesonEnable ffmpegSupport}" + "-Dbluez5=${mesonEnable bluezSupport}" + "-Dbluez5-backend-hsp-native=${mesonEnable nativeHspSupport}" + "-Dbluez5-backend-hfp-native=${mesonEnable nativeHfpSupport}" + "-Dbluez5-backend-ofono=${mesonEnable ofonoSupport}" + "-Dbluez5-backend-hsphfpd=${mesonEnable hsphfpdSupport}" "-Dpipewire_config_dir=/etc/pipewire" ]; -- cgit 1.4.1 From 2a3c276b5321e0499db5d825a6e0abc0ce096a29 Mon Sep 17 00:00:00 2001 From: talyz Date: Wed, 31 Mar 2021 17:27:50 +0200 Subject: nixos/pipewire: Use formats.json, stricter typing, line breaks The upstream pipewire config is written in an almost, but not quite JSON format. The parser accepts standard JSON, though, so we don't need to write our file in the same nonstandard version. The typing for all config options is changed from `types.attrs`, which behaves poorly when the option is set from multiple locations, to the formats.json-type. Also, rewrite some very long one-liners for improved readability. --- .../desktops/pipewire/pipewire-media-session.nix | 67 ++++++++++++---------- .../services/desktops/pipewire/pipewire.nix | 56 +++++++++--------- 2 files changed, 66 insertions(+), 57 deletions(-) (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix index 539a4cf4469..17a2d49bb1f 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix @@ -4,6 +4,7 @@ with lib; let + json = pkgs.formats.json {}; cfg = config.services.pipewire.media-session; enable32BitAlsaPlugins = cfg.alsa.support32Bit && pkgs.stdenv.isx86_64 @@ -17,24 +18,13 @@ let media-session = (builtins.fromJSON (builtins.readFile ./media-session.conf.json)); v4l2-monitor = (builtins.fromJSON (builtins.readFile ./v4l2-monitor.conf.json)); }; - # Helpers for generating the pipewire JSON config file - mkSPAValueString = v: - if builtins.isList v then "[${lib.concatMapStringsSep " " mkSPAValueString v}]" - else if lib.types.attrs.check v then - "{${lib.concatStringsSep " " (mkSPAKeyValue v)}}" - else if builtins.isString v then "\"${lib.generators.mkValueStringDefault { } v}\"" - else lib.generators.mkValueStringDefault { } v; - - mkSPAKeyValue = attrs: map (def: def.content) ( - lib.sortProperties - ( - lib.mapAttrsToList - (k: v: lib.mkOrder (v._priority or 1000) "${lib.escape [ "=" ":" ] k} = ${mkSPAValueString (v._content or v)}") - attrs - ) - ); - - toSPAJSON = attrs: lib.concatStringsSep "\n" (mkSPAKeyValue attrs); + + configs = { + alsa-monitor = recursiveUpdate defaults.alsa-monitor cfg.config.alsa-monitor; + bluez-monitor = recursiveUpdate defaults.bluez-monitor cfg.config.bluez-monitor; + media-session = recursiveUpdate defaults.media-session cfg.config.media-session; + v4l2-monitor = recursiveUpdate defaults.v4l2-monitor cfg.config.v4l2-monitor; + }; in { meta = { @@ -62,7 +52,7 @@ in { config = { media-session = mkOption { - type = types.attrs; + type = json.type; description = '' Configuration for the media session core. For details see https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/media-session.d/media-session.conf @@ -71,7 +61,7 @@ in { }; alsa-monitor = mkOption { - type = types.attrs; + type = json.type; description = '' Configuration for the alsa monitor. For details see https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/media-session.d/alsa-monitor.conf @@ -80,7 +70,7 @@ in { }; bluez-monitor = mkOption { - type = types.attrs; + type = json.type; description = '' Configuration for the bluez5 monitor. For details see https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/media-session.d/bluez-monitor.conf @@ -89,7 +79,7 @@ in { }; v4l2-monitor = mkOption { - type = types.attrs; + type = json.type; description = '' Configuration for the V4L2 monitor. For details see https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/${cfg.package.version}/src/daemon/media-session.d/v4l2-monitor.conf @@ -106,15 +96,34 @@ in { systemd.packages = [ cfg.package ]; systemd.user.services.pipewire-media-session.wantedBy = [ "pipewire.service" ]; - environment.etc."pipewire/media-session.d/media-session.conf" = { text = toSPAJSON (recursiveUpdate defaults.media-session cfg.config.media-session); }; - environment.etc."pipewire/media-session.d/v4l2-monitor.conf" = { text = toSPAJSON (recursiveUpdate defaults.v4l2-monitor cfg.config.v4l2-monitor); }; + environment.etc."pipewire/media-session.d/media-session.conf" = { + source = json.generate "media-session.conf" configs.media-session; + }; + environment.etc."pipewire/media-session.d/v4l2-monitor.conf" = { + source = json.generate "v4l2-monitor.conf" configs.v4l2-monitor; + }; - environment.etc."pipewire/media-session.d/with-alsa" = mkIf config.services.pipewire.alsa.enable { text = ""; }; - environment.etc."pipewire/media-session.d/alsa-monitor.conf" = mkIf config.services.pipewire.alsa.enable { text = toSPAJSON (recursiveUpdate defaults.alsa-monitor cfg.config.alsa-monitor); }; + environment.etc."pipewire/media-session.d/with-alsa" = + mkIf config.services.pipewire.alsa.enable { + text = ""; + }; + environment.etc."pipewire/media-session.d/alsa-monitor.conf" = + mkIf config.services.pipewire.alsa.enable { + source = json.generate "alsa-monitor.conf" configs.alsa-monitor; + }; - environment.etc."pipewire/media-session.d/with-pulseaudio" = mkIf config.services.pipewire.pulse.enable { text = ""; }; - environment.etc."pipewire/media-session.d/bluez-monitor.conf" = mkIf config.services.pipewire.pulse.enable { text = toSPAJSON (recursiveUpdate defaults.bluez-monitor cfg.config.bluez-monitor); }; + environment.etc."pipewire/media-session.d/with-pulseaudio" = + mkIf config.services.pipewire.pulse.enable { + text = ""; + }; + environment.etc."pipewire/media-session.d/bluez-monitor.conf" = + mkIf config.services.pipewire.pulse.enable { + source = json.generate "bluez-monitor.conf" configs.bluez-monitor; + }; - environment.etc."pipewire/media-session.d/with-jack" = mkIf config.services.pipewire.jack.enable { text = ""; }; + environment.etc."pipewire/media-session.d/with-jack" = + mkIf config.services.pipewire.jack.enable { + text = ""; + }; }; } diff --git a/nixos/modules/services/desktops/pipewire/pipewire.nix b/nixos/modules/services/desktops/pipewire/pipewire.nix index 7cf19706a63..dbd6c5d87e1 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire.nix @@ -4,6 +4,7 @@ with lib; let + json = pkgs.formats.json {}; cfg = config.services.pipewire; enable32BitAlsaPlugins = cfg.alsa.support32Bit && pkgs.stdenv.isx86_64 @@ -29,24 +30,13 @@ let pipewire-pulse = builtins.fromJSON (builtins.readFile ./pipewire-pulse.conf.json); }; - # Helpers for generating the pipewire JSON config file - mkSPAValueString = v: - if builtins.isList v then "[${lib.concatMapStringsSep " " mkSPAValueString v}]" - else if lib.types.attrs.check v then - "{${lib.concatStringsSep " " (mkSPAKeyValue v)}}" - else if builtins.isString v then "\"${lib.generators.mkValueStringDefault { } v}\"" - else lib.generators.mkValueStringDefault { } v; - - mkSPAKeyValue = attrs: map (def: def.content) ( - lib.sortProperties - ( - lib.mapAttrsToList - (k: v: lib.mkOrder (v._priority or 1000) "${lib.escape [ "=" ] k} = ${mkSPAValueString (v._content or v)}") - attrs - ) - ); - - toSPAJSON = attrs: lib.concatStringsSep "\n" (mkSPAKeyValue attrs); + configs = { + client = recursiveUpdate defaults.client cfg.config.client; + client-rt = recursiveUpdate defaults.client-rt cfg.config.client-rt; + jack = recursiveUpdate defaults.jack cfg.config.jack; + pipewire = recursiveUpdate defaults.pipewire cfg.config.pipewire; + pipewire-pulse = recursiveUpdate defaults.pipewire-pulse cfg.config.pipewire-pulse; + }; in { meta = { @@ -78,7 +68,7 @@ in { config = { client = mkOption { - type = types.attrs; + type = json.type; default = {}; description = '' Configuration for pipewire clients. For details see @@ -87,7 +77,7 @@ in { }; client-rt = mkOption { - type = types.attrs; + type = json.type; default = {}; description = '' Configuration for realtime pipewire clients. For details see @@ -96,7 +86,7 @@ in { }; jack = mkOption { - type = types.attrs; + type = json.type; default = {}; description = '' Configuration for the pipewire daemon's jack module. For details see @@ -105,7 +95,7 @@ in { }; pipewire = mkOption { - type = types.attrs; + type = json.type; default = {}; description = '' Configuration for the pipewire daemon. For details see @@ -114,7 +104,7 @@ in { }; pipewire-pulse = mkOption { - type = types.attrs; + type = json.type; default = {}; description = '' Configuration for the pipewire-pulse daemon. For details see @@ -187,11 +177,21 @@ in { source = "${cfg.package}/share/alsa/alsa.conf.d/99-pipewire-default.conf"; }; - environment.etc."pipewire/client.conf" = { text = toSPAJSON (recursiveUpdate defaults.client cfg.config.client); }; - environment.etc."pipewire/client-rt.conf" = { text = toSPAJSON (recursiveUpdate defaults.client-rt cfg.config.client-rt); }; - environment.etc."pipewire/jack.conf" = { text = toSPAJSON (recursiveUpdate defaults.jack cfg.config.jack); }; - environment.etc."pipewire/pipewire.conf" = { text = toSPAJSON (recursiveUpdate defaults.pipewire cfg.config.pipewire); }; - environment.etc."pipewire/pipewire-pulse.conf" = { text = toSPAJSON (recursiveUpdate defaults.pipewire-pulse cfg.config.pipewire-pulse); }; + environment.etc."pipewire/client.conf" = { + source = json.generate "client.conf" configs.client; + }; + environment.etc."pipewire/client-rt.conf" = { + source = json.generate "client-rt.conf" configs.client-rt; + }; + environment.etc."pipewire/jack.conf" = { + source = json.generate "jack.conf" configs.jack; + }; + environment.etc."pipewire/pipewire.conf" = { + source = json.generate "pipewire.conf" configs.pipewire; + }; + environment.etc."pipewire/pipewire-pulse.conf" = { + source = json.generate "pipewire-pulse.conf" configs.pipewire-pulse; + }; environment.sessionVariables.LD_LIBRARY_PATH = lib.optional cfg.jack.enable "/run/current-system/sw/lib/pipewire"; -- cgit 1.4.1 From f94c84f84481e6b3bc12eee3a8e2de444bc2594b Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Tue, 6 Apr 2021 22:58:49 +0300 Subject: pipewire: 0.3.24 -> 0.3.25 --- .../modules/services/desktops/pipewire/bluez-monitor.conf.json | 8 +++++++- pkgs/development/libraries/pipewire/default.nix | 10 ++-------- 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json b/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json index 4d50cb9f1ad..bd00571bc35 100644 --- a/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json +++ b/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json @@ -8,7 +8,13 @@ } ], "actions": { - "update-props": {} + "update-props": { + "bluez5.reconnect-profiles": [ + "hfp_hf", + "hsp_hs", + "a2dp_sink" + ] + } } }, { diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index d685bde35ed..47a85c36c23 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -1,7 +1,6 @@ { stdenv , lib , fetchFromGitLab -, fetchpatch , removeReferencesTo , meson , ninja @@ -43,7 +42,7 @@ let self = stdenv.mkDerivation rec { pname = "pipewire"; - version = "0.3.24"; + version = "0.3.25"; outputs = [ "out" @@ -61,7 +60,7 @@ let owner = "pipewire"; repo = "pipewire"; rev = version; - hash = "sha256:PcY20FTtUtJYAwCscEs+HfkdwDksYPFZIVTVORP1ooI="; + hash = "sha256:EbXWcf6QLtbvm6/eXBI+PF2sTw2opYfmc+H/SMDEH1U="; }; patches = [ @@ -75,11 +74,6 @@ let ./0070-installed-tests-path.patch # Add flag to specify configuration directory (different from the installation directory). ./0080-pipewire-config-dir.patch - # Fix JSON parser. - (fetchpatch { - url = "https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/34800dc0191a4ee7a329eeb361a6f2ccf4a75176.diff"; - sha256 = "0dzxzr408qqzf0252nwg14709p1lb2k826i3kdzg6djq8w98d5aj"; - }) ]; nativeBuildInputs = [ -- cgit 1.4.1 From 24320ba1ddafa08714d17619c6d84f6f144da8bc Mon Sep 17 00:00:00 2001 From: talyz Date: Tue, 27 Apr 2021 09:46:08 +0200 Subject: pipewire: 0.3.25 -> 0.3.26 --- .../desktops/pipewire/bluez-monitor.conf.json | 2 +- .../desktops/pipewire/media-session.conf.json | 1 + .../desktops/pipewire/pipewire-pulse.conf.json | 5 ++++- .../services/desktops/pipewire/pipewire.conf.json | 5 ++++- .../pipewire/0040-alsa-profiles-use-libdir.patch | 12 +++++------ .../pipewire/0050-pipewire-pulse-path.patch | 14 ++++++------- .../0055-pipewire-media-session-path.patch | 16 +++++++-------- .../pipewire/0070-installed-tests-path.patch | 20 +++++++++--------- .../pipewire/0080-pipewire-config-dir.patch | 24 +++++++++++----------- pkgs/development/libraries/pipewire/default.nix | 4 ++-- 10 files changed, 55 insertions(+), 48 deletions(-) (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json b/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json index bd00571bc35..6d1c23e8256 100644 --- a/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json +++ b/nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json @@ -9,7 +9,7 @@ ], "actions": { "update-props": { - "bluez5.reconnect-profiles": [ + "bluez5.auto-connect": [ "hfp_hf", "hsp_hs", "a2dp_sink" diff --git a/nixos/modules/services/desktops/pipewire/media-session.conf.json b/nixos/modules/services/desktops/pipewire/media-session.conf.json index 62e59935dbe..24906e767d6 100644 --- a/nixos/modules/services/desktops/pipewire/media-session.conf.json +++ b/nixos/modules/services/desktops/pipewire/media-session.conf.json @@ -59,6 +59,7 @@ "with-pulseaudio": [ "with-audio", "bluez5", + "logind", "restore-stream", "streams-follow-default" ] diff --git a/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json b/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json index 3e776fe75a2..17bbbdef117 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json +++ b/nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json @@ -30,7 +30,10 @@ "args": { "server.address": [ "unix:native" - ] + ], + "vm.overrides": { + "pulse.min.quantum": "1024/48000" + } } } ], diff --git a/nixos/modules/services/desktops/pipewire/pipewire.conf.json b/nixos/modules/services/desktops/pipewire/pipewire.conf.json index bae87dd6637..a9330f54f4f 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.conf.json +++ b/nixos/modules/services/desktops/pipewire/pipewire.conf.json @@ -2,7 +2,10 @@ "context.properties": { "link.max-buffers": 16, "core.daemon": true, - "core.name": "pipewire-0" + "core.name": "pipewire-0", + "vm.overrides": { + "default.clock.min-quantum": 1024 + } }, "context.spa-libs": { "audio.convert.*": "audioconvert/libspa-audioconvert", diff --git a/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch b/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch index c657d12f7d0..fab89c4ffd9 100644 --- a/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch +++ b/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch @@ -1,13 +1,13 @@ diff --git a/meson.build b/meson.build -index ffee41b4..f3e4ec74 100644 +index 99a4b2d1..d4a4cda7 100644 --- a/meson.build +++ b/meson.build -@@ -53,7 +53,7 @@ endif +@@ -55,7 +55,7 @@ endif - spa_plugindir = join_paths(pipewire_libdir, spa_name) + spa_plugindir = pipewire_libdir / spa_name --alsadatadir = join_paths(pipewire_datadir, 'alsa-card-profile', 'mixer') -+alsadatadir = join_paths(pipewire_libdir, '..', 'share', 'alsa-card-profile', 'mixer') +-alsadatadir = pipewire_datadir / 'alsa-card-profile' / 'mixer' ++alsadatadir = pipewire_libdir / '..' / 'share' / 'alsa-card-profile' / 'mixer' - pipewire_headers_dir = join_paths(pipewire_name, 'pipewire') + pipewire_headers_dir = pipewire_name / 'pipewire' diff --git a/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch b/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch index 4a6b21dd431..fd7d031ee0f 100644 --- a/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch +++ b/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch @@ -1,8 +1,8 @@ diff --git a/meson_options.txt b/meson_options.txt -index ce364d93..a6c8af72 100644 +index 66791f3a..93b5e2a9 100644 --- a/meson_options.txt +++ b/meson_options.txt -@@ -152,6 +152,9 @@ option('udev', +@@ -172,6 +172,9 @@ option('udev', option('udevrulesdir', type : 'string', description : 'Directory for udev rules (defaults to /lib/udev/rules.d)') @@ -13,15 +13,15 @@ index ce364d93..a6c8af72 100644 type : 'string', description : 'Directory for user systemd units (defaults to /usr/lib/systemd/user)') diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build -index 0a5e5042..4a70b0b0 100644 +index aa30a86f..1edebb2d 100644 --- a/src/daemon/systemd/user/meson.build +++ b/src/daemon/systemd/user/meson.build @@ -9,7 +9,7 @@ install_data( systemd_config = configuration_data() - systemd_config.set('PW_BINARY', join_paths(pipewire_bindir, 'pipewire')) --systemd_config.set('PW_PULSE_BINARY', join_paths(pipewire_bindir, 'pipewire-pulse')) -+systemd_config.set('PW_PULSE_BINARY', join_paths(get_option('pipewire_pulse_prefix'), 'bin/pipewire-pulse')) - systemd_config.set('PW_MEDIA_SESSION_BINARY', join_paths(pipewire_bindir, 'pipewire-media-session')) + systemd_config.set('PW_BINARY', pipewire_bindir / 'pipewire') +-systemd_config.set('PW_PULSE_BINARY', pipewire_bindir / 'pipewire-pulse') ++systemd_config.set('PW_PULSE_BINARY', get_option('pipewire_pulse_prefix') / 'bin/pipewire-pulse') + systemd_config.set('PW_MEDIA_SESSION_BINARY', pipewire_bindir / 'pipewire-media-session') configure_file(input : 'pipewire.service.in', diff --git a/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch b/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch index a4fb8b41e7a..be6683c3e7b 100644 --- a/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch +++ b/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch @@ -1,8 +1,8 @@ diff --git a/meson_options.txt b/meson_options.txt -index e2a1e028..310029f2 100644 +index 93b5e2a9..1b915ac3 100644 --- a/meson_options.txt +++ b/meson_options.txt -@@ -10,6 +10,9 @@ option('media-session', +@@ -13,6 +13,9 @@ option('media-session', description: 'Build and install pipewire-media-session', type: 'feature', value: 'auto') @@ -13,15 +13,15 @@ index e2a1e028..310029f2 100644 description: 'Build manpages', type: 'feature', diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build -index 5c4d1af0..7296220f 100644 +index 1edebb2d..251270eb 100644 --- a/src/daemon/systemd/user/meson.build +++ b/src/daemon/systemd/user/meson.build @@ -10,7 +10,7 @@ install_data( systemd_config = configuration_data() - systemd_config.set('PW_BINARY', join_paths(pipewire_bindir, 'pipewire')) - systemd_config.set('PW_PULSE_BINARY', join_paths(get_option('pipewire_pulse_prefix'), 'bin/pipewire-pulse')) --systemd_config.set('PW_MEDIA_SESSION_BINARY', join_paths(pipewire_bindir, 'pipewire-media-session')) -+systemd_config.set('PW_MEDIA_SESSION_BINARY', join_paths(get_option('media-session-prefix'), 'bin/pipewire-media-session')) - + systemd_config.set('PW_BINARY', pipewire_bindir / 'pipewire') + systemd_config.set('PW_PULSE_BINARY', get_option('pipewire_pulse_prefix') / 'bin/pipewire-pulse') +-systemd_config.set('PW_MEDIA_SESSION_BINARY', pipewire_bindir / 'pipewire-media-session') ++systemd_config.set('PW_MEDIA_SESSION_BINARY', get_option('media-session-prefix') / 'bin/pipewire-media-session') + configure_file(input : 'pipewire.service.in', output : 'pipewire.service', diff --git a/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch b/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch index cb695fa398c..926de306254 100644 --- a/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch +++ b/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch @@ -1,23 +1,23 @@ diff --git a/meson.build b/meson.build -index 97d4d939..b17358e5 100644 +index d4a4cda7..a27569bd 100644 --- a/meson.build +++ b/meson.build @@ -353,8 +353,8 @@ libinotify_dep = (build_machine.system() == 'freebsd' - + alsa_dep = dependency('alsa', version : '>=1.1.7', required: get_option('pipewire-alsa')) - --installed_tests_metadir = join_paths(pipewire_datadir, 'installed-tests', pipewire_name) --installed_tests_execdir = join_paths(pipewire_libexecdir, 'installed-tests', pipewire_name) -+installed_tests_metadir = join_paths(get_option('installed_test_prefix'), 'share', 'installed-tests', pipewire_name) -+installed_tests_execdir = join_paths(get_option('installed_test_prefix'), 'libexec', 'installed-tests', pipewire_name) + +-installed_tests_metadir = pipewire_datadir / 'installed-tests' / pipewire_name +-installed_tests_execdir = pipewire_libexecdir / 'installed-tests' / pipewire_name ++installed_tests_metadir = get_option('installed_test_prefix') / 'share' / 'installed-tests' / pipewire_name ++installed_tests_execdir = get_option('installed_test_prefix') / 'libexec' / 'installed-tests' / pipewire_name installed_tests_enabled = not get_option('installed_tests').disabled() installed_tests_template = files('template.test.in') - + diff --git a/meson_options.txt b/meson_options.txt -index fba0d647..8c6106cd 100644 +index 1b915ac3..85beb86a 100644 --- a/meson_options.txt +++ b/meson_options.txt -@@ -26,6 +26,9 @@ option('installed_tests', +@@ -29,6 +29,9 @@ option('installed_tests', description: 'Install manual and automated test executables', type: 'feature', value: 'disabled') diff --git a/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch b/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch index ad1ae93684b..b92e2818ea0 100644 --- a/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch +++ b/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch @@ -1,30 +1,30 @@ diff --git a/meson.build b/meson.build -index 0073eb13..0ffc6863 100644 +index a27569bd..fcf18344 100644 --- a/meson.build +++ b/meson.build -@@ -34,7 +34,10 @@ pipewire_libexecdir = join_paths(prefix, get_option('libexecdir')) - pipewire_localedir = join_paths(prefix, get_option('localedir')) - pipewire_sysconfdir = join_paths(prefix, get_option('sysconfdir')) +@@ -36,7 +36,10 @@ pipewire_libexecdir = prefix / get_option('libexecdir') + pipewire_localedir = prefix / get_option('localedir') + pipewire_sysconfdir = prefix / get_option('sysconfdir') --pipewire_configdir = join_paths(pipewire_sysconfdir, 'pipewire') +-pipewire_configdir = pipewire_sysconfdir / 'pipewire' +pipewire_configdir = get_option('pipewire_config_dir') +if pipewire_configdir == '' -+ pipewire_configdir = join_paths(pipewire_sysconfdir, 'pipewire') ++ pipewire_configdir = pipewire_sysconfdir / 'pipewire' +endif - modules_install_dir = join_paths(pipewire_libdir, pipewire_name) + modules_install_dir = pipewire_libdir / pipewire_name if host_machine.system() == 'linux' diff --git a/meson_options.txt b/meson_options.txt -index 4b9e46b8..8c301459 100644 +index 85beb86a..372e8faa 100644 --- a/meson_options.txt +++ b/meson_options.txt -@@ -56,6 +56,9 @@ option('pipewire-pulseaudio', - option('libpulse-path', - description: 'Where to install the libpulse.so library', +@@ -67,6 +67,9 @@ option('jack-devel', + option('libjack-path', + description: 'Where to install the libjack.so library', type: 'string') +option('pipewire_config_dir', + type : 'string', + description : 'Directory for pipewire configuration (defaults to /etc/pipewire)') option('spa-plugins', description: 'Enable spa plugins integration', - type: 'boolean', + type: 'feature', diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index 47a85c36c23..9f095c7ab78 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -42,7 +42,7 @@ let self = stdenv.mkDerivation rec { pname = "pipewire"; - version = "0.3.25"; + version = "0.3.26"; outputs = [ "out" @@ -60,7 +60,7 @@ let owner = "pipewire"; repo = "pipewire"; rev = version; - hash = "sha256:EbXWcf6QLtbvm6/eXBI+PF2sTw2opYfmc+H/SMDEH1U="; + hash = "sha256:1rqi1sa937lp89ai79b5n7m0p66pigpj4w1mr2vq4dycfp8vppxk"; }; patches = [ -- cgit 1.4.1 From fb86d324d1a6f05a6da55af6e2ae8922e7063498 Mon Sep 17 00:00:00 2001 From: talyz Date: Tue, 27 Apr 2021 12:52:41 +0200 Subject: pipewire: Add update script --- nixos/modules/services/desktops/pipewire/README.md | 6 --- pkgs/development/libraries/pipewire/default.nix | 50 +++++++++++----------- pkgs/development/libraries/pipewire/update.sh | 24 +++++++++++ 3 files changed, 50 insertions(+), 30 deletions(-) delete mode 100644 nixos/modules/services/desktops/pipewire/README.md create mode 100755 pkgs/development/libraries/pipewire/update.sh (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/README.md b/nixos/modules/services/desktops/pipewire/README.md deleted file mode 100644 index 87288a81cfe..00000000000 --- a/nixos/modules/services/desktops/pipewire/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Updating - -1. Update the version & hash in pkgs/development/libraries/pipewire/default.nix -2. run `nix build -f /path/to/nixpkgs/checkout pipewire pipewire.mediaSession` -3. copy all JSON files from result/etc/pipewire and result-mediaSession/etc/pipewire/media-session.d to this directory -4. add new files to the module config and passthru tests diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index 9f095c7ab78..133853e2362 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -60,7 +60,7 @@ let owner = "pipewire"; repo = "pipewire"; rev = version; - hash = "sha256:1rqi1sa937lp89ai79b5n7m0p66pigpj4w1mr2vq4dycfp8vppxk"; + sha256 = "sha256-s9+70XXMN4K3yDVwIu+L15gL6rFlpRNVQpeekZQOEec="; }; patches = [ @@ -146,29 +146,31 @@ let moveToOutput "bin/pipewire-pulse" "$pulse" ''; - passthru.tests = { - installedTests = nixosTests.installed-tests.pipewire; - - # This ensures that all the paths used by the NixOS module are found. - test-paths = callPackage ./test-paths.nix { - paths-out = [ - "share/alsa/alsa.conf.d/50-pipewire.conf" - "nix-support/etc/pipewire/client.conf.json" - "nix-support/etc/pipewire/client-rt.conf.json" - "nix-support/etc/pipewire/jack.conf.json" - "nix-support/etc/pipewire/pipewire.conf.json" - "nix-support/etc/pipewire/pipewire-pulse.conf.json" - ]; - paths-out-media-session = [ - "nix-support/etc/pipewire/media-session.d/alsa-monitor.conf.json" - "nix-support/etc/pipewire/media-session.d/bluez-monitor.conf.json" - "nix-support/etc/pipewire/media-session.d/media-session.conf.json" - "nix-support/etc/pipewire/media-session.d/v4l2-monitor.conf.json" - ]; - paths-lib = [ - "lib/alsa-lib/libasound_module_pcm_pipewire.so" - "share/alsa-card-profile/mixer" - ]; + passthru = { + updateScript = ./update.sh; + tests = { + installedTests = nixosTests.installed-tests.pipewire; + + # This ensures that all the paths used by the NixOS module are found. + test-paths = callPackage ./test-paths.nix { + paths-out = [ + "share/alsa/alsa.conf.d/50-pipewire.conf" + "nix-support/etc/pipewire/client.conf.json" + "nix-support/etc/pipewire/jack.conf.json" + "nix-support/etc/pipewire/pipewire.conf.json" + "nix-support/etc/pipewire/pipewire-pulse.conf.json" + ]; + paths-out-media-session = [ + "nix-support/etc/pipewire/media-session.d/alsa-monitor.conf.json" + "nix-support/etc/pipewire/media-session.d/bluez-monitor.conf.json" + "nix-support/etc/pipewire/media-session.d/media-session.conf.json" + "nix-support/etc/pipewire/media-session.d/v4l2-monitor.conf.json" + ]; + paths-lib = [ + "lib/alsa-lib/libasound_module_pcm_pipewire.so" + "share/alsa-card-profile/mixer" + ]; + }; }; }; diff --git a/pkgs/development/libraries/pipewire/update.sh b/pkgs/development/libraries/pipewire/update.sh new file mode 100755 index 00000000000..6d0088c206c --- /dev/null +++ b/pkgs/development/libraries/pipewire/update.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env nix-shell +#!nix-shell -p nix-update -i bash +# shellcheck shell=bash + +set -o errexit -o pipefail -o nounset -o errtrace +shopt -s inherit_errexit +shopt -s nullglob +IFS=$'\n' + +NIXPKGS_ROOT="$(git rev-parse --show-toplevel)" + +cd "$NIXPKGS_ROOT" +nix-update pipewire +outputs=$(nix-build . -A pipewire -A pipewire.mediaSession) +for p in $outputs; do + conf_files=$(find "$p/nix-support/etc/pipewire/" -name '*.conf.json') + for c in $conf_files; do + file_name=$(basename "$c") + if [[ ! -e "nixos/modules/services/desktops/pipewire/$file_name" ]]; then + echo "New file $file_name found! Add it to the module config and passthru tests!" + fi + install -m 0644 "$c" "nixos/modules/services/desktops/pipewire/" + done +done -- cgit 1.4.1 From c702cc43213dce2573adb924ab9c67522616aea6 Mon Sep 17 00:00:00 2001 From: Jan Solanti Date: Wed, 2 Jun 2021 03:16:43 +0300 Subject: pipewire: 0.3.27 -> 0.3.30 --- .../services/desktops/pipewire/pipewire.conf.json | 13 ++++++- .../pipewire/0080-pipewire-config-dir.patch | 24 ++++++------ .../0090-pipewire-config-template-paths.patch | 28 ++++++++++++++ pkgs/development/libraries/pipewire/default.nix | 44 +++++++++++++++++----- 4 files changed, 86 insertions(+), 23 deletions(-) create mode 100644 pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/pipewire.conf.json b/nixos/modules/services/desktops/pipewire/pipewire.conf.json index a9330f54f4f..a923ab4db23 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire.conf.json +++ b/nixos/modules/services/desktops/pipewire/pipewire.conf.json @@ -74,7 +74,18 @@ "args": { "factory.name": "support.node.driver", "node.name": "Dummy-Driver", - "priority.driver": 8000 + "node.group": "pipewire.dummy", + "priority.driver": 20000 + } + }, + { + "factory": "spa-node-factory", + "args": { + "factory.name": "support.node.driver", + "node.name": "Freewheel-Driver", + "priority.driver": 19000, + "node.group": "pipewire.freewheel", + "node.freewheel": true } } ], diff --git a/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch b/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch index b92e2818ea0..b8d8fcb0f90 100644 --- a/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch +++ b/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch @@ -1,30 +1,30 @@ diff --git a/meson.build b/meson.build -index a27569bd..fcf18344 100644 +index b6b4553b..f21c29d8 100644 --- a/meson.build +++ b/meson.build -@@ -36,7 +36,10 @@ pipewire_libexecdir = prefix / get_option('libexecdir') - pipewire_localedir = prefix / get_option('localedir') +@@ -37,7 +37,10 @@ pipewire_localedir = prefix / get_option('localedir') pipewire_sysconfdir = prefix / get_option('sysconfdir') --pipewire_configdir = pipewire_sysconfdir / 'pipewire' -+pipewire_configdir = get_option('pipewire_config_dir') -+if pipewire_configdir == '' -+ pipewire_configdir = pipewire_sysconfdir / 'pipewire' + pipewire_configdir = pipewire_sysconfdir / 'pipewire' +-pipewire_confdatadir = pipewire_datadir / 'pipewire' ++pipewire_confdatadir = get_option('pipewire_confdata_dir') ++if pipewire_confdatadir == '' ++ pipewire_confdatadir = pipewire_datadir / 'pipewire' +endif modules_install_dir = pipewire_libdir / pipewire_name if host_machine.system() == 'linux' diff --git a/meson_options.txt b/meson_options.txt -index 85beb86a..372e8faa 100644 +index 9bc33fcd..e4bd2dc1 100644 --- a/meson_options.txt +++ b/meson_options.txt -@@ -67,6 +67,9 @@ option('jack-devel', +@@ -61,6 +61,9 @@ option('jack-devel', option('libjack-path', description: 'Where to install the libjack.so library', type: 'string') -+option('pipewire_config_dir', -+ type : 'string', -+ description : 'Directory for pipewire configuration (defaults to /etc/pipewire)') ++option('pipewire_confdata_dir', ++ type: 'string', ++ description: 'Directory for pipewire default configuration (defaults to /usr/share/pipewire)') option('spa-plugins', description: 'Enable spa plugins integration', type: 'feature', diff --git a/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch b/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch new file mode 100644 index 00000000000..966cb957977 --- /dev/null +++ b/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch @@ -0,0 +1,28 @@ +diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in +index bbafa134..227d3e06 100644 +--- a/src/daemon/pipewire.conf.in ++++ b/src/daemon/pipewire.conf.in +@@ -116,7 +116,7 @@ context.modules = [ + # access.allowed to list an array of paths of allowed + # apps. + #access.allowed = [ +- # @media_session_path@ ++ # + #] + + # An array of rejected paths. +@@ -220,12 +220,12 @@ context.exec = [ + # but it is better to start it as a systemd service. + # Run the session manager with -h for options. + # +- @comment@{ path = "@media_session_path@" args = "" } ++ @comment@{ path = "" args = "" } + # + # You can optionally start the pulseaudio-server here as well + # but it is better to start it as a systemd service. + # It can be interesting to start another daemon here that listens + # on another address with the -a option (eg. -a tcp:4713). + # +- @comment@{ path = "@pipewire_path@" args = "-c pipewire-pulse.conf" } ++ @comment@{ path = "" args = "-c pipewire-pulse.conf" } + ] diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index b3e740f39c4..b8fb216e358 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -2,6 +2,7 @@ , lib , fetchFromGitLab , removeReferencesTo +, python3 , meson , ninja , systemd @@ -19,6 +20,7 @@ , SDL2 , vulkan-headers , vulkan-loader +, webrtc-audio-processing , ncurses , makeFontsConf , callPackage @@ -31,6 +33,8 @@ , nativeHfpSupport ? true , ofonoSupport ? true , hsphfpdSupport ? true +, pulseTunnelSupport ? true, libpulseaudio ? null +, zeroconfSupport ? true, avahi ? null }: let @@ -42,7 +46,7 @@ let self = stdenv.mkDerivation rec { pname = "pipewire"; - version = "0.3.27"; + version = "0.3.30"; outputs = [ "out" @@ -60,7 +64,7 @@ let owner = "pipewire"; repo = "pipewire"; rev = version; - sha256 = "sha256-GfcMODQWtcahBvXnZ98/PKIm4pkqLaz09oOy7zQR4IA="; + sha256 = "sha256-DnaPvZoDaegjtJNKBmCJEAZe5FQBnSER79FPnxiWQUE="; }; patches = [ @@ -72,8 +76,10 @@ let ./0055-pipewire-media-session-path.patch # Move installed tests into their own output. ./0070-installed-tests-path.patch - # Add flag to specify configuration directory (different from the installation directory). + # Add option for changing the config install directory ./0080-pipewire-config-dir.patch + # Remove output paths from the comments in the config templates to break dependency cycles + ./0090-pipewire-config-template-paths.patch ]; nativeBuildInputs = [ @@ -82,6 +88,7 @@ let meson ninja pkg-config + python3 ]; buildInputs = [ @@ -94,12 +101,15 @@ let udev vulkan-headers vulkan-loader + webrtc-audio-processing valgrind SDL2 systemd ] ++ lib.optionals gstreamerSupport [ gst_all_1.gst-plugins-base gst_all_1.gstreamer ] ++ lib.optional ffmpegSupport ffmpeg - ++ lib.optionals bluezSupport [ bluez libopenaptx ldacbt sbc fdk_aac ]; + ++ lib.optionals bluezSupport [ bluez libopenaptx ldacbt sbc fdk_aac ] + ++ lib.optional pulseTunnelSupport libpulseaudio + ++ lib.optional zeroconfSupport avahi; mesonFlags = [ "-Ddocs=enabled" @@ -112,6 +122,8 @@ let "-Dmedia-session-prefix=${placeholder "mediaSession"}" "-Dlibjack-path=${placeholder "jack"}/lib" "-Dlibcamera=disabled" + "-Dlibpulse=${mesonEnable pulseTunnelSupport}" + "-Davahi=${mesonEnable zeroconfSupport}" "-Dgstreamer=${mesonEnable gstreamerSupport}" "-Dffmpeg=${mesonEnable ffmpegSupport}" "-Dbluez5=${mesonEnable bluezSupport}" @@ -119,24 +131,35 @@ let "-Dbluez5-backend-hfp-native=${mesonEnable nativeHfpSupport}" "-Dbluez5-backend-ofono=${mesonEnable ofonoSupport}" "-Dbluez5-backend-hsphfpd=${mesonEnable hsphfpdSupport}" - "-Dpipewire_config_dir=/etc/pipewire" + "-Dsysconfdir=/etc" + "-Dpipewire_confdata_dir=${placeholder "lib"}/share/pipewire" ]; FONTCONFIG_FILE = fontsConf; # Fontconfig error: Cannot load default config file doCheck = true; + postUnpack = '' + patchShebangs source/doc/strip-static.sh + patchShebangs source/spa/tests/gen-cpp-test.py + ''; + postInstall = '' - pushd . - cd $out + pushd $lib/share mkdir -p $out/nix-support/etc/pipewire - for f in etc/pipewire/*.conf; do bin/spa-json-dump "$f" > "$out/nix-support/$f.json"; done + for f in pipewire/*.conf; do + echo "Generating JSON from $f" + $out/bin/spa-json-dump "$f" > "$out/nix-support/etc/$f.json" + done mkdir -p $mediaSession/nix-support/etc/pipewire/media-session.d - for f in etc/pipewire/media-session.d/*.conf; do bin/spa-json-dump "$f" > "$mediaSession/nix-support/$f.json"; done + for f in pipewire/media-session.d/*.conf; do + echo "Generating JSON from $f" + $out/bin/spa-json-dump "$f" > "$mediaSession/nix-support/etc/$f.json" + done popd - moveToOutput "etc/pipewire/media-session.d/*.conf" "$mediaSession" + moveToOutput "share/pipewire/media-session.d/*.conf" "$mediaSession" moveToOutput "share/systemd/user/pipewire-media-session.*" "$mediaSession" moveToOutput "lib/systemd/user/pipewire-media-session.*" "$mediaSession" moveToOutput "bin/pipewire-media-session" "$mediaSession" @@ -155,6 +178,7 @@ let test-paths = callPackage ./test-paths.nix { paths-out = [ "share/alsa/alsa.conf.d/50-pipewire.conf" + "nix-support/etc/pipewire/client-rt.conf.json" "nix-support/etc/pipewire/client.conf.json" "nix-support/etc/pipewire/jack.conf.json" "nix-support/etc/pipewire/pipewire.conf.json" -- cgit 1.4.1 From eb7e40f9c9bbf0d9f54d0a65722480abcd28c9d0 Mon Sep 17 00:00:00 2001 From: arcnmx Date: Mon, 28 Jun 2021 11:06:44 -0700 Subject: pipewire: 0.3.30 -> 0.3.31 --- nixos/modules/services/desktops/pipewire/jack.conf.json | 2 +- .../libraries/pipewire/0055-pipewire-media-session-path.patch | 7 ++----- .../libraries/pipewire/0090-pipewire-config-template-paths.patch | 8 ++++---- pkgs/development/libraries/pipewire/default.nix | 9 +++++++-- 4 files changed, 14 insertions(+), 12 deletions(-) (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/jack.conf.json b/nixos/modules/services/desktops/pipewire/jack.conf.json index a6bd3491785..e36e04fffcf 100644 --- a/nixos/modules/services/desktops/pipewire/jack.conf.json +++ b/nixos/modules/services/desktops/pipewire/jack.conf.json @@ -7,7 +7,7 @@ }, "context.modules": [ { - "name": "libpipewire-module-rtkit", + "name": "libpipewire-module-rt", "args": {}, "flags": [ "ifexists", diff --git a/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch b/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch index be6683c3e7b..8290aec5dfc 100644 --- a/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch +++ b/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch @@ -2,16 +2,13 @@ diff --git a/meson_options.txt b/meson_options.txt index 93b5e2a9..1b915ac3 100644 --- a/meson_options.txt +++ b/meson_options.txt -@@ -13,6 +13,9 @@ option('media-session', - description: 'Build and install pipewire-media-session', +@@ -200,3 +200,6 @@ option('media-session', type: 'feature', value: 'auto') +option('media-session-prefix', + description: 'Install directory for pipewire-media-session and its support files', + type: 'string') - option('man', - description: 'Build manpages', - type: 'feature', + option('session-managers', diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build index 1edebb2d..251270eb 100644 --- a/src/daemon/systemd/user/meson.build diff --git a/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch b/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch index 966cb957977..1f1a98780e9 100644 --- a/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch +++ b/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch @@ -6,8 +6,8 @@ index bbafa134..227d3e06 100644 # access.allowed to list an array of paths of allowed # apps. #access.allowed = [ -- # @media_session_path@ -+ # +- # @session_manager_path@ ++ # #] # An array of rejected paths. @@ -15,8 +15,8 @@ index bbafa134..227d3e06 100644 # but it is better to start it as a systemd service. # Run the session manager with -h for options. # -- @comment@{ path = "@media_session_path@" args = "" } -+ @comment@{ path = "" args = "" } +- @comment@{ path = "@session_manager_path@" args = "@session_manager_args@" } ++ @comment@{ path = "" args = "@session_manager_args@" } # # You can optionally start the pulseaudio-server here as well # but it is better to start it as a systemd service. diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index 8504d266984..823ed69f066 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -14,6 +14,7 @@ , dbus , alsa-lib , libjack2 +, libusb1 , udev , libva , libsndfile @@ -43,10 +44,11 @@ let }; mesonEnable = b: if b then "enabled" else "disabled"; + mesonList = l: "[" + lib.concatStringsSep "," l + "]"; self = stdenv.mkDerivation rec { pname = "pipewire"; - version = "0.3.30"; + version = "0.3.31"; outputs = [ "out" @@ -64,7 +66,7 @@ let owner = "pipewire"; repo = "pipewire"; rev = version; - sha256 = "sha256-DnaPvZoDaegjtJNKBmCJEAZe5FQBnSER79FPnxiWQUE="; + sha256 = "1dirz69ami7bcgy6hhh0ffi9gzwcy9idg94nvknwvwkjw4zm8m79"; }; patches = [ @@ -96,6 +98,7 @@ let dbus glib libjack2 + libusb1 libsndfile ncurses udev @@ -122,6 +125,7 @@ let "-Dmedia-session-prefix=${placeholder "mediaSession"}" "-Dlibjack-path=${placeholder "jack"}/lib" "-Dlibcamera=disabled" + "-Droc=disabled" "-Dlibpulse=${mesonEnable pulseTunnelSupport}" "-Davahi=${mesonEnable zeroconfSupport}" "-Dgstreamer=${mesonEnable gstreamerSupport}" @@ -133,6 +137,7 @@ let "-Dbluez5-backend-hsphfpd=${mesonEnable hsphfpdSupport}" "-Dsysconfdir=/etc" "-Dpipewire_confdata_dir=${placeholder "lib"}/share/pipewire" + "-Dsession-managers=${mesonList (lib.optional withMediaSession "media-session")}" ]; FONTCONFIG_FILE = fontsConf; # Fontconfig error: Cannot load default config file -- cgit 1.4.1 From ef532a04436001249a7c24e13c628e970791dc7f Mon Sep 17 00:00:00 2001 From: arcnmx Date: Mon, 28 Jun 2021 11:07:38 -0700 Subject: nixos/pipewire: add bluez hardware database --- .../desktops/pipewire/bluez-hardware.conf.json | 197 +++++++++++++++++++++ .../desktops/pipewire/pipewire-media-session.nix | 6 + pkgs/development/libraries/pipewire/default.nix | 1 + 3 files changed, 204 insertions(+) create mode 100644 nixos/modules/services/desktops/pipewire/bluez-hardware.conf.json (limited to 'nixos/modules/services/desktops/pipewire') diff --git a/nixos/modules/services/desktops/pipewire/bluez-hardware.conf.json b/nixos/modules/services/desktops/pipewire/bluez-hardware.conf.json new file mode 100644 index 00000000000..7c527b29215 --- /dev/null +++ b/nixos/modules/services/desktops/pipewire/bluez-hardware.conf.json @@ -0,0 +1,197 @@ +{ + "bluez5.features.device": [ + { + "name": "Air 1 Plus", + "no-features": [ + "hw-volume-mic" + ] + }, + { + "name": "AirPods", + "no-features": [ + "msbc-alt1", + "msbc-alt1-rtl" + ] + }, + { + "name": "AirPods Pro", + "no-features": [ + "msbc-alt1", + "msbc-alt1-rtl" + ] + }, + { + "name": "AXLOIE Goin", + "no-features": [ + "msbc-alt1", + "msbc-alt1-rtl" + ] + }, + { + "name": "JBL Endurance RUN BT", + "no-features": [ + "msbc-alt1", + "msbc-alt1-rtl", + "sbc-xq" + ] + }, + { + "name": "JBL LIVE650BTNC" + }, + { + "name": "Soundcore Life P2-L", + "no-features": [ + "msbc-alt1", + "msbc-alt1-rtl" + ] + }, + { + "name": "Urbanista Stockholm Plus", + "no-features": [ + "msbc-alt1", + "msbc-alt1-rtl" + ] + }, + { + "address": "~^94:16:25:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^9c:64:8b:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^a0:e9:db:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^0c:a6:94:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^00:14:02:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^44:5e:f3:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^d4:9c:28:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^00:18:6b:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^b8:ad:3e:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^a0:e9:db:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^00:24:1c:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^00:11:b1:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^a4:15:66:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^00:14:f1:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^00:26:7e:", + "no-features": [ + "hw-volume" + ] + }, + { + "address": "~^90:03:b7:", + "no-features": [ + "hw-volume" + ] + } + ], + "bluez5.features.adapter": [ + { + "bus-type": "usb", + "vendor-id": "usb:0bda" + }, + { + "bus-type": "usb", + "no-features": [ + "msbc-alt1-rtl" + ] + }, + { + "no-features": [ + "msbc-alt1-rtl" + ] + } + ], + "bluez5.features.kernel": [ + { + "sysname": "Linux", + "release": "~^[0-4]\\.", + "no-features": [ + "msbc-alt1", + "msbc-alt1-rtl" + ] + }, + { + "sysname": "Linux", + "release": "~^5\\.[1-7]\\.", + "no-features": [ + "msbc-alt1", + "msbc-alt1-rtl" + ] + }, + { + "sysname": "Linux", + "release": "~^5\\.(8|9|10)\\.", + "no-features": [ + "msbc-alt1" + ] + }, + { + "no-features": [] + } + ] +} diff --git a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix index 17a2d49bb1f..41ab995e329 100644 --- a/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix +++ b/nixos/modules/services/desktops/pipewire/pipewire-media-session.nix @@ -15,6 +15,7 @@ let defaults = { alsa-monitor = (builtins.fromJSON (builtins.readFile ./alsa-monitor.conf.json)); bluez-monitor = (builtins.fromJSON (builtins.readFile ./bluez-monitor.conf.json)); + bluez-hardware = (builtins.fromJSON (builtins.readFile ./bluez-hardware.conf.json)); media-session = (builtins.fromJSON (builtins.readFile ./media-session.conf.json)); v4l2-monitor = (builtins.fromJSON (builtins.readFile ./v4l2-monitor.conf.json)); }; @@ -22,6 +23,7 @@ let configs = { alsa-monitor = recursiveUpdate defaults.alsa-monitor cfg.config.alsa-monitor; bluez-monitor = recursiveUpdate defaults.bluez-monitor cfg.config.bluez-monitor; + bluez-hardware = defaults.bluez-hardware; media-session = recursiveUpdate defaults.media-session cfg.config.media-session; v4l2-monitor = recursiveUpdate defaults.v4l2-monitor cfg.config.v4l2-monitor; }; @@ -120,6 +122,10 @@ in { mkIf config.services.pipewire.pulse.enable { source = json.generate "bluez-monitor.conf" configs.bluez-monitor; }; + environment.etc."pipewire/media-session.d/bluez-hardware.conf" = + mkIf config.services.pipewire.pulse.enable { + source = json.generate "bluez-hardware.conf" configs.bluez-hardware; + }; environment.etc."pipewire/media-session.d/with-jack" = mkIf config.services.pipewire.jack.enable { diff --git a/pkgs/development/libraries/pipewire/default.nix b/pkgs/development/libraries/pipewire/default.nix index 823ed69f066..5f32216737e 100644 --- a/pkgs/development/libraries/pipewire/default.nix +++ b/pkgs/development/libraries/pipewire/default.nix @@ -192,6 +192,7 @@ let paths-out-media-session = [ "nix-support/etc/pipewire/media-session.d/alsa-monitor.conf.json" "nix-support/etc/pipewire/media-session.d/bluez-monitor.conf.json" + "nix-support/etc/pipewire/media-session.d/bluez-hardware.conf.json" "nix-support/etc/pipewire/media-session.d/media-session.conf.json" "nix-support/etc/pipewire/media-session.d/v4l2-monitor.conf.json" ]; -- cgit 1.4.1