summary refs log tree commit diff
diff options
context:
space:
mode:
authorJan Tojnar <jtojnar@gmail.com>2020-10-24 00:05:33 +0200
committerGitHub <noreply@github.com>2020-10-24 00:05:33 +0200
commit3a735434012d7f0b10ff299070e7958912691bcb (patch)
tree504daf3b8ce92803ffd8d90e1e3cb0c692612a93
parent582f622f6c82e8db2efc4d490e5945db177ed597 (diff)
parent4bca42a6ec4e442f1a3a4b781b1adb529bf049e0 (diff)
downloadnixpkgs-3a735434012d7f0b10ff299070e7958912691bcb.tar
nixpkgs-3a735434012d7f0b10ff299070e7958912691bcb.tar.gz
nixpkgs-3a735434012d7f0b10ff299070e7958912691bcb.tar.bz2
nixpkgs-3a735434012d7f0b10ff299070e7958912691bcb.tar.lz
nixpkgs-3a735434012d7f0b10ff299070e7958912691bcb.tar.xz
nixpkgs-3a735434012d7f0b10ff299070e7958912691bcb.tar.zst
nixpkgs-3a735434012d7f0b10ff299070e7958912691bcb.zip
Merge pull request #93725 from nglen/pipewire
-rw-r--r--nixos/modules/services/desktops/pipewire.nix72
-rw-r--r--nixos/tests/installed-tests/default.nix1
-rw-r--r--nixos/tests/installed-tests/pipewire.nix5
-rw-r--r--pkgs/development/libraries/pipewire/alsa-profiles-use-libdir.patch13
-rw-r--r--pkgs/development/libraries/pipewire/default.nix97
-rw-r--r--pkgs/development/libraries/pipewire/installed-tests-path.patch29
-rw-r--r--pkgs/development/libraries/pipewire/test-paths.nix23
7 files changed, 216 insertions, 24 deletions
diff --git a/nixos/modules/services/desktops/pipewire.nix b/nixos/modules/services/desktops/pipewire.nix
index 5aee59cfdcc..5179cbaf6bc 100644
--- a/nixos/modules/services/desktops/pipewire.nix
+++ b/nixos/modules/services/desktops/pipewire.nix
@@ -5,8 +5,22 @@ with lib;
 
 let
   cfg = config.services.pipewire;
-  packages = with pkgs; [ 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 "${pkgs.pipewire.jack}/lib" "$out/lib/pipewire"
+  '';
+  pulse-libs = pkgs.runCommand "pulse-libs" {} ''
+    mkdir -p "$out/lib"
+    ln -s "${pkgs.pipewire.pulse}/lib" "$out/lib/pipewire"
+  '';
 in {
 
   meta = {
@@ -25,17 +39,67 @@ in {
           Automatically run pipewire when connections are made to the pipewire socket.
         '';
       };
+
+      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 emulation";
+      };
     };
   };
 
 
   ###### implementation
   config = mkIf cfg.enable {
-    environment.systemPackages = packages;
+    assertions = [
+      {
+        assertion = cfg.pulse.enable -> !config.hardware.pulseaudio.enable;
+        message = "PipeWire based PulseAudio emulation doesn't use the PulseAudio service";
+      }
+      {
+        assertion = cfg.jack.enable -> !config.services.jack.jackd.enable;
+        message = "PIpeWire based JACK emulation doesn't use the JACK service";
+      }
+    ];
+
+    environment.systemPackages = [ pkgs.pipewire ]
+                                 ++ lib.optional cfg.jack.enable jack-libs
+                                 ++ lib.optional cfg.pulse.enable pulse-libs;
 
-    systemd.packages = packages;
+    systemd.packages = [ pkgs.pipewire ];
 
+    # 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.services.pipewire.bindsTo = [ "dbus.service" ];
+    services.udev.packages = [ pkgs.pipewire ];
 
+    # If any paths are updated here they must also be updated in the package test.
+    sound.extraConfig = mkIf cfg.alsa.enable ''
+      pcm_type.pipewire {
+        libs.native = ${pkgs.pipewire.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 ;"}
+      }
+      pcm.!default {
+        @func getenv
+        vars [ PCM ]
+        default "plug:pipewire"
+        playback_mode "-1"
+        capture_mode "-1"
+      }
+    '';
+    environment.etc."alsa/conf.d/50-pipewire.conf" = mkIf cfg.alsa.enable {
+      source = "${pkgs.pipewire}/share/alsa/alsa.conf.d/50-pipewire.conf";
+    };
+    environment.sessionVariables.LD_LIBRARY_PATH =
+      lib.optional (cfg.jack.enable || cfg.pulse.enable) "/run/current-system/sw/lib/pipewire";
+  };
 }
diff --git a/nixos/tests/installed-tests/default.nix b/nixos/tests/installed-tests/default.nix
index 889a00d4b56..50ca8ad2b50 100644
--- a/nixos/tests/installed-tests/default.nix
+++ b/nixos/tests/installed-tests/default.nix
@@ -101,5 +101,6 @@ in
   libxmlb = callInstalledTest ./libxmlb.nix {};
   malcontent = callInstalledTest ./malcontent.nix {};
   ostree = callInstalledTest ./ostree.nix {};
+  pipewire = callInstalledTest ./pipewire.nix {};
   xdg-desktop-portal = callInstalledTest ./xdg-desktop-portal.nix {};
 }
diff --git a/nixos/tests/installed-tests/pipewire.nix b/nixos/tests/installed-tests/pipewire.nix
new file mode 100644
index 00000000000..f4154b5d2fd
--- /dev/null
+++ b/nixos/tests/installed-tests/pipewire.nix
@@ -0,0 +1,5 @@
+{ pkgs, lib, makeInstalledTest, ... }:
+
+makeInstalledTest {
+  tested = pkgs.pipewire;
+}
diff --git a/pkgs/development/libraries/pipewire/alsa-profiles-use-libdir.patch b/pkgs/development/libraries/pipewire/alsa-profiles-use-libdir.patch
new file mode 100644
index 00000000000..c657d12f7d0
--- /dev/null
+++ b/pkgs/development/libraries/pipewire/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/default.nix b/pkgs/development/libraries/pipewire/default.nix
index cb5073f50c1..d8a58e6a8ea 100644
--- a/pkgs/development/libraries/pipewire/default.nix
+++ b/pkgs/development/libraries/pipewire/default.nix
@@ -1,89 +1,146 @@
 { stdenv
+, lib
 , fetchFromGitLab
 , fetchpatch
+, removeReferencesTo
 , meson
 , ninja
+, systemd
 , pkgconfig
 , doxygen
 , graphviz
 , valgrind
 , glib
 , dbus
-, gst_all_1
 , alsaLib
-, ffmpeg_3
 , libjack2
 , udev
 , libva
-, xorg
-, sbc
-, SDL2
 , libsndfile
-, bluez
 , vulkan-headers
 , vulkan-loader
 , libpulseaudio
 , makeFontsConf
+, callPackage
+, nixosTests
+, gstreamerSupport ? true, gst_all_1 ? null
+, ffmpegSupport ? true, ffmpeg ? null
+, bluezSupport ? true, bluez ? null, sbc ? null
+, nativeHspSupport ? true
+, ofonoSupport ? true
+, hsphfpdSupport ? false
 }:
 
 let
   fontsConf = makeFontsConf {
     fontDirectories = [];
   };
+
+  mesonBool = b: if b then "true" else "false";
 in
 stdenv.mkDerivation rec {
   pname = "pipewire";
-  version = "0.3.7";
+  version = "0.3.13";
 
-  outputs = [ "out" "lib" "dev" "doc" ];
+  outputs = [
+    "out"
+    "lib"
+    "pulse"
+    "jack"
+    "dev"
+    "doc"
+    "installedTests"
+  ];
 
   src = fetchFromGitLab {
     domain = "gitlab.freedesktop.org";
     owner = "pipewire";
     repo = "pipewire";
     rev = version;
-    sha256 = "04l66p0wj553gp2zf3vwwh6jbr1vkf6wrq4za9zlm9dn144am4j2";
+    sha256 = "19j5kmb7iaivkq2agfzncfm2qms41ckqi0ddxvhpc91ihwprdc5w";
   };
 
+  patches = [
+    # Break up a dependency cycle between outputs.
+    ./alsa-profiles-use-libdir.patch
+    # Move installed tests into their own output.
+    ./installed-tests-path.patch
+
+    # TODO Remove this on next update
+    # Fixes rpath referencecs.
+    (fetchpatch {
+      url = "https://gitlab.freedesktop.org/pipewire/pipewire/commit/2e3556fa128b778be62a7ffad5fbe78393035825.diff";
+      sha256 = "039yysb8j1aiqml54rxnaqfmzqz1b6m8sv5w3vz52grvav3kyr1l";
+    })
+  ];
+
   nativeBuildInputs = [
     doxygen
     graphviz
     meson
     ninja
     pkgconfig
-    valgrind
+    removeReferencesTo
   ];
 
   buildInputs = [
-    SDL2
     alsaLib
-    bluez
     dbus
-    ffmpeg_3
     glib
-    gst_all_1.gst-plugins-base
-    gst_all_1.gstreamer
     libjack2
     libpulseaudio
     libsndfile
-    libva
-    sbc
     udev
     vulkan-headers
     vulkan-loader
-    xorg.libX11
-  ];
+    valgrind
+    systemd
+  ] ++ lib.optionals gstreamerSupport [ gst_all_1.gst-plugins-base gst_all_1.gstreamer ]
+  ++ lib.optional ffmpegSupport ffmpeg
+  ++ lib.optionals bluezSupport [ bluez sbc ];
 
   mesonFlags = [
     "-Ddocs=true"
     "-Dman=false" # we don't have xmltoman
-    "-Dgstreamer=true"
+    "-Dexamples=true" # only needed for `pipewire-media-session`
+    "-Dudevrulesdir=lib/udev/rules.d"
+    "-Dinstalled_tests=true"
+    "-Dinstalled_test_prefix=${placeholder "installedTests"}"
+    "-Dlibpulse-path=${placeholder "pulse"}/lib"
+    "-Dlibjack-path=${placeholder "jack"}/lib"
+    "-Dgstreamer=${mesonBool gstreamerSupport}"
+    "-Dffmpeg=${mesonBool ffmpegSupport}"
+    "-Dbluez5=${mesonBool bluezSupport}"
+    "-Dbluez5-backend-native=${mesonBool nativeHspSupport}"
+    "-Dbluez5-backend-ofono=${mesonBool ofonoSupport}"
+    "-Dbluez5-backend-hsphfpd=${mesonBool hsphfpdSupport}"
   ];
 
   FONTCONFIG_FILE = fontsConf; # Fontconfig error: Cannot load default config file
 
   doCheck = true;
 
+  # Pulseaudio asserts lead to dev references.
+  # TODO This should be fixed in the pulseaudio sources instead.
+  preFixup = ''
+    remove-references-to -t ${libpulseaudio.dev} "$(readlink -f $pulse/lib/libpulse.so)"
+  '';
+
+  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"
+      ];
+      paths-lib = [
+        "lib/alsa-lib/libasound_module_pcm_pipewire.so"
+        "share/alsa-card-profile/mixer"
+      ];
+    };
+  };
+
   meta = with stdenv.lib; {
     description = "Server and user space API to deal with multimedia pipelines";
     homepage = "https://pipewire.org/";
diff --git a/pkgs/development/libraries/pipewire/installed-tests-path.patch b/pkgs/development/libraries/pipewire/installed-tests-path.patch
new file mode 100644
index 00000000000..2a92711626b
--- /dev/null
+++ b/pkgs/development/libraries/pipewire/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/test-paths.nix b/pkgs/development/libraries/pipewire/test-paths.nix
new file mode 100644
index 00000000000..0ae69374194
--- /dev/null
+++ b/pkgs/development/libraries/pipewire/test-paths.nix
@@ -0,0 +1,23 @@
+{ lib, runCommand, pipewire, paths-out, paths-lib }:
+
+let
+  check-path = output: path: ''
+    if [[ ! -f "${output}/${path}" && ! -d "${output}/${path}" ]]; then
+      printf "Missing: %s\n" "${output}/${path}" | tee -a $out
+      error=error
+    else
+      printf "Found: %s\n" "${output}/${path}" | tee -a $out
+    fi
+  '';
+
+  check-output = output: lib.concatMapStringsSep "\n" (check-path output);
+in runCommand "pipewire-test-paths" { } ''
+  touch $out
+
+  ${check-output pipewire.lib paths-lib}
+  ${check-output pipewire paths-out}
+
+  if [[ -n "$error" ]]; then
+    exit 1
+  fi
+''