about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/pipewire
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/pipewire')
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/0.2.nix54
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch13
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch27
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/0060-libjack-path.patch26
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch29
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch30
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch50
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/0095-spa-data-dir.patch12
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/default.nix250
-rw-r--r--nixpkgs/pkgs/development/libraries/pipewire/wireplumber.nix81
10 files changed, 572 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0.2.nix b/nixpkgs/pkgs/development/libraries/pipewire/0.2.nix
new file mode 100644
index 000000000000..cf2448bddfcb
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/0.2.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, doxygen, graphviz
+, glib, dbus, gst_all_1, alsa-lib, ffmpeg_4, libjack2, udev, libva, xorg
+, sbc, SDL2, makeFontsConf
+}:
+
+let
+  fontsConf = makeFontsConf {
+    fontDirectories = [ ];
+  };
+in stdenv.mkDerivation rec {
+  pname = "pipewire";
+  version = "0.2.7";
+
+  src = fetchFromGitHub {
+    owner = "PipeWire";
+    repo = "pipewire";
+    rev = version;
+    sha256 = "1q5wrqnhhs6r49p8yvkw1pl0cnsd4rndxy4h5lvdydwgf1civcwc";
+  };
+
+  outputs = [ "out" "lib" "dev" "doc" ];
+
+  nativeBuildInputs = [
+    meson ninja pkg-config doxygen graphviz
+  ];
+  buildInputs = [
+    glib dbus gst_all_1.gst-plugins-base gst_all_1.gstreamer
+    alsa-lib ffmpeg_4 libjack2 udev libva xorg.libX11 sbc SDL2
+  ];
+
+  # Workaround build on gcc-10+ and clang11+:
+  #  spa/plugins/bluez5/libspa-bluez5.so.p/bluez5-monitor.c.o:(.bss+0x0):
+  #    multiple definition of `spa_a2dp_sink_factory'
+  env.NIX_CFLAGS_COMPILE = toString [ "-fcommon" ];
+
+  mesonFlags = [
+    "-Ddocs=true"
+    "-Dgstreamer=enabled"
+  ];
+
+  PKG_CONFIG_SYSTEMD_SYSTEMDUSERUNITDIR = "${placeholder "out"}/lib/systemd/user";
+
+  FONTCONFIG_FILE = fontsConf; # Fontconfig error: Cannot load default config file
+
+  doCheck = true;
+
+  meta = with lib; {
+    description = "Server and user space API to deal with multimedia pipelines";
+    homepage = "https://pipewire.org/";
+    license = licenses.lgpl21;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch b/nixpkgs/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch
new file mode 100644
index 000000000000..fab89c4ffd93
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/0040-alsa-profiles-use-libdir.patch
@@ -0,0 +1,13 @@
+diff --git a/meson.build b/meson.build
+index 99a4b2d1..d4a4cda7 100644
+--- a/meson.build
++++ b/meson.build
+@@ -55,7 +55,7 @@ endif
+ 
+ spa_plugindir = pipewire_libdir / spa_name
+ 
+-alsadatadir = pipewire_datadir / 'alsa-card-profile' / 'mixer'
++alsadatadir = pipewire_libdir / '..' / 'share' / 'alsa-card-profile' / 'mixer'
+ 
+ pipewire_headers_dir = pipewire_name / 'pipewire'
+ 
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch b/nixpkgs/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch
new file mode 100644
index 000000000000..230f1b30394a
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/0050-pipewire-pulse-path.patch
@@ -0,0 +1,27 @@
+diff --git a/meson_options.txt b/meson_options.txt
+index 961ae2a76..692b84dfd 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -179,6 +179,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-system-unit-dir',
+        type : 'string',
+        description : 'Directory for system systemd units (defaults to /usr/lib/systemd/system)')
+diff --git a/src/daemon/systemd/user/meson.build b/src/daemon/systemd/user/meson.build
+index d17f3794f..34afe4f1a 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', 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')
+ 
+ configure_file(input : 'pipewire.service.in',
+                output : 'pipewire.service',
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0060-libjack-path.patch b/nixpkgs/pkgs/development/libraries/pipewire/0060-libjack-path.patch
new file mode 100644
index 000000000000..7fde3dbb8faa
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/0060-libjack-path.patch
@@ -0,0 +1,26 @@
+diff --git a/src/modules/meson.build b/src/modules/meson.build
+index 5d2dc9984..35f5773aa 100644
+--- a/src/modules/meson.build
++++ b/src/modules/meson.build
+@@ -169,6 +169,7 @@ if build_module_jack_tunnel
+     install_dir : modules_install_dir,
+     install_rpath: modules_install_dir,
+     dependencies : [mathlib, dl_lib, pipewire_dep],
++    c_args: '-DNIXPKGS_LIBJACK_PATH="@0@"'.format(jack_dep.get_variable('libdir'))
+   )
+   build_module_jackdbus_detect = dbus_dep.found()
+   if build_module_jackdbus_detect
+diff --git a/src/modules/module-jack-tunnel/weakjack.h b/src/modules/module-jack-tunnel/weakjack.h
+index 42580f798..e7aadd3cc 100644
+--- a/src/modules/module-jack-tunnel/weakjack.h
++++ b/src/modules/module-jack-tunnel/weakjack.h
+@@ -164,8 +164,7 @@ static inline int weakjack_load(struct weakjack *jack, const char *lib)
+ 
+ 		search_dirs = getenv("LIBJACK_PATH");
+ 		if (!search_dirs)
+-			search_dirs = PREFIX "/lib64/:" PREFIX "/lib/:"
+-				"/usr/lib64/:/usr/lib/:" LIBDIR;
++			search_dirs = NIXPKGS_LIBJACK_PATH;
+ 
+ 		while ((p = pw_split_walk(search_dirs, ":", &len, &state))) {
+ 			int pathlen;
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch b/nixpkgs/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch
new file mode 100644
index 000000000000..b2bcb421befb
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/0070-installed-tests-path.patch
@@ -0,0 +1,29 @@
+diff --git a/meson.build b/meson.build
+index 2107c19ec..20ccdfd9f 100644
+--- a/meson.build
++++ b/meson.build
+@@ -380,8 +380,8 @@ lilv_lib = dependency('lilv-0', required: get_option('lv2'))
+ summary({'lilv (for lv2 plugins)': lilv_lib.found()}, bool_yn: true)
+ cdata.set('HAVE_LILV', lilv_lib.found())
+ 
+-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 = get_option('installed_tests').allowed()
+ installed_tests_template = files('template.test.in')
+ 
+diff --git a/meson_options.txt b/meson_options.txt
+index 961ae2a76..a36e9e45f 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -22,6 +22,9 @@ option('installed_tests',
+        description: 'Install manual and automated test executables',
+        type: 'feature',
+        value: 'disabled')
++option('installed_test_prefix',
++       description: 'Prefix for installed tests',
++       type: 'string')
+ option('gstreamer',
+        description: 'Build GStreamer plugins',
+        type: 'feature',
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch b/nixpkgs/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch
new file mode 100644
index 000000000000..b8d8fcb0f905
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/0080-pipewire-config-dir.patch
@@ -0,0 +1,30 @@
+diff --git a/meson.build b/meson.build
+index b6b4553b..f21c29d8 100644
+--- a/meson.build
++++ b/meson.build
+@@ -37,7 +37,10 @@ pipewire_localedir = prefix / get_option('localedir')
+ pipewire_sysconfdir = prefix / get_option('sysconfdir')
+ 
+ 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 9bc33fcd..e4bd2dc1 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -61,6 +61,9 @@ option('jack-devel',
+ option('libjack-path',
+        description: 'Where to install the libjack.so library',
+        type: 'string')
++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/nixpkgs/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch b/nixpkgs/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch
new file mode 100644
index 000000000000..ca7d351257bf
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/0090-pipewire-config-template-paths.patch
@@ -0,0 +1,50 @@
+diff --git a/src/daemon/minimal.conf.in b/src/daemon/minimal.conf.in
+index 9c885a38f..c474eb45d 100644
+--- a/src/daemon/minimal.conf.in
++++ b/src/daemon/minimal.conf.in
+@@ -111,7 +111,7 @@ context.modules = [
+             # access.allowed to list an array of paths of allowed
+             # apps.
+             #access.allowed = [
+-            #    @session_manager_path@
++            #    <session_manager_path>
+             #]
+ 
+             # An array of rejected paths.
+@@ -359,5 +359,5 @@ context.exec = [
+     # It can be interesting to start another daemon here that listens
+     # on another address with the -a option (eg. -a tcp:4713).
+     #
+-    #@pulse_comment@{ path = "@pipewire_path@" args = "-c pipewire-pulse.conf" }
++    #@pulse_comment@{ path = "<pipewire_path>" args = "-c pipewire-pulse.conf" }
+ ]
+diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in
+index 697bf094d..3a7b54ddd 100644
+--- a/src/daemon/pipewire.conf.in
++++ b/src/daemon/pipewire.conf.in
+@@ -142,7 +142,7 @@ context.modules = [
+             # access.allowed to list an array of paths of allowed
+             # apps.
+             #access.allowed = [
+-            #    @session_manager_path@
++            #    <session_manager_path>
+             #]
+ 
+             # An array of rejected paths.
+@@ -294,7 +294,7 @@ context.exec = [
+     # but it is better to start it as a systemd service.
+     # Run the session manager with -h for options.
+     #
+-    @sm_comment@{ path = "@session_manager_path@" args = "@session_manager_args@"
++    @sm_comment@{ path = "<session_manager_path>" args = "@session_manager_args@"
+     @sm_comment@  condition = [ { exec.session-manager = null } { exec.session-manager = true } ] }
+     #
+     # You can optionally start the pulseaudio-server here as well
+@@ -302,6 +302,6 @@ context.exec = [
+     # It can be interesting to start another daemon here that listens
+     # on another address with the -a option (eg. -a tcp:4713).
+     #
+-    @pulse_comment@{ path = "@pipewire_path@" args = "-c pipewire-pulse.conf"
++    @pulse_comment@{ path = "<pipewire_path>" args = "-c pipewire-pulse.conf"
+     @pulse_comment@  condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] }
+ ]
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/0095-spa-data-dir.patch b/nixpkgs/pkgs/development/libraries/pipewire/0095-spa-data-dir.patch
new file mode 100644
index 000000000000..d8241a809f65
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/0095-spa-data-dir.patch
@@ -0,0 +1,12 @@
+diff --git a/meson.build b/meson.build
+index 56599ebd1..3bed2d3e3 100644
+--- a/meson.build
++++ b/meson.build
+@@ -54,7 +54,7 @@ else
+ endif
+ 
+ spa_plugindir = pipewire_libdir / spa_name
+-spa_datadir = pipewire_datadir / spa_name
++spa_datadir = pipewire_libdir / spa_name
+ 
+ alsadatadir = pipewire_datadir / 'alsa-card-profile' / 'mixer'
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/default.nix b/nixpkgs/pkgs/development/libraries/pipewire/default.nix
new file mode 100644
index 000000000000..1e66d1573fc5
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/default.nix
@@ -0,0 +1,250 @@
+{ stdenv
+, lib
+, buildPackages
+, fetchFromGitLab
+, fetchpatch
+, python3
+, meson
+, ninja
+, eudev
+, systemd
+, enableSystemd ? true
+, pkg-config
+, docutils
+, doxygen
+, graphviz
+, glib
+, dbus
+, alsa-lib
+, libjack2
+, libusb1
+, udev
+, libsndfile
+, vulkan-headers
+, vulkan-loader
+, webrtc-audio-processing
+, webrtc-audio-processing_1
+, ncurses
+, readline # meson can't find <7 as those versions don't have a .pc file
+, lilv
+, makeFontsConf
+, callPackage
+, nixosTests
+, withValgrind ? lib.meta.availableOn stdenv.hostPlatform valgrind
+, valgrind
+, libcameraSupport ? true
+, libcamera
+, libdrm
+, gstreamerSupport ? true
+, gst_all_1
+, ffmpegSupport ? true
+, ffmpeg
+, bluezSupport ? true
+, bluez
+, sbc
+, libfreeaptx
+, liblc3
+, fdk_aac
+, libopus
+, ldacbtSupport ? bluezSupport && lib.meta.availableOn stdenv.hostPlatform ldacbt
+, ldacbt
+, nativeHspSupport ? true
+, nativeHfpSupport ? true
+, nativeModemManagerSupport ? true
+, modemmanager
+, ofonoSupport ? true
+, hsphfpdSupport ? true
+, pulseTunnelSupport ? true
+, libpulseaudio
+, zeroconfSupport ? true
+, avahi
+, raopSupport ? true
+, openssl
+, rocSupport ? true
+, roc-toolkit
+, x11Support ? true
+, libcanberra
+, xorg
+, mysofaSupport ? true
+, libmysofa
+, tinycompress
+, ffadoSupport ? stdenv.buildPlatform.canExecute stdenv.hostPlatform
+, ffado
+}:
+
+# Bluetooth codec only makes sense if general bluetooth enabled
+assert ldacbtSupport -> bluezSupport;
+
+let
+  mesonEnableFeature = b: if b then "enabled" else "disabled";
+
+  self = stdenv.mkDerivation rec {
+    pname = "pipewire";
+    version = "0.3.80";
+
+    outputs = [
+      "out"
+      "lib"
+      "pulse"
+      "jack"
+      "dev"
+      "doc"
+      "man"
+      "installedTests"
+    ];
+
+    src = fetchFromGitLab {
+      domain = "gitlab.freedesktop.org";
+      owner = "pipewire";
+      repo = "pipewire";
+      rev = version;
+      sha256 = "sha256-6Ka83Bqd/nsfp8rv0GTBerpGP226MeZvC5u/j62FzP0=";
+    };
+
+    patches = [
+      # Break up a dependency cycle between outputs.
+      ./0040-alsa-profiles-use-libdir.patch
+      # Change the path of the pipewire-pulse binary in the service definition.
+      ./0050-pipewire-pulse-path.patch
+      # Load libjack from a known location
+      ./0060-libjack-path.patch
+      # Move installed tests into their own output.
+      ./0070-installed-tests-path.patch
+      # 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
+      # Place SPA data files in lib output to avoid dependency cycles
+      ./0095-spa-data-dir.patch
+
+      # backport fix for building with webrtc-audio-processing 0.3 on platforms where we don't have 1.x
+      (fetchpatch {
+        url = "https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/1f1c308c9766312e684f0b53fc2d1422c7414d31.patch";
+        hash = "sha256-ECM7/84G99yzXsg5A2DkFnXFGJSV9lz3vD0IRSzR8vU=";
+      })
+    ];
+
+    strictDeps = true;
+    nativeBuildInputs = [
+      docutils
+      doxygen
+      graphviz
+      meson
+      ninja
+      pkg-config
+      python3
+      glib
+    ];
+
+    buildInputs = [
+      alsa-lib
+      dbus
+      glib
+      libjack2
+      libusb1
+      libsndfile
+      lilv
+      ncurses
+      readline
+      udev
+      vulkan-headers
+      vulkan-loader
+      tinycompress
+    ] ++ (if enableSystemd then [ systemd ] else [ eudev ])
+    ++ (if lib.meta.availableOn stdenv.hostPlatform webrtc-audio-processing_1 then [ webrtc-audio-processing_1 ] else [ webrtc-audio-processing ])
+    ++ lib.optionals gstreamerSupport [ gst_all_1.gst-plugins-base gst_all_1.gstreamer ]
+    ++ lib.optionals libcameraSupport [ libcamera libdrm ]
+    ++ lib.optional ffmpegSupport ffmpeg
+    ++ lib.optionals bluezSupport [ bluez libfreeaptx liblc3 sbc fdk_aac libopus ]
+    ++ lib.optional ldacbtSupport ldacbt
+    ++ lib.optional nativeModemManagerSupport modemmanager
+    ++ lib.optional pulseTunnelSupport libpulseaudio
+    ++ lib.optional zeroconfSupport avahi
+    ++ lib.optional raopSupport openssl
+    ++ lib.optional rocSupport roc-toolkit
+    ++ lib.optionals x11Support [ libcanberra xorg.libX11 xorg.libXfixes ]
+    ++ lib.optional mysofaSupport libmysofa
+    ++ lib.optional ffadoSupport ffado;
+
+    # Valgrind binary is required for running one optional test.
+    nativeCheckInputs = lib.optional withValgrind valgrind;
+
+    mesonFlags = [
+      "-Ddocs=enabled"
+      "-Dudevrulesdir=lib/udev/rules.d"
+      "-Dinstalled_tests=enabled"
+      "-Dinstalled_test_prefix=${placeholder "installedTests"}"
+      "-Dpipewire_pulse_prefix=${placeholder "pulse"}"
+      "-Dlibjack-path=${placeholder "jack"}/lib"
+      "-Dlibv4l2-path=${placeholder "out"}/lib"
+      "-Dlibcamera=${mesonEnableFeature libcameraSupport}"
+      "-Dlibffado=${mesonEnableFeature ffadoSupport}"
+      "-Droc=${mesonEnableFeature rocSupport}"
+      "-Dlibpulse=${mesonEnableFeature pulseTunnelSupport}"
+      "-Davahi=${mesonEnableFeature zeroconfSupport}"
+      "-Dgstreamer=${mesonEnableFeature gstreamerSupport}"
+      "-Dsystemd-system-service=${mesonEnableFeature enableSystemd}"
+      "-Dudev=${mesonEnableFeature (!enableSystemd)}"
+      "-Dudevrulesdir=${placeholder "out"}/lib/udev/rules.d"
+      "-Dffmpeg=${mesonEnableFeature ffmpegSupport}"
+      "-Dbluez5=${mesonEnableFeature bluezSupport}"
+      "-Dbluez5-backend-hsp-native=${mesonEnableFeature nativeHspSupport}"
+      "-Dbluez5-backend-hfp-native=${mesonEnableFeature nativeHfpSupport}"
+      "-Dbluez5-backend-native-mm=${mesonEnableFeature nativeModemManagerSupport}"
+      "-Dbluez5-backend-ofono=${mesonEnableFeature ofonoSupport}"
+      "-Dbluez5-backend-hsphfpd=${mesonEnableFeature hsphfpdSupport}"
+      # source code is not easily obtainable
+      "-Dbluez5-codec-lc3plus=disabled"
+      "-Dbluez5-codec-lc3=${mesonEnableFeature bluezSupport}"
+      "-Dbluez5-codec-ldac=${mesonEnableFeature ldacbtSupport}"
+      "-Dsysconfdir=/etc"
+      "-Dpipewire_confdata_dir=${placeholder "lib"}/share/pipewire"
+      "-Draop=${mesonEnableFeature raopSupport}"
+      "-Dsession-managers="
+      "-Dvulkan=enabled"
+      "-Dx11=${mesonEnableFeature x11Support}"
+      "-Dx11-xfixes=${mesonEnableFeature x11Support}"
+      "-Dlibcanberra=${mesonEnableFeature x11Support}"
+      "-Dlibmysofa=${mesonEnableFeature mysofaSupport}"
+      "-Dsdl2=disabled" # required only to build examples, causes dependency loop
+      "-Drlimits-install=false" # installs to /etc, we won't use this anyway
+      "-Dcompress-offload=enabled"
+    ];
+
+    # Fontconfig error: Cannot load default config file
+    FONTCONFIG_FILE = makeFontsConf { fontDirectories = [ ]; };
+
+    doCheck = true;
+
+    postUnpack = ''
+      patchShebangs source/doc/input-filter.sh
+      patchShebangs source/doc/input-filter-h.sh
+    '';
+
+    postInstall = ''
+      ${lib.optionalString enableSystemd ''
+        moveToOutput "share/systemd/user/pipewire-pulse.*" "$pulse"
+        moveToOutput "lib/systemd/user/pipewire-pulse.*" "$pulse"
+      ''}
+
+      rm $out/bin/pipewire-pulse
+      mkdir -p $pulse/bin
+      ln -sf $out/bin/pipewire $pulse/bin/pipewire-pulse
+
+      moveToOutput "bin/pw-jack" "$jack"
+    '';
+
+    passthru.tests.installed-tests = nixosTests.installed-tests.pipewire;
+
+    meta = with lib; {
+      description = "Server and user space API to deal with multimedia pipelines";
+      changelog = "https://gitlab.freedesktop.org/pipewire/pipewire/-/releases/${version}";
+      homepage = "https://pipewire.org/";
+      license = licenses.mit;
+      platforms = platforms.linux;
+      maintainers = with maintainers; [ kranzes k900 ];
+    };
+  };
+
+in
+self
diff --git a/nixpkgs/pkgs/development/libraries/pipewire/wireplumber.nix b/nixpkgs/pkgs/development/libraries/pipewire/wireplumber.nix
new file mode 100644
index 000000000000..89cb4cf38f7e
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/pipewire/wireplumber.nix
@@ -0,0 +1,81 @@
+{ lib
+, stdenv
+, fetchFromGitLab
+, nix-update-script
+# base build deps
+, meson
+, pkg-config
+, ninja
+# docs build deps
+, python3
+, doxygen
+, graphviz
+# GI build deps
+, gobject-introspection
+# runtime deps
+, glib
+, systemd
+, lua5_4
+, pipewire
+# options
+, enableDocs ? true
+, enableGI ? true
+}:
+
+stdenv.mkDerivation rec {
+  pname = "wireplumber";
+  version = "0.4.15";
+
+  outputs = [ "out" "dev" ] ++ lib.optional enableDocs "doc";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.freedesktop.org";
+    owner = "pipewire";
+    repo = "wireplumber";
+    rev = version;
+    hash = "sha256-VwzpPAVfoaV47O7OjXtPQj5s8zfH5rkB22Pdlg7u5Fg=";
+  };
+
+  nativeBuildInputs = [
+    meson
+    pkg-config
+    ninja
+  ] ++ lib.optionals enableDocs [
+    graphviz
+  ] ++ lib.optionals enableGI [
+    gobject-introspection
+  ] ++ lib.optionals (enableDocs || enableGI) [
+    doxygen
+    (python3.pythonForBuild.withPackages (ps: with ps;
+      lib.optionals enableDocs [ sphinx sphinx-rtd-theme breathe ]
+      ++ lib.optionals enableGI [ lxml ]
+    ))
+  ];
+
+  buildInputs = [
+    glib
+    systemd
+    lua5_4
+    pipewire
+  ];
+
+  mesonFlags = [
+    (lib.mesonBool "system-lua" true)
+    (lib.mesonEnable "elogind" false)
+    (lib.mesonEnable "doc" enableDocs)
+    (lib.mesonEnable "introspection" enableGI)
+    (lib.mesonBool "systemd-system-service" true)
+    (lib.mesonOption "systemd-system-unit-dir" "${placeholder "out"}/lib/systemd/system")
+    (lib.mesonOption "sysconfdir" "/etc")
+  ];
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "A modular session / policy manager for PipeWire";
+    homepage = "https://pipewire.org";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ k900 ];
+  };
+}