Merge pull request #118154 from talyz/pipewire-media-session-fixes

nixos/pipewire: Use formats.json, stricter typing and break up extremely long lines
This commit is contained in:
Kim Lindberger 2021-04-01 23:00:20 +02:00 committed by GitHub
commit 11ac9ab827
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 56 deletions

View file

@ -4,6 +4,7 @@
with lib; with lib;
let let
json = pkgs.formats.json {};
cfg = config.services.pipewire.media-session; cfg = config.services.pipewire.media-session;
enable32BitAlsaPlugins = cfg.alsa.support32Bit enable32BitAlsaPlugins = cfg.alsa.support32Bit
&& pkgs.stdenv.isx86_64 && pkgs.stdenv.isx86_64
@ -17,24 +18,13 @@ let
media-session = (builtins.fromJSON (builtins.readFile ./media-session.conf.json)); media-session = (builtins.fromJSON (builtins.readFile ./media-session.conf.json));
v4l2-monitor = (builtins.fromJSON (builtins.readFile ./v4l2-monitor.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) ( configs = {
lib.sortProperties alsa-monitor = recursiveUpdate defaults.alsa-monitor cfg.config.alsa-monitor;
( bluez-monitor = recursiveUpdate defaults.bluez-monitor cfg.config.bluez-monitor;
lib.mapAttrsToList media-session = recursiveUpdate defaults.media-session cfg.config.media-session;
(k: v: lib.mkOrder (v._priority or 1000) "${lib.escape [ "=" ":" ] k} = ${mkSPAValueString (v._content or v)}") v4l2-monitor = recursiveUpdate defaults.v4l2-monitor cfg.config.v4l2-monitor;
attrs };
)
);
toSPAJSON = attrs: lib.concatStringsSep "\n" (mkSPAKeyValue attrs);
in { in {
meta = { meta = {
@ -62,7 +52,7 @@ in {
config = { config = {
media-session = mkOption { media-session = mkOption {
type = types.attrs; type = json.type;
description = '' description = ''
Configuration for the media session core. For details see 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 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 { alsa-monitor = mkOption {
type = types.attrs; type = json.type;
description = '' description = ''
Configuration for the alsa monitor. For details see 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 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 { bluez-monitor = mkOption {
type = types.attrs; type = json.type;
description = '' description = ''
Configuration for the bluez5 monitor. For details see 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 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 { v4l2-monitor = mkOption {
type = types.attrs; type = json.type;
description = '' description = ''
Configuration for the V4L2 monitor. For details see 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 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.packages = [ cfg.package ];
systemd.user.services.pipewire-media-session.wantedBy = [ "pipewire.service" ]; 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/media-session.conf" = {
environment.etc."pipewire/media-session.d/v4l2-monitor.conf" = { text = toSPAJSON (recursiveUpdate defaults.v4l2-monitor cfg.config.v4l2-monitor); }; 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/with-alsa" =
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); }; 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/with-pulseaudio" =
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); }; 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 = "";
};
}; };
} }

View file

@ -4,6 +4,7 @@
with lib; with lib;
let let
json = pkgs.formats.json {};
cfg = config.services.pipewire; cfg = config.services.pipewire;
enable32BitAlsaPlugins = cfg.alsa.support32Bit enable32BitAlsaPlugins = cfg.alsa.support32Bit
&& pkgs.stdenv.isx86_64 && pkgs.stdenv.isx86_64
@ -29,24 +30,13 @@ let
pipewire-pulse = builtins.fromJSON (builtins.readFile ./pipewire-pulse.conf.json); pipewire-pulse = builtins.fromJSON (builtins.readFile ./pipewire-pulse.conf.json);
}; };
# Helpers for generating the pipewire JSON config file configs = {
mkSPAValueString = v: client = recursiveUpdate defaults.client cfg.config.client;
if builtins.isList v then "[${lib.concatMapStringsSep " " mkSPAValueString v}]" client-rt = recursiveUpdate defaults.client-rt cfg.config.client-rt;
else if lib.types.attrs.check v then jack = recursiveUpdate defaults.jack cfg.config.jack;
"{${lib.concatStringsSep " " (mkSPAKeyValue v)}}" pipewire = recursiveUpdate defaults.pipewire cfg.config.pipewire;
else if builtins.isString v then "\"${lib.generators.mkValueStringDefault { } v}\"" pipewire-pulse = recursiveUpdate defaults.pipewire-pulse cfg.config.pipewire-pulse;
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 { in {
meta = { meta = {
@ -78,7 +68,7 @@ in {
config = { config = {
client = mkOption { client = mkOption {
type = types.attrs; type = json.type;
default = {}; default = {};
description = '' description = ''
Configuration for pipewire clients. For details see Configuration for pipewire clients. For details see
@ -87,7 +77,7 @@ in {
}; };
client-rt = mkOption { client-rt = mkOption {
type = types.attrs; type = json.type;
default = {}; default = {};
description = '' description = ''
Configuration for realtime pipewire clients. For details see Configuration for realtime pipewire clients. For details see
@ -96,7 +86,7 @@ in {
}; };
jack = mkOption { jack = mkOption {
type = types.attrs; type = json.type;
default = {}; default = {};
description = '' description = ''
Configuration for the pipewire daemon's jack module. For details see Configuration for the pipewire daemon's jack module. For details see
@ -105,7 +95,7 @@ in {
}; };
pipewire = mkOption { pipewire = mkOption {
type = types.attrs; type = json.type;
default = {}; default = {};
description = '' description = ''
Configuration for the pipewire daemon. For details see Configuration for the pipewire daemon. For details see
@ -114,7 +104,7 @@ in {
}; };
pipewire-pulse = mkOption { pipewire-pulse = mkOption {
type = types.attrs; type = json.type;
default = {}; default = {};
description = '' description = ''
Configuration for the pipewire-pulse daemon. For details see 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"; 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.conf" = {
environment.etc."pipewire/client-rt.conf" = { text = toSPAJSON (recursiveUpdate defaults.client-rt cfg.config.client-rt); }; source = json.generate "client.conf" configs.client;
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/client-rt.conf" = {
environment.etc."pipewire/pipewire-pulse.conf" = { text = toSPAJSON (recursiveUpdate defaults.pipewire-pulse cfg.config.pipewire-pulse); }; 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 = environment.sessionVariables.LD_LIBRARY_PATH =
lib.optional cfg.jack.enable "/run/current-system/sw/lib/pipewire"; lib.optional cfg.jack.enable "/run/current-system/sw/lib/pipewire";

View file

@ -75,6 +75,11 @@ let
./0070-installed-tests-path.patch ./0070-installed-tests-path.patch
# Add flag to specify configuration directory (different from the installation directory). # Add flag to specify configuration directory (different from the installation directory).
./0080-pipewire-config-dir.patch ./0080-pipewire-config-dir.patch
# Fix JSON parser.
(fetchpatch {
url = "https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/34800dc0191a4ee7a329eeb361a6f2ccf4a75176.diff";
sha256 = "0dzxzr408qqzf0252nwg14709p1lb2k826i3kdzg6djq8w98d5aj";
})
]; ];
nativeBuildInputs = [ nativeBuildInputs = [