diff options
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/pipewire')
10 files changed, 464 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..276ad6b8c492 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0.2.nix @@ -0,0 +1,49 @@ +{ lib, stdenv, fetchFromGitHub, meson, ninja, pkg-config, doxygen, graphviz, valgrind +, 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 valgrind + ]; + buildInputs = [ + glib dbus gst_all_1.gst-plugins-base gst_all_1.gstreamer + alsa-lib ffmpeg_4 libjack2 udev libva xorg.libX11 sbc SDL2 + ]; + + 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; [ jtojnar ]; + }; +} 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..fd7d031ee0fe --- /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 66791f3a..93b5e2a9 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -172,6 +172,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 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', 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/nixpkgs/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch b/nixpkgs/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch new file mode 100644 index 000000000000..8290aec5dfc4 --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/0055-pipewire-media-session-path.patch @@ -0,0 +1,24 @@ +diff --git a/meson_options.txt b/meson_options.txt +index 93b5e2a9..1b915ac3 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -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('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 ++++ b/src/daemon/systemd/user/meson.build +@@ -10,7 +10,7 @@ install_data( + systemd_config = configuration_data() + 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/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..926de3062546 --- /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 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 = 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 1b915ac3..85beb86a 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -29,6 +29,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..1f1a98780e9c --- /dev/null +++ b/nixpkgs/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 = [ +- # @session_manager_path@ ++ # <session_manager_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 = "@session_manager_path@" args = "@session_manager_args@" } ++ @comment@{ path = "<session_manager_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. + # 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 = "<pipewire_path>" args = "-c pipewire-pulse.conf" } + ] diff --git a/nixpkgs/pkgs/development/libraries/pipewire/default.nix b/nixpkgs/pkgs/development/libraries/pipewire/default.nix new file mode 100644 index 000000000000..5f32216737ef --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/default.nix @@ -0,0 +1,216 @@ +{ stdenv +, lib +, fetchFromGitLab +, removeReferencesTo +, python3 +, meson +, ninja +, systemd +, pkg-config +, doxygen +, graphviz +, valgrind +, glib +, dbus +, alsa-lib +, libjack2 +, libusb1 +, udev +, libva +, libsndfile +, SDL2 +, vulkan-headers +, vulkan-loader +, webrtc-audio-processing +, ncurses +, makeFontsConf +, callPackage +, nixosTests +, withMediaSession ? true +, gstreamerSupport ? true, gst_all_1 ? null +, ffmpegSupport ? true, ffmpeg ? null +, bluezSupport ? true, bluez ? null, sbc ? null, libopenaptx ? null, ldacbt ? null, fdk_aac ? null +, nativeHspSupport ? true +, nativeHfpSupport ? true +, ofonoSupport ? true +, hsphfpdSupport ? true +, pulseTunnelSupport ? true, libpulseaudio ? null +, zeroconfSupport ? true, avahi ? null +}: + +let + fontsConf = makeFontsConf { + fontDirectories = []; + }; + + mesonEnable = b: if b then "enabled" else "disabled"; + mesonList = l: "[" + lib.concatStringsSep "," l + "]"; + + self = stdenv.mkDerivation rec { + pname = "pipewire"; + version = "0.3.31"; + + outputs = [ + "out" + "lib" + "pulse" + "jack" + "dev" + "doc" + "mediaSession" + "installedTests" + ]; + + src = fetchFromGitLab { + domain = "gitlab.freedesktop.org"; + owner = "pipewire"; + repo = "pipewire"; + rev = version; + sha256 = "1dirz69ami7bcgy6hhh0ffi9gzwcy9idg94nvknwvwkjw4zm8m79"; + }; + + 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 + # 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 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 = [ + doxygen + graphviz + meson + ninja + pkg-config + python3 + ]; + + buildInputs = [ + alsa-lib + dbus + glib + libjack2 + libusb1 + libsndfile + ncurses + 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.optional pulseTunnelSupport libpulseaudio + ++ lib.optional zeroconfSupport avahi; + + mesonFlags = [ + "-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=enabled" + "-Dinstalled_test_prefix=${placeholder "installedTests"}" + "-Dpipewire_pulse_prefix=${placeholder "pulse"}" + "-Dmedia-session-prefix=${placeholder "mediaSession"}" + "-Dlibjack-path=${placeholder "jack"}/lib" + "-Dlibcamera=disabled" + "-Droc=disabled" + "-Dlibpulse=${mesonEnable pulseTunnelSupport}" + "-Davahi=${mesonEnable zeroconfSupport}" + "-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}" + "-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 + + doCheck = true; + + postUnpack = '' + patchShebangs source/doc/strip-static.sh + patchShebangs source/spa/tests/gen-cpp-test.py + ''; + + postInstall = '' + pushd $lib/share + mkdir -p $out/nix-support/etc/pipewire + 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 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 "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" + + moveToOutput "share/systemd/user/pipewire-pulse.*" "$pulse" + moveToOutput "lib/systemd/user/pipewire-pulse.*" "$pulse" + moveToOutput "bin/pipewire-pulse" "$pulse" + ''; + + 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-rt.conf.json" + "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/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" + ]; + paths-lib = [ + "lib/alsa-lib/libasound_module_pcm_pipewire.so" + "share/alsa-card-profile/mixer" + ]; + }; + }; + }; + + meta = with lib; { + description = "Server and user space API to deal with multimedia pipelines"; + homepage = "https://pipewire.org/"; + license = licenses.mit; + platforms = platforms.linux; + maintainers = with maintainers; [ jtojnar ]; + }; + }; + +in self diff --git a/nixpkgs/pkgs/development/libraries/pipewire/test-paths.nix b/nixpkgs/pkgs/development/libraries/pipewire/test-paths.nix new file mode 100644 index 000000000000..939b79686e3f --- /dev/null +++ b/nixpkgs/pkgs/development/libraries/pipewire/test-paths.nix @@ -0,0 +1,24 @@ +{ lib, runCommand, pipewire, paths-out, paths-lib, paths-out-media-session }: + +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.mediaSession paths-out-media-session} + ${check-output pipewire.lib paths-lib} + ${check-output pipewire paths-out} + + if [[ -n "$error" ]]; then + exit 1 + fi +'' diff --git a/nixpkgs/pkgs/development/libraries/pipewire/update.sh b/nixpkgs/pkgs/development/libraries/pipewire/update.sh new file mode 100755 index 000000000000..6d0088c206cb --- /dev/null +++ b/nixpkgs/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 |