diff --git a/media-video/pipewire/Manifest b/media-video/pipewire/Manifest new file mode 100644 index 0000000..d1440dc --- /dev/null +++ b/media-video/pipewire/Manifest @@ -0,0 +1 @@ +DIST pipewire-0.3.51.tar.gz 1789070 BLAKE2B 8538eb9f2178efa26365f30b324b707826e580caa1fd9c09b62c561c140c14186e0d2b04808fa78eb5642ddccf1a347def19934ecd654be06b215a693075b6fc SHA512 a762fd260b4b14ad9ef142be11ab1c22268da6726e2179559ffb254f0ce7daf7a502779e33c64313a9c6a9fc1bd15150b76be04ec81aa27c35dbb4333cecdb4a diff --git a/media-video/pipewire/files/99-pipewire-default-hook.conf b/media-video/pipewire/files/99-pipewire-default-hook.conf new file mode 100644 index 0000000..7145acc --- /dev/null +++ b/media-video/pipewire/files/99-pipewire-default-hook.conf @@ -0,0 +1,17 @@ +# Load pipewire configuration at conf hook processing time. This allows to +# override pulseaudio defaults configuration which is also applied via hook. +# +# Note since hooks are run after @GENTOO_PORTAGE_EPREFIX@/etc/asound.conf and ~/.asoundrc are applied, +# we load these again here make sure that user configuration takes precedence. + +@hooks [ + { + func load + files [ + "@GENTOO_PORTAGE_EPREFIX@/usr/share/alsa/alsa.conf.d/99-pipewire-default.conf" + "@GENTOO_PORTAGE_EPREFIX@/etc/asound.conf" + "~/.asoundrc" + ] + errors false + } +] diff --git a/media-video/pipewire/files/gentoo-pipewire-launcher.in b/media-video/pipewire/files/gentoo-pipewire-launcher.in new file mode 100644 index 0000000..495c47f --- /dev/null +++ b/media-video/pipewire/files/gentoo-pipewire-launcher.in @@ -0,0 +1,29 @@ +#!/bin/sh + +# PipeWire launcher script for XDG compliant desktops on OpenRC. +# +# systemd users are very _STRONGLY_ advised to use the much +# more reliable and predictable user units instead. + +# WARNING: This script assumes being run inside XDG compliant session, +# which means D-Bus session instance is expected to be correctly set up +# prior to this script starting. If that is not true, things may break! + +# Best to reap any existing daemons and only then try to start a new set. +pkill -u "${USER}" -x pipewire\|wireplumber 1>/dev/null 2>&1 + +# The core daemon which by itself does probably nothing. +@GENTOO_PORTAGE_EPREFIX@/usr/bin/pipewire & + +# The so called pipewire-pulse daemon used for PulseAudio compatibility. +# Commenting this out will stop the PA proxying daemon from starting, +# however ALSA (with pipewire-alsa), JACK (with jack-sdk) and PW API using +# clients will still have access to audio and may end up clashing with +# non-PW apps over HW control (most notably, /usr/bin/pulseaudio daemon). +@GENTOO_PORTAGE_EPREFIX@/usr/bin/pipewire -c pipewire-pulse.conf & + +# Hack for bug #822498 +sleep 1 + +# Finally a session manager is required for PipeWire to do anything. +exec @GENTOO_PORTAGE_EPREFIX@/usr/bin/wireplumber diff --git a/media-video/pipewire/files/pipewire-0.3.25-enable-failed-mlock-warning.patch b/media-video/pipewire/files/pipewire-0.3.25-enable-failed-mlock-warning.patch new file mode 100644 index 0000000..bdb43fe --- /dev/null +++ b/media-video/pipewire/files/pipewire-0.3.25-enable-failed-mlock-warning.patch @@ -0,0 +1,12 @@ +diff --git a/src/daemon/pipewire.conf.in b/src/daemon/pipewire.conf.in +--- a/src/daemon/pipewire.conf.in ++++ b/src/daemon/pipewire.conf.in +@@ -6,7 +6,7 @@ context.properties = { + #support.dbus = true + #link.max-buffers = 64 + link.max-buffers = 16 # version < 3 clients can't handle more +- #mem.warn-mlock = false ++ mem.warn-mlock = true # Gentoo should have good RLIMITs now + #mem.allow-mlock = true + #mem.mlock-all = false + #clock.power-of-two-quantum = true diff --git a/media-video/pipewire/files/pipewire-0.3.56-big-endian.patch b/media-video/pipewire/files/pipewire-0.3.56-big-endian.patch new file mode 100644 index 0000000..d7742d2 --- /dev/null +++ b/media-video/pipewire/files/pipewire-0.3.56-big-endian.patch @@ -0,0 +1,55 @@ +https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/aaa015d0c0c66b64c7198a34ad3c4b43445667d2 +https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/1a5ec4452fa21592eaeeb823ad95a1db6eb60376 +https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/f857fd46262b1a90ad94f86e34216a1a886d9463 + +From aaa015d0c0c66b64c7198a34ad3c4b43445667d2 Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Tue, 19 Jul 2022 13:06:52 +0200 +Subject: [PATCH] avb: fix compilation on big endian + +--- a/spa/plugins/avb/avbtp/packets.h ++++ b/spa/plugins/avb/avbtp/packets.h +@@ -116,7 +116,7 @@ struct spa_avbtp_packet_aaf { + unsigned gv:1; + unsigned tv:1; + +- uint8_t seq_number; ++ uint8_t seq_num; + + unsigned _r2:7; + unsigned tu:1; +GitLab +From 1a5ec4452fa21592eaeeb823ad95a1db6eb60376 Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Tue, 19 Jul 2022 13:49:42 +0200 +Subject: [PATCH] avb: fix compilation on big endian + +--- a/src/modules/module-avb/aaf.h ++++ b/src/modules/module-avb/aaf.h +@@ -35,7 +35,7 @@ struct avb_packet_aaf { + unsigned gv:1; + unsigned tv:1; + +- uint8_t seq_number; ++ uint8_t seq_num; + + unsigned _r2:7; + unsigned tu:1; +GitLab +From f857fd46262b1a90ad94f86e34216a1a886d9463 Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Tue, 19 Jul 2022 14:07:16 +0200 +Subject: [PATCH] avb: fix compilation on big endian + +--- a/src/modules/module-avb/iec61883.h ++++ b/src/modules/module-avb/iec61883.h +@@ -37,7 +37,7 @@ struct avb_packet_iec61883 { + unsigned gv:1; + unsigned tv:1; + +- uint8_t seq_number; ++ uint8_t seq_num; + + unsigned _r2:7; + unsigned tu:1; +GitLab diff --git a/media-video/pipewire/files/pipewire-0.3.59-filter-chain-alloc-port-data-handle.patch b/media-video/pipewire/files/pipewire-0.3.59-filter-chain-alloc-port-data-handle.patch new file mode 100644 index 0000000..bd066e3 --- /dev/null +++ b/media-video/pipewire/files/pipewire-0.3.59-filter-chain-alloc-port-data-handle.patch @@ -0,0 +1,87 @@ +https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/94a857550b566472e5ab51191e1b34098e5a9506 + +From 94a857550b566472e5ab51191e1b34098e5a9506 Mon Sep 17 00:00:00 2001 +From: Wim Taymans +Date: Mon, 3 Oct 2022 09:44:32 +0200 +Subject: [PATCH] filter-chain: alloc port data per handle. + +--- a/src/modules/module-filter-chain.c ++++ b/src/modules/module-filter-chain.c +@@ -1501,7 +1501,6 @@ static int load_node(struct graph *graph, struct spa_json *json) + bool have_config = false; + uint32_t i; + int res; +- float *data; + + while (spa_json_get_string(json, key, sizeof(key)) > 0) { + if (spa_streq("type", key)) { +@@ -1576,14 +1575,6 @@ static int load_node(struct graph *graph, struct spa_json *json) + port->idx = i; + port->external = SPA_ID_INVALID; + port->p = desc->output[i]; +- if ((data = port->audio_data[i]) == NULL) { +- data = calloc(1, MAX_SAMPLES * sizeof(float)); +- if (data == NULL) { +- pw_log_error("cannot create port data: %m"); +- return -errno; +- } +- } +- port->audio_data[i] = data; + spa_list_init(&port->link_list); + } + for (i = 0; i < desc->n_control; i++) { +@@ -1629,6 +1620,26 @@ static void node_cleanup(struct node *node) + } + } + ++static int port_ensure_data(struct port *port, uint32_t i) ++{ ++ float *data; ++ if ((data = port->audio_data[i]) == NULL) { ++ data = calloc(1, MAX_SAMPLES * sizeof(float)); ++ if (data == NULL) { ++ pw_log_error("cannot create port data: %m"); ++ return -errno; ++ } ++ } ++ port->audio_data[i] = data; ++ return 0; ++} ++ ++static void port_free_data(struct port *port, uint32_t i) ++{ ++ free(port->audio_data[i]); ++ port->audio_data[i] = NULL; ++} ++ + static void node_free(struct node *node) + { + uint32_t i, j; +@@ -1636,7 +1647,7 @@ static void node_free(struct node *node) + spa_list_remove(&node->link); + for (i = 0; i < node->n_hndl; i++) { + for (j = 0; j < node->desc->n_output; j++) +- free(node->output_port[j].audio_data[i]); ++ port_free_data(&node->output_port[j], i); + } + node_cleanup(node); + descriptor_unref(node->desc); +@@ -1688,6 +1699,8 @@ static int graph_instantiate(struct graph *graph) + + spa_list_for_each(link, &port->link_list, input_link) { + struct port *peer = link->output; ++ if ((res = port_ensure_data(peer, i)) < 0) ++ goto error; + pw_log_info("connect input port %s[%d]:%s %p", + node->name, i, d->ports[port->p].name, + peer->audio_data[i]); +@@ -1696,6 +1709,8 @@ static int graph_instantiate(struct graph *graph) + } + for (j = 0; j < desc->n_output; j++) { + port = &node->output_port[j]; ++ if ((res = port_ensure_data(port, i)) < 0) ++ goto error; + pw_log_info("connect output port %s[%d]:%s %p", + node->name, i, d->ports[port->p].name, + port->audio_data[i]); +GitLab diff --git a/media-video/pipewire/files/pipewire.desktop b/media-video/pipewire/files/pipewire.desktop new file mode 100644 index 0000000..d3786e7 --- /dev/null +++ b/media-video/pipewire/files/pipewire.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name[de]=PipeWire Mediensystem +Name=PipeWire Media System +Comment[de]=Das PipeWire Mediensystem starten +Comment=Start the PipeWire Media System +Exec=/usr/libexec/pipewire-launcher +Terminal=false +Type=Application +X-GNOME-HiddenUnderSystemd=true +X-KDE-HiddenUnderSystemd=true +X-systemd-skip=true diff --git a/media-video/pipewire/files/pipewire.desktop-r1 b/media-video/pipewire/files/pipewire.desktop-r1 new file mode 100644 index 0000000..d950312 --- /dev/null +++ b/media-video/pipewire/files/pipewire.desktop-r1 @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name[de]=PipeWire Mediensystem +Name=PipeWire Media System +Comment[de]=Das PipeWire Mediensystem starten +Comment=Start the PipeWire Media System +Exec=/usr/bin/gentoo-pipewire-launcher +Terminal=false +Type=Application +X-GNOME-HiddenUnderSystemd=true +X-KDE-HiddenUnderSystemd=true +X-systemd-skip=true diff --git a/media-video/pipewire/metadata.xml b/media-video/pipewire/metadata.xml new file mode 100644 index 0000000..e067487 --- /dev/null +++ b/media-video/pipewire/metadata.xml @@ -0,0 +1,30 @@ + + + + + gnome@gentoo.org + Gentoo GNOME Desktop + + + sam@gentoo.org + Sam James + + + https://gitlab.freedesktop.org/pipewire/pipewire/-/issues + https://gitlab.freedesktop.org/pipewire/pipewire/-/releases + https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home + + + Enable WebRTC-based echo canceller via media-libs/webrtc-audio-processing + Build pw-cat/pw-play/pw-record + Enable Flatpak support + Install a plugin for running PipeWire as a JACK client + Use PipeWire as JACK replacement + Allow loading LV2 plugins via media-libs/lv2 + Replace PulseAudio's ALSA plugin with PipeWire's plugin + Enable raop-sink support (needs dev-libs/openssl) + Install systemd unit files for running as a system service. Not recommended. + Enable audible bell for X11 + Provide sound server using ALSA and bluetooth devices + + diff --git a/media-video/pipewire/pipewire-0.3.51-r2.ebuild b/media-video/pipewire/pipewire-0.3.51-r2.ebuild new file mode 100644 index 0000000..861f7c4 --- /dev/null +++ b/media-video/pipewire/pipewire-0.3.51-r2.ebuild @@ -0,0 +1,363 @@ +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +PYTHON_COMPAT=( python3_{8..10} ) + +inherit flag-o-matic meson-multilib optfeature prefix python-any-r1 systemd udev + +if [[ ${PV} == 9999 ]]; then + EGIT_REPO_URI="https://gitlab.freedesktop.org/${PN}/${PN}.git" + inherit git-r3 +else + if [[ ${PV} == *_p* ]] ; then + MY_COMMIT="" + SRC_URI="https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/${MY_COMMIT}/pipewire-${MY_COMMIT}.tar.bz2 -> ${P}.tar.bz2" + S="${WORKDIR}"/${PN}-${MY_COMMIT} + else + SRC_URI="https://gitlab.freedesktop.org/${PN}/${PN}/-/archive/${PV}/${P}.tar.gz" + fi + + KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~sparc x86" +fi + +DESCRIPTION="Multimedia processing graphs" +HOMEPAGE="https://pipewire.org/" + +LICENSE="MIT LGPL-2.1+ GPL-2" +# ABI was broken in 0.3.42 for https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues/49 +SLOT="0/0.4" +IUSE="bluetooth doc echo-cancel extra gstreamer jack-client jack-sdk lv2 pipewire-alsa ssl system-service systemd test udev v4l X zeroconf" + +# Once replacing system JACK libraries is possible, it's likely that +# jack-client IUSE will need blocking to avoid users accidentally +# configuring their systems to send PW sink output to the emulated +# JACK's sink - doing so is likely to yield no audio, cause a CPU +# cycles consuming loop (and may even cause GUI crashes)! + +REQUIRED_USE=" + jack-sdk? ( !jack-client ) + system-service? ( systemd ) +" + +RESTRICT="!test? ( test )" + +BDEPEND=" + >=dev-util/meson-0.59 + virtual/pkgconfig + ${PYTHON_DEPS} + $(python_gen_any_dep 'dev-python/docutils[${PYTHON_USEDEP}]') + doc? ( + app-doc/doxygen + media-gfx/graphviz + ) +" +RDEPEND=" + acct-group/audio + media-libs/alsa-lib + sys-apps/dbus[${MULTILIB_USEDEP}] + sys-libs/readline:= + sys-libs/ncurses:=[unicode(+)] + virtual/libintl[${MULTILIB_USEDEP}] + bluetooth? ( + media-libs/fdk-aac + media-libs/libldac + media-libs/libfreeaptx + media-libs/sbc + >=net-wireless/bluez-4.101:= + virtual/libusb:1 + ) + echo-cancel? ( media-libs/webrtc-audio-processing:0 ) + extra? ( + >=media-libs/libsndfile-1.0.20 + ) + gstreamer? ( + >=dev-libs/glib-2.32.0:2 + >=media-libs/gstreamer-1.10.0:1.0 + media-libs/gst-plugins-base:1.0 + ) + jack-client? ( >=media-sound/jack2-1.9.10:2[dbus] ) + jack-sdk? ( + !media-sound/jack-audio-connection-kit + !media-sound/jack2 + ) + lv2? ( media-libs/lilv ) + pipewire-alsa? ( + >=media-libs/alsa-lib-1.1.7[${MULTILIB_USEDEP}] + ) + !pipewire-alsa? ( media-plugins/alsa-plugins[${MULTILIB_USEDEP},pulseaudio] ) + ssl? ( dev-libs/openssl:= ) + systemd? ( sys-apps/systemd ) + system-service? ( + acct-user/pipewire + acct-group/pipewire + ) + udev? ( virtual/libudev[${MULTILIB_USEDEP}] ) + v4l? ( media-libs/libv4l ) + X? ( + media-libs/libcanberra + x11-libs/libX11 + x11-libs/libXfixes + ) + zeroconf? ( net-dns/avahi ) +" + +DEPEND="${RDEPEND}" + +# TODO: Consider use cases where pipewire is not used for driving audio +# Doing so with WirePlumber currently involves editing Lua scripts +PDEPEND=">=media-video/wireplumber-0.4.8-r3" + +# Present RDEPEND that are currently always disabled due to the PW +# code using them being required to be disabled by Gentoo guidelines +# (i.e. developer binaries not meant for users) and unready code +# media-video/ffmpeg:= +# media-libs/libsdl2 +# >=media-libs/vulkan-loader-1.1.69 +# +# Ditto for DEPEND +# >=dev-util/vulkan-headers-1.1.69 + +DOCS=( {README,INSTALL}.md NEWS ) + +PATCHES=( + "${FILESDIR}"/${PN}-0.3.25-enable-failed-mlock-warning.patch +) + +# limitsdfile related code taken from =sys-auth/realtime-base-0.1 +# with changes as necessary. +limitsdfile=40-${PN}.conf + +python_check_deps() { + python_has_version "dev-python/docutils[${PYTHON_USEDEP}]" +} + +src_prepare() { + default + + einfo "Generating ${limitsdfile}" + cat > ${limitsdfile} <<- EOF || die + # Start of ${limitsdfile} from ${P} + + @audio - memlock 256 + + $(use system-service && { + echo @pipewire - rtprio 95 + echo @pipewire - nice -19 + echo @pipewire - memlock 4194304 + }) + + # End of ${limitsdfile} from ${P} + EOF +} + +multilib_src_configure() { + # https://bugs.gentoo.org/838301 + filter-flags -fno-semantic-interposition + + local emesonargs=( + -Ddocdir="${EPREFIX}"/usr/share/doc/${PF} + + $(meson_native_use_feature zeroconf avahi) + $(meson_native_use_feature doc docs) + $(meson_native_enabled examples) # TODO: Figure out if this is still important now that media-session gone + $(meson_native_enabled man) + $(meson_feature test tests) + -Dinstalled_tests=disabled # Matches upstream; Gentoo never installs tests + $(meson_native_use_feature gstreamer) + $(meson_native_use_feature gstreamer gstreamer-device-provider) + $(meson_native_use_feature systemd) + + $(meson_native_use_feature system-service systemd-system-service) + -Dsystemd-system-unit-dir="$(systemd_get_systemunitdir)" + -Dsystemd-user-unit-dir="$(systemd_get_userunitdir)" + + $(meson_native_use_feature systemd systemd-user-service) + $(meson_feature pipewire-alsa) # Allows integrating ALSA apps into PW graph + -Dspa-plugins=enabled + -Dalsa=enabled # Allows using kernel ALSA for sound I/O (NOTE: media-session is gone so IUSE=alsa/spa_alsa/alsa-backend might be possible) + -Daudiomixer=enabled # Matches upstream + -Daudioconvert=enabled # Matches upstream + $(meson_native_use_feature bluetooth bluez5) + $(meson_native_use_feature bluetooth bluez5-backend-hsp-native) + $(meson_native_use_feature bluetooth bluez5-backend-hfp-native) + $(meson_native_use_feature bluetooth bluez5-backend-ofono) + $(meson_native_use_feature bluetooth bluez5-backend-hsphfpd) + $(meson_native_use_feature bluetooth bluez5-codec-aac) + $(meson_native_use_feature bluetooth bluez5-codec-aptx) + $(meson_native_use_feature bluetooth bluez5-codec-ldac) + $(meson_native_use_feature bluetooth libusb) # At least for now only used by bluez5 native (quirk detection of adapters) + $(meson_native_use_feature echo-cancel echo-cancel-webrtc) #807889 + -Dcontrol=enabled # Matches upstream + -Daudiotestsrc=enabled # Matches upstream + -Dffmpeg=disabled # Disabled by upstream and no major developments to spa/plugins/ffmpeg/ since May 2020 + -Dpipewire-jack=enabled # Allows integrating JACK apps into PW graph + $(meson_native_use_feature jack-client jack) # Allows PW to act as a JACK client + $(meson_use jack-sdk jack-devel) + $(usex jack-sdk "-Dlibjack-path=${EPREFIX}/usr/$(get_libdir)" '') + -Dsupport=enabled # Miscellaneous/common plugins, such as null sink + -Devl=disabled # Matches upstream + -Dtest=disabled # fakesink and fakesource plugins + $(meson_native_use_feature lv2) + $(meson_native_use_feature v4l v4l2) + -Dlibcamera=disabled # libcamera is not in Portage tree + $(meson_native_use_feature ssl raop) + -Dvideoconvert=enabled # Matches upstream + -Dvideotestsrc=enabled # Matches upstream + -Dvolume=enabled # Matches upstream + -Dvulkan=disabled # Uses pre-compiled Vulkan compute shader to provide a CGI video source (dev thing; disabled by upstream) + $(meson_native_use_feature extra pw-cat) + $(meson_feature udev) + -Dudevrulesdir="${EPREFIX}$(get_udevdir)/rules.d" + -Dsdl2=disabled # Controls SDL2 dependent code (currently only examples when -Dinstalled_tests=enabled which we never install) + $(meson_native_use_feature extra sndfile) # Enables libsndfile dependent code (currently only pw-cat) + -Dsession-managers="[]" # All available session managers are now their own projects, so there's nothing to build + + # Just for bell sounds in X11 right now. + $(meson_native_use_feature X x11) + $(meson_native_use_feature X x11-xfixes) + $(meson_native_use_feature X libcanberra) + ) + + meson_src_configure +} + +multilib_src_install() { + # Our custom DOCS do not exist in multilib source directory + DOCS= meson_src_install +} + +multilib_src_install_all() { + einstalldocs + + insinto /etc/security/limits.d + doins ${limitsdfile} + + if use pipewire-alsa; then + dodir /etc/alsa/conf.d + + # Install pipewire conf loader hook + insinto /usr/share/alsa/alsa.conf.d + doins "${FILESDIR}"/99-pipewire-default-hook.conf + eprefixify "${ED}"/usr/share/alsa/alsa.conf.d/99-pipewire-default-hook.conf + + # These will break if someone has /etc that is a symbolic link to a subfolder! See #724222 + # And the current dosym8 -r implementation is likely affected by the same issue, too. + dosym ../../../usr/share/alsa/alsa.conf.d/50-pipewire.conf /etc/alsa/conf.d/50-pipewire.conf + dosym ../../../usr/share/alsa/alsa.conf.d/99-pipewire-default-hook.conf /etc/alsa/conf.d/99-pipewire-default-hook.conf + fi + + if ! use systemd; then + insinto /etc/xdg/autostart + newins "${FILESDIR}"/pipewire.desktop-r1 pipewire.desktop + + exeinto /usr/bin + newexe "${FILESDIR}"/gentoo-pipewire-launcher.in gentoo-pipewire-launcher + eprefixify "${ED}"/usr/bin/gentoo-pipewire-launcher + fi +} + +pkg_postinst() { + use udev && udev_reload + + elog "It is recommended to raise RLIMIT_MEMLOCK to 256 for users" + elog "using PipeWire. Do it either manually or add yourself" + elog "to the 'audio' group:" + elog + elog " usermod -aG audio " + elog + + if ! use jack-sdk; then + elog "JACK emulation is incomplete and not all programs will work. PipeWire's" + elog "alternative libraries have been installed to a non-default location." + elog "To use them, put pw-jack before every JACK application." + elog "When using pw-jack, do not run jackd/jackdbus. However, a virtual/jack" + elog "provider is still needed to compile the JACK applications themselves." + elog + fi + + if use systemd; then + elog "When switching from PulseAudio, you may need to disable PulseAudio:" + elog + elog " systemctl --user disable pulseaudio.service pulseaudio.socket" + elog + elog "To use PipeWire, the user units must be manually enabled" + elog "by running this command as each user you use for desktop activities:" + elog + elog " systemctl --user enable pipewire.socket pipewire-pulse.socket" + elog + elog "A reboot is recommended to avoid interferences from still running" + elog "PulseAudio daemon." + elog + elog "Both new users and those upgrading need to enable WirePlumber" + elog "for relevant users:" + elog + elog " systemctl --user disable pipewire-media-session.service" + elog " systemctl --user --force enable wireplumber.service" + elog + elog "Root user may replace --user with --global to change system default" + elog "configuration for all of the above commands." + else + ewarn "PipeWire daemon startup has been moved to a launcher script!" + ewarn "Make sure that ${EROOT}/etc/pipewire/pipewire.conf either does not exist or no" + ewarn "longer is set to start a session manager or PulseAudio compatibility daemon (all" + ewarn "lines similar to '{ path = /usr/bin/pipewire*' should be commented out)" + ewarn + ewarn "Those manually starting /usr/bin/pipewire via .xinitrc or similar _must_ from" + ewarn "now on start ${EROOT}/usr/bin/gentoo-pipewire-launcher instead! It is highly" + ewarn "advised that a D-Bus user session is set up before starting the script." + ewarn + if has_version 'media-sound/pulseaudio[daemon]' || has_version 'media-sound/pulseaudio-daemon'; then + elog "This ebuild auto-enables PulseAudio replacement. Because of that, users" + elog "are recommended to edit pulseaudio client configuration files:" + elog "${EROOT}/etc/pulse/client.conf and ${EROOT}/etc/pulse/client.conf.d/enable-autospawn.conf" + elog "if it exists, and disable autospawning of the original daemon by setting:" + elog + elog " autospawn = no" + elog + elog "Please note that the semicolon (;) must _NOT_ be at the beginning of the line!" + elog + elog "Alternatively, if replacing PulseAudio daemon is not desired, edit" + elog "${EROOT}/usr/bin/gentoo-pipewire-launcher by commenting out the relevant" + elog "command:" + elog + elog "#${EROOT}/usr/bin/pipewire -c pipewire-pulse.conf &" + elog + fi + elog "NOTE:" + elog "Starting with PipeWire-0.3.30, this package is no longer installing its config" + elog "into ${EROOT}/etc/pipewire by default. In case you need to change" + elog "its config, please start by copying default config from ${EROOT}/usr/share/pipewire" + elog "and just override the sections you want to change." + fi + elog + + elog "For latest tips and tricks, troubleshooting information and documentation" + elog "in general, please refer to https://wiki.gentoo.org/wiki/PipeWire" + elog + + optfeature_header "The following can be installed for optional runtime features:" + optfeature "restricted realtime capabilities via D-Bus" sys-auth/rtkit + + if has_version 'net-misc/ofono' ; then + ewarn "Native backend has become default. Please disable oFono via:" + if systemd_is_booted ; then + ewarn "systemctl disable ofono" + else + ewarn "rc-update delete ofono" + fi + ewarn + fi + + if use system-service; then + ewarn + ewarn "WARNING: you have enabled the system-service USE flag, which installs" + ewarn "the system-wide systemd units that enable PipeWire to run as a system" + ewarn "service. This is more than likely NOT what you want. You are strongly" + ewarn "advised not to enable this mode and instead stick with systemd user" + ewarn "units. The default configuration files will likely not work out of" + ewarn "box, and you are on your own with configuration." + ewarn + fi +} diff --git a/media-video/wireplumber/Manifest b/media-video/wireplumber/Manifest new file mode 100644 index 0000000..ece045d --- /dev/null +++ b/media-video/wireplumber/Manifest @@ -0,0 +1 @@ +DIST wireplumber-0.4.10.tar.gz 395588 BLAKE2B 6df1af17d1e53ab1449a2f6f9af5a0c4f7b1cd981e07556e5ea3c6b4d5d624e66b97ce4f945f7ccccebbf72b75d35d10990fac11b5228275f27e5320885ff1ec SHA512 342e8bba2cf00faab71ef39bb361b5ada66ff3a68ccf7a756ea1ca402da6e94784eece277ca02992bc7573c51cb8b1bad33aa9c593b3d1bfe0bb0286e2f4506f diff --git a/media-video/wireplumber/files/wireplumber-0.4.10-alsa.lua-fix-device-name-deduplication-when-reserva.patch b/media-video/wireplumber/files/wireplumber-0.4.10-alsa.lua-fix-device-name-deduplication-when-reserva.patch new file mode 100644 index 0000000..610db0e --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.10-alsa.lua-fix-device-name-deduplication-when-reserva.patch @@ -0,0 +1,117 @@ +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/c00c5a6675b6640db13111c808eaa3251917c412 + +From c00c5a6675b6640db13111c808eaa3251917c412 Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Wed, 18 May 2022 10:51:41 -0400 +Subject: [PATCH] alsa.lua: fix device name deduplication when reservation is + enabled + +Fixes #241 +--- + src/scripts/monitors/alsa.lua | 47 +++++++++++++++++++---------------- + 1 file changed, 25 insertions(+), 22 deletions(-) + +diff --git a/src/scripts/monitors/alsa.lua b/src/scripts/monitors/alsa.lua +index 01d241db..7beed3a8 100644 +--- a/src/scripts/monitors/alsa.lua ++++ b/src/scripts/monitors/alsa.lua +@@ -11,6 +11,10 @@ local config = ... or {} + -- ensure config.properties is not nil + config.properties = config.properties or {} + ++-- unique device/node name tables ++device_names_table = nil ++node_names_table = nil ++ + -- preprocess rules and create Interest objects + for _, r in ipairs(config.rules or {}) do + r.interests = {} +@@ -41,16 +45,6 @@ function rulesApplyProperties(properties) + end + end + +-function findDuplicate(parent, id, property, value) +- for i = 0, id - 1, 1 do +- local obj = parent:get_managed_object(i) +- if obj and obj.properties[property] == value then +- return true +- end +- end +- return false +-end +- + function nonempty(str) + return str ~= "" and str or nil + end +@@ -125,11 +119,11 @@ function createNode(parent, id, type, factory, properties) + + -- deduplicate nodes with the same name + for counter = 2, 99, 1 do +- if findDuplicate(parent, id, "node.name", properties["node.name"]) then +- properties["node.name"] = name .. "." .. counter +- else ++ if node_names_table[properties["node.name"]] ~= true then ++ node_names_table[properties["node.name"]] = true + break + end ++ properties["node.name"] = name .. "." .. counter + end + end + +@@ -186,6 +180,10 @@ function createDevice(parent, id, factory, properties) + local device = SpaDevice(factory, properties) + if device then + device:connect("create-object", createNode) ++ device:connect("object-removed", function (parent, id) ++ local node = parent:get_managed_object(id) ++ node_names_table[node.properties["node.name"]] = nil ++ end) + device:activate(Feature.SpaDevice.ENABLED | Feature.Proxy.BOUND) + parent:store_managed_object(id, device) + else +@@ -205,11 +203,11 @@ function prepareDevice(parent, id, type, factory, properties) + + -- deduplicate devices with the same name + for counter = 2, 99, 1 do +- if findDuplicate(parent, id, "device.name", properties["device.name"]) then +- properties["device.name"] = name .. "." .. counter +- else ++ if device_names_table[properties["device.name"]] ~= true then ++ device_names_table[properties["device.name"]] = true + break + end ++ properties["device.name"] = name .. "." .. counter + end + + -- ensure the device has a description +@@ -337,16 +335,21 @@ function createMonitor () + -- handle create-object to prepare device + m:connect("create-object", prepareDevice) + +- -- if dbus reservation, handle object-removed to destroy device reservations +- if rd_plugin then +- m:connect("object-removed", function (parent, id) +- local device = parent:get_managed_object(id) ++ -- handle object-removed to destroy device reservations and recycle device name ++ m:connect("object-removed", function (parent, id) ++ local device = parent:get_managed_object(id) ++ if rd_plugin then + local rd_name = device.properties["api.dbus.ReserveDevice1"] + if rd_name then + rd_plugin:call("destroy-reservation", rd_name) + end +- end) +- end ++ end ++ device_names_table[device.properties["device.name"]] = nil ++ end) ++ ++ -- reset the name tables to make sure names are recycled ++ device_names_table = {} ++ node_names_table = {} + + -- activate monitor + Log.info("Activating ALSA monitor") +-- +GitLab + diff --git a/media-video/wireplumber/files/wireplumber-0.4.10-config-disable-sound-server-parts.patch b/media-video/wireplumber/files/wireplumber-0.4.10-config-disable-sound-server-parts.patch new file mode 100644 index 0000000..a8bf6f1 --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.10-config-disable-sound-server-parts.patch @@ -0,0 +1,26 @@ +commit 3d86f51d2c43fd76be2450a8c27836fdd8619cfa +Author: Igor V. Kovalenko +Date: Sun May 15 18:19:03 2022 +0300 + + config: Disable alsa and bluez monitors by default + +diff --git a/src/config/bluetooth.lua.d/50-bluez-config.lua b/src/config/bluetooth.lua.d/50-bluez-config.lua +index d5727d3..938eae0 100644 +--- a/src/config/bluetooth.lua.d/50-bluez-config.lua ++++ b/src/config/bluetooth.lua.d/50-bluez-config.lua +@@ -1,4 +1,4 @@ +-bluez_monitor.enabled = true ++bluez_monitor.enabled = false + + bluez_monitor.properties = { + -- These features do not work on all headsets, so they are enabled +diff --git a/src/config/main.lua.d/50-alsa-config.lua b/src/config/main.lua.d/50-alsa-config.lua +index 3468333..d4c065b 100644 +--- a/src/config/main.lua.d/50-alsa-config.lua ++++ b/src/config/main.lua.d/50-alsa-config.lua +@@ -1,4 +1,4 @@ +-alsa_monitor.enabled = true ++alsa_monitor.enabled = false + + alsa_monitor.properties = { + -- Create a JACK device. This is not enabled by default because diff --git a/media-video/wireplumber/files/wireplumber-0.4.10-config-fix-enabled-property-to-default-to-true-when.patch b/media-video/wireplumber/files/wireplumber-0.4.10-config-fix-enabled-property-to-default-to-true-when.patch new file mode 100644 index 0000000..40a4866 --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.10-config-fix-enabled-property-to-default-to-true-when.patch @@ -0,0 +1,129 @@ +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/1f045309208ab5d927883b5adc2b7d1623fae162 + +From 1f045309208ab5d927883b5adc2b7d1623fae162 Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis +Date: Thu, 12 May 2022 12:19:38 +0300 +Subject: [PATCH] config: fix enabled property to default to "true" when not + defined + +Fixes backwards compatibility with older config files + +Fixes: #254 +--- + src/config/bluetooth.lua.d/30-bluez-monitor.lua | 2 +- + src/config/main.lua.d/20-default-access.lua | 2 +- + src/config/main.lua.d/30-alsa-monitor.lua | 2 +- + src/config/main.lua.d/30-libcamera-monitor.lua | 2 +- + src/config/main.lua.d/30-v4l2-monitor.lua | 2 +- + src/config/main.lua.d/40-device-defaults.lua | 2 +- + src/config/main.lua.d/40-stream-defaults.lua | 2 +- + src/config/policy.lua.d/10-default-policy.lua | 2 +- + 8 files changed, 8 insertions(+), 8 deletions(-) + +diff --git a/src/config/bluetooth.lua.d/30-bluez-monitor.lua b/src/config/bluetooth.lua.d/30-bluez-monitor.lua +index b40026c2..a870aa5d 100644 +--- a/src/config/bluetooth.lua.d/30-bluez-monitor.lua ++++ b/src/config/bluetooth.lua.d/30-bluez-monitor.lua +@@ -3,7 +3,7 @@ bluez_monitor.properties = {} + bluez_monitor.rules = {} + + function bluez_monitor.enable() +- if not bluez_monitor.enabled then ++ if bluez_monitor.enabled == false then + return + end + +diff --git a/src/config/main.lua.d/20-default-access.lua b/src/config/main.lua.d/20-default-access.lua +index a6ffb2ee..0a7eb955 100644 +--- a/src/config/main.lua.d/20-default-access.lua ++++ b/src/config/main.lua.d/20-default-access.lua +@@ -3,7 +3,7 @@ default_access.properties = {} + default_access.rules = {} + + function default_access.enable() +- if not default_access.enabled then ++ if default_access.enabled == false then + return + end + +diff --git a/src/config/main.lua.d/30-alsa-monitor.lua b/src/config/main.lua.d/30-alsa-monitor.lua +index da0b2c70..8e45e434 100644 +--- a/src/config/main.lua.d/30-alsa-monitor.lua ++++ b/src/config/main.lua.d/30-alsa-monitor.lua +@@ -3,7 +3,7 @@ alsa_monitor.properties = {} + alsa_monitor.rules = {} + + function alsa_monitor.enable() +- if not alsa_monitor.enabled then ++ if alsa_monitor.enabled == false then + return + end + +diff --git a/src/config/main.lua.d/30-libcamera-monitor.lua b/src/config/main.lua.d/30-libcamera-monitor.lua +index 4a8257ff..cd820a83 100644 +--- a/src/config/main.lua.d/30-libcamera-monitor.lua ++++ b/src/config/main.lua.d/30-libcamera-monitor.lua +@@ -3,7 +3,7 @@ libcamera_monitor.properties = {} + libcamera_monitor.rules = {} + + function libcamera_monitor.enable() +- if not libcamera_monitor.enabled then ++ if libcamera_monitor.enabled == false then + return + end + +diff --git a/src/config/main.lua.d/30-v4l2-monitor.lua b/src/config/main.lua.d/30-v4l2-monitor.lua +index 7cfd4bcd..3fbdc9e7 100644 +--- a/src/config/main.lua.d/30-v4l2-monitor.lua ++++ b/src/config/main.lua.d/30-v4l2-monitor.lua +@@ -3,7 +3,7 @@ v4l2_monitor.properties = {} + v4l2_monitor.rules = {} + + function v4l2_monitor.enable() +- if not v4l2_monitor.enabled then ++ if v4l2_monitor.enabled == false then + return + end + +diff --git a/src/config/main.lua.d/40-device-defaults.lua b/src/config/main.lua.d/40-device-defaults.lua +index 55aafe85..2204c4ac 100644 +--- a/src/config/main.lua.d/40-device-defaults.lua ++++ b/src/config/main.lua.d/40-device-defaults.lua +@@ -38,7 +38,7 @@ device_defaults.persistent_profiles = { + } + + function device_defaults.enable() +- if not device_defaults.enabled then ++ if device_defaults.enabled == false then + return + end + +diff --git a/src/config/main.lua.d/40-stream-defaults.lua b/src/config/main.lua.d/40-stream-defaults.lua +index 2975f4f6..307d83df 100644 +--- a/src/config/main.lua.d/40-stream-defaults.lua ++++ b/src/config/main.lua.d/40-stream-defaults.lua +@@ -25,7 +25,7 @@ stream_defaults.rules = { + } + + function stream_defaults.enable() +- if not stream_defaults.enabled then ++ if stream_defaults.enabled == false then + return + end + +diff --git a/src/config/policy.lua.d/10-default-policy.lua b/src/config/policy.lua.d/10-default-policy.lua +index 7b00e94e..edfdeb1c 100644 +--- a/src/config/policy.lua.d/10-default-policy.lua ++++ b/src/config/policy.lua.d/10-default-policy.lua +@@ -38,7 +38,7 @@ bluetooth_policy.policy = { + } + + function default_policy.enable() +- if not default_policy.enabled then ++ if default_policy.enabled == false then + return + end + +-- +GitLab + diff --git a/media-video/wireplumber/files/wireplumber-0.4.10-m-default-nodes-don-t-check-if-all-device-nodes-are.patch b/media-video/wireplumber/files/wireplumber-0.4.10-m-default-nodes-don-t-check-if-all-device-nodes-are.patch new file mode 100644 index 0000000..d9c5148 --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.10-m-default-nodes-don-t-check-if-all-device-nodes-are.patch @@ -0,0 +1,187 @@ +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/392cce2136e81ac3146078eacbbae85b694c917a + +From 392cce2136e81ac3146078eacbbae85b694c917a Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Fri, 20 May 2022 07:38:24 -0400 +Subject: [PATCH] m-default-nodes: don't check if all device nodes are ready + when finding default node + +This check was originally added to avoid a small audio glitch when changing +default nodes while also changing the device profile (eg Gnome Sound Settings). +The check is removed because it causes issues when disabling alsa nodes. There +are plans to fix the audio glitch issue in the future with the planned +event-dispatcher architecture. + +Fixes #279 +--- + modules/module-default-nodes.c | 136 --------------------------------- + 1 file changed, 136 deletions(-) + +diff --git a/modules/module-default-nodes.c b/modules/module-default-nodes.c +index 0fdaed5..577f9bb 100644 +--- a/modules/module-default-nodes.c ++++ b/modules/module-default-nodes.c +@@ -345,135 +345,6 @@ reevaluate_default_node (WpDefaultNodes * self, WpMetadata *m, gint node_t) + } + } + +-static guint +-get_device_total_nodes (WpPipewireObject * proxy) +-{ +- g_autoptr (WpIterator) profiles = NULL; +- g_auto (GValue) item = G_VALUE_INIT; +- +- profiles = wp_pipewire_object_enum_params_sync (proxy, "Profile", NULL); +- if (!profiles) +- return 0; +- +- for (; wp_iterator_next (profiles, &item); g_value_unset (&item)) { +- WpSpaPod *pod = g_value_get_boxed (&item); +- gint idx = -1; +- const gchar *name = NULL; +- g_autoptr (WpSpaPod) classes = NULL; +- +- /* Parse */ +- if (!wp_spa_pod_get_object (pod, NULL, +- "index", "i", &idx, +- "name", "s", &name, +- "classes", "?P", &classes, +- NULL)) +- continue; +- if (!classes) +- continue; +- +- /* Parse profile classes */ +- { +- g_autoptr (WpIterator) it = wp_spa_pod_new_iterator (classes); +- g_auto (GValue) v = G_VALUE_INIT; +- gint total_nodes = 0; +- for (; wp_iterator_next (it, &v); g_value_unset (&v)) { +- WpSpaPod *entry = g_value_get_boxed (&v); +- g_autoptr (WpSpaPodParser) pp = NULL; +- const gchar *media_class = NULL; +- gint n_nodes = 0; +- g_return_val_if_fail (entry, 0); +- if (!wp_spa_pod_is_struct (entry)) +- continue; +- pp = wp_spa_pod_parser_new_struct (entry); +- g_return_val_if_fail (pp, 0); +- g_return_val_if_fail (wp_spa_pod_parser_get_string (pp, &media_class), 0); +- g_return_val_if_fail (wp_spa_pod_parser_get_int (pp, &n_nodes), 0); +- wp_spa_pod_parser_end (pp); +- +- total_nodes += n_nodes; +- } +- +- if (total_nodes > 0) +- return total_nodes; +- } +- } +- +- return 0; +-} +- +-static gboolean +-nodes_ready (WpDefaultNodes * self) +-{ +- g_autoptr (WpIterator) it = NULL; +- g_auto (GValue) val = G_VALUE_INIT; +- +- /* Get the total number of nodes for each device and make sure they exist +- * and have at least 1 port */ +- it = wp_object_manager_new_filtered_iterator (self->rescan_om, +- WP_TYPE_DEVICE, NULL); +- for (; wp_iterator_next (it, &val); g_value_unset (&val)) { +- WpPipewireObject *device = g_value_get_object (&val); +- guint total_nodes = get_device_total_nodes (device); +- if (total_nodes > 0) { +- guint32 device_id = wp_proxy_get_bound_id (WP_PROXY (device)); +- g_autoptr (WpIterator) node_it = NULL; +- g_auto (GValue) node_val = G_VALUE_INIT; +- guint ready_nodes = 0; +- +- node_it = wp_object_manager_new_filtered_iterator (self->rescan_om, +- WP_TYPE_NODE, WP_CONSTRAINT_TYPE_PW_PROPERTY, +- PW_KEY_DEVICE_ID, "=i", device_id, NULL); +- for (; wp_iterator_next (node_it, &node_val); g_value_unset (&node_val)) { +- WpPipewireObject *node = g_value_get_object (&node_val); +- g_autoptr (WpPort) port = +- wp_object_manager_lookup (self->rescan_om, +- WP_TYPE_PORT, WP_CONSTRAINT_TYPE_PW_PROPERTY, +- PW_KEY_NODE_ID, "=u", wp_proxy_get_bound_id (WP_PROXY (node)), +- NULL); +- if (port) +- ready_nodes++; +- } +- +- if (ready_nodes < total_nodes) { +- const gchar *device_name = wp_pipewire_object_get_property ( +- WP_PIPEWIRE_OBJECT (device), PW_KEY_DEVICE_NAME); +- wp_debug_object (self, "device '%s' is not ready (%d/%d)", device_name, +- ready_nodes, total_nodes); +- return FALSE; +- } +- } +- } +- +- /* Make sure Audio and Video virtual sources have ports */ +- { +- g_autoptr (WpIterator) node_it = NULL; +- g_auto (GValue) node_val = G_VALUE_INIT; +- node_it = wp_object_manager_new_filtered_iterator (self->rescan_om, +- WP_TYPE_NODE, WP_CONSTRAINT_TYPE_PW_PROPERTY, PW_KEY_DEVICE_ID, "-", +- NULL); +- for (; wp_iterator_next (node_it, &node_val); g_value_unset (&node_val)) { +- WpPipewireObject *node = g_value_get_object (&node_val); +- const gchar *media_class = wp_pipewire_object_get_property ( +- WP_PIPEWIRE_OBJECT (node), PW_KEY_MEDIA_CLASS); +- g_autoptr (WpPort) port = +- wp_object_manager_lookup (self->rescan_om, +- WP_TYPE_PORT, WP_CONSTRAINT_TYPE_PW_PROPERTY, +- PW_KEY_NODE_ID, "=u", wp_proxy_get_bound_id (WP_PROXY (node)), +- NULL); +- if (!port && +- (g_strcmp0 ("Audio/Source/Virtual", media_class) == 0 || +- g_strcmp0 ("Video/Source/Virtual", media_class) == 0)) { +- const gchar *node_name = wp_pipewire_object_get_property ( +- WP_PIPEWIRE_OBJECT (node), PW_KEY_NODE_NAME); +- wp_debug_object (self, "virtual node '%s' is not ready", node_name); +- return FALSE; +- } +- } +- } +- +- return TRUE; +-} +- + static void + sync_rescan (WpCore * core, GAsyncResult * res, WpDefaultNodes * self) + { +@@ -491,10 +362,6 @@ sync_rescan (WpCore * core, GAsyncResult * res, WpDefaultNodes * self) + if (!metadata) + return; + +- /* Make sure nodes are ready for current profile */ +- if (!nodes_ready (self)) +- return; +- + wp_trace_object (self, "re-evaluating defaults"); + reevaluate_default_node (self, metadata, AUDIO_SINK); + reevaluate_default_node (self, metadata, AUDIO_SOURCE); +@@ -584,13 +451,10 @@ on_metadata_added (WpObjectManager *om, WpMetadata *metadata, gpointer d) + self->rescan_om = wp_object_manager_new (); + wp_object_manager_add_interest (self->rescan_om, WP_TYPE_DEVICE, NULL); + wp_object_manager_add_interest (self->rescan_om, WP_TYPE_NODE, NULL); +- wp_object_manager_add_interest (self->rescan_om, WP_TYPE_PORT, NULL); + wp_object_manager_request_object_features (self->rescan_om, WP_TYPE_DEVICE, + WP_OBJECT_FEATURES_ALL); + wp_object_manager_request_object_features (self->rescan_om, WP_TYPE_NODE, + WP_OBJECT_FEATURES_ALL); +- wp_object_manager_request_object_features (self->rescan_om, WP_TYPE_PORT, +- WP_OBJECT_FEATURES_ALL); + g_signal_connect_object (self->rescan_om, "objects-changed", + G_CALLBACK (schedule_rescan), self, G_CONNECT_SWAPPED); + g_signal_connect_object (self->rescan_om, "object-added", +-- +2.35.1 + diff --git a/media-video/wireplumber/files/wireplumber-0.4.10-m-lua-scripting-allow-converting-GValue-holding-NUL.patch b/media-video/wireplumber/files/wireplumber-0.4.10-m-lua-scripting-allow-converting-GValue-holding-NUL.patch new file mode 100644 index 0000000..c319ac4 --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.10-m-lua-scripting-allow-converting-GValue-holding-NUL.patch @@ -0,0 +1,36 @@ +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/c2f31bb550755acba31da2e9f5bbdf646ed5e805 + +From c2f31bb550755acba31da2e9f5bbdf646ed5e805 Mon Sep 17 00:00:00 2001 +From: Julian Bouzas +Date: Mon, 16 May 2022 15:41:10 -0400 +Subject: [PATCH] m-lua-scripting: allow converting GValue holding NULL objects + to Lua + +--- + modules/module-lua-scripting/wplua/value.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/modules/module-lua-scripting/wplua/value.c b/modules/module-lua-scripting/wplua/value.c +index 133051a4..e31ae4ac 100644 +--- a/modules/module-lua-scripting/wplua/value.c ++++ b/modules/module-lua-scripting/wplua/value.c +@@ -314,9 +314,14 @@ wplua_gvalue_to_lua (lua_State *L, const GValue *v) + wplua_pushboxed (L, G_VALUE_TYPE (v), g_value_dup_boxed (v)); + break; + case G_TYPE_OBJECT: +- case G_TYPE_INTERFACE: +- wplua_pushobject (L, g_value_dup_object (v)); ++ case G_TYPE_INTERFACE: { ++ GObject *object = g_value_dup_object (v); ++ if (object) ++ wplua_pushobject (L, g_value_dup_object (v)); ++ else ++ lua_pushnil (L); + break; ++ } + case G_TYPE_ENUM: + wplua_enum_to_lua (L, g_value_get_enum (v), G_VALUE_TYPE (v)); + break; +-- +GitLab + diff --git a/media-video/wireplumber/files/wireplumber-0.4.10-m-lua-scripting-fix-object-refcounting.patch b/media-video/wireplumber/files/wireplumber-0.4.10-m-lua-scripting-fix-object-refcounting.patch new file mode 100644 index 0000000..0b86979 --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.10-m-lua-scripting-fix-object-refcounting.patch @@ -0,0 +1,32 @@ +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/7908b8d7be2a2992c57cd549054eda7ce46e4b44 + +From 13b85bd4a25ab374f5e5e90b7288e6987996856e Mon Sep 17 00:00:00 2001 +From: Michael Olbrich +Date: Tue, 24 May 2022 11:35:15 +0200 +Subject: [PATCH] m-lua-scripting: fix object refcounting + +7908b8d7be2a2992c57cd549054eda7ce46e4b44 ("m-lua-scripting: allow +converting GValue holding NULL objects to Lua") accidentally added a second +refcount. As a result, the objects are never freeded. + +Remove the second refcount to fix this. +--- + modules/module-lua-scripting/wplua/value.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/modules/module-lua-scripting/wplua/value.c b/modules/module-lua-scripting/wplua/value.c +index e31ae4a..a7927dc 100644 +--- a/modules/module-lua-scripting/wplua/value.c ++++ b/modules/module-lua-scripting/wplua/value.c +@@ -317,7 +317,7 @@ wplua_gvalue_to_lua (lua_State *L, const GValue *v) + case G_TYPE_INTERFACE: { + GObject *object = g_value_dup_object (v); + if (object) +- wplua_pushobject (L, g_value_dup_object (v)); ++ wplua_pushobject (L, object); + else + lua_pushnil (L); + break; +-- +2.35.1 + diff --git a/media-video/wireplumber/files/wireplumber-0.4.11-alsa-lua-crash.patch b/media-video/wireplumber/files/wireplumber-0.4.11-alsa-lua-crash.patch new file mode 100644 index 0000000..3bc8bbd --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.11-alsa-lua-crash.patch @@ -0,0 +1,33 @@ +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/c16e637c329bc9dda8544b18f5bd47a8d63ee253 + +From c16e637c329bc9dda8544b18f5bd47a8d63ee253 Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis +Date: Thu, 7 Jul 2022 20:58:36 +0300 +Subject: [PATCH] alsa: use "obj_type" as a variable name to avoid shadowing + lua's "type" function + +This causes a crash when running in a VM because the code tries to +execute lua's "type()" and ends up executing the local string variable... + +Fixes: #303 +--- a/src/scripts/monitors/alsa.lua ++++ b/src/scripts/monitors/alsa.lua +@@ -49,7 +49,7 @@ function nonempty(str) + return str ~= "" and str or nil + end + +-function createNode(parent, id, type, factory, properties) ++function createNode(parent, id, obj_type, factory, properties) + local dev_props = parent.properties + + -- set the device id and spa factory name; REQUIRED, do not change +@@ -199,7 +199,7 @@ function createDevice(parent, id, factory, properties) + end + end + +-function prepareDevice(parent, id, type, factory, properties) ++function prepareDevice(parent, id, obj_type, factory, properties) + -- ensure the device has an appropriate name + local name = "alsa_card." .. + (properties["device.name"] or +GitLab diff --git a/media-video/wireplumber/files/wireplumber-0.4.11-dbus-reconnect-crash.patch b/media-video/wireplumber/files/wireplumber-0.4.11-dbus-reconnect-crash.patch new file mode 100644 index 0000000..6098ed1 --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.11-dbus-reconnect-crash.patch @@ -0,0 +1,45 @@ +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/eb406bdb2cbbcd49c55c71285f8f2eddb624d24b + +From eb406bdb2cbbcd49c55c71285f8f2eddb624d24b Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis +Date: Wed, 13 Jul 2022 13:38:14 +0300 +Subject: [PATCH] dbus: fix crash when trying to reconnect + +When coming from on_sync_reconnect, data points to the WpDBus object +instead of the activation transition. + +Fixes: #305 +--- a/lib/wp/dbus.c ++++ b/lib/wp/dbus.c +@@ -58,14 +58,26 @@ wp_dbus_set_state (WpDbus *self, WpDBusState new_state) + static void + on_got_bus (GObject * obj, GAsyncResult * res, gpointer data) + { +- WpTransition *transition = WP_TRANSITION (data); +- WpDbus *self = wp_transition_get_source_object (transition); ++ WpTransition *transition; ++ WpDbus *self; + g_autoptr (GError) error = NULL; + ++ if (WP_IS_TRANSITION (data)) { ++ // coming from wp_dbus_enable ++ transition = WP_TRANSITION (data); ++ self = wp_transition_get_source_object (transition); ++ } else { ++ // coming from on_sync_reconnect ++ transition = NULL; ++ self = WP_DBUS (data); ++ } ++ + self->connection = g_dbus_connection_new_for_address_finish (res, &error); + if (!self->connection) { +- g_prefix_error (&error, "Failed to connect to bus: "); +- wp_transition_return_error (transition, g_steal_pointer (&error)); ++ if (transition) { ++ g_prefix_error (&error, "Failed to connect to bus: "); ++ wp_transition_return_error (transition, g_steal_pointer (&error)); ++ } + return; + } + +GitLab diff --git a/media-video/wireplumber/files/wireplumber-0.4.11-loop.patch b/media-video/wireplumber/files/wireplumber-0.4.11-loop.patch new file mode 100644 index 0000000..75e2baf --- /dev/null +++ b/media-video/wireplumber/files/wireplumber-0.4.11-loop.patch @@ -0,0 +1,147 @@ +https://bugs.gentoo.org/866551 +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/37c839b9308cd3d6580bf01077db8cb29ec2aa2f +https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/370b692933634675213110048fcda6dff52eb52b + +From: Pauli Virtanen +Date: Tue, 19 Jul 2022 20:39:06 +0300 +Subject: [PATCH] policy-node: fix potential rescan loop + +SiLink activation might be delayed indefinitely under some error +conditions. Currently, policy-node schedules a rescan when it sees a +non-activated link on a stream to be moved, which produces busy loop if +the si-link doesn't activate. + +Instead of rescheduling on non-active si-links, just remove and emit a +warning. The si-link then gets removed once it gets activated. + +Reproducer: + +1. Play audio from Rhythmbox and pause. +2. Switch default output with pactl between two different outputs +3. Links from the paused stream stay at "init" +--- a/src/scripts/policy-node.lua ++++ b/src/scripts/policy-node.lua +@@ -694,16 +694,15 @@ function handleLinkable (si) + local link = lookupLink (si_id, si_flags[si_id].peer_id) + if reconnect then + if link ~= nil then +- -- remove old link if active, otherwise schedule rescan +- if ((link:get_active_features() & Feature.SessionItem.ACTIVE) ~= 0) then +- si_flags[si_id].peer_id = nil +- link:remove () +- Log.info (si, "... moving to new target") +- else +- scheduleRescan() +- Log.info (si, "... scheduled rescan") +- return ++ -- remove old link ++ if ((link:get_active_features() & Feature.SessionItem.ACTIVE) == 0) then ++ -- remove also not yet activated links: they might never become active, ++ -- and we should not loop waiting for them ++ Log.warning (link, "Link was not activated before removing") + end ++ si_flags[si_id].peer_id = nil ++ link:remove () ++ Log.info (si, "... moving to new target") + end + else + if link ~= nil then +GitLab + +From: Pauli Virtanen +Date: Tue, 19 Jul 2022 20:01:10 +0300 +Subject: [PATCH] m-si-link: don't wait for establish before activation + + cleanup links + +SiLink should not wait for WpLinks becoming ESTABLISHED, before +activation. That flag shows whether a link has moved away from the +"init" state, however, links to e.g. Pulseaudio corked streams can stay +in "init" state until uncorking. This causes trouble for policies, +which needlessly wait for such links to establish. + +The WpLink objects may also be kept alive by other referents, and +just unrefing them does not necessarily destroy the PW objects. + +Activate SiLink even if the WpLink is still in "init" state. It's enough +that the link otherwise successfully establishes. + +At dispose time, explicitly request destroying the WpLinks that were +created by the SiLink, to ensure they are removed even if there's +something else referring to them. +--- a/modules/module-si-standard-link.c ++++ b/modules/module-si-standard-link.c +@@ -132,6 +132,27 @@ si_standard_link_get_associated_proxy (WpSessionItem * item, GType proxy_type) + return NULL; + } + ++static void ++request_destroy_link (gpointer data, gpointer user_data) ++{ ++ WpLink *link = WP_LINK (data); ++ ++ wp_global_proxy_request_destroy (WP_GLOBAL_PROXY (link)); ++} ++ ++static void ++clear_node_links (GPtrArray **node_links_p) ++{ ++ /* ++ * Something else (eg. object managers) may be keeping the WpLink ++ * objects alive. Deactive the links now, to destroy the PW objects. ++ */ ++ if (*node_links_p) ++ g_ptr_array_foreach (*node_links_p, request_destroy_link, NULL); ++ ++ g_clear_pointer (node_links_p, g_ptr_array_unref); ++} ++ + static void + si_standard_link_disable_active (WpSessionItem *si) + { +@@ -154,7 +175,8 @@ si_standard_link_disable_active (WpSessionItem *si) + WP_SI_LINKABLE (si_in)); + } + +- g_clear_pointer (&self->node_links, g_ptr_array_unref); ++ clear_node_links (&self->node_links); ++ + self->n_active_links = 0; + self->n_failed_links = 0; + self->n_async_ops_wait = 0; +@@ -168,7 +190,7 @@ on_link_activated (WpObject * proxy, GAsyncResult * res, + WpTransition * transition) + { + WpSiStandardLink *self = wp_transition_get_source_object (transition); +- guint len = self->node_links->len; ++ guint len = self->node_links ? self->node_links->len : 0; + + /* Count the number of failed and active links */ + if (wp_object_activate_finish (proxy, res, NULL)) +@@ -182,7 +204,7 @@ on_link_activated (WpObject * proxy, GAsyncResult * res, + + /* We only active feature if all links activated successfully */ + if (self->n_failed_links > 0) { +- g_clear_pointer (&self->node_links, g_ptr_array_unref); ++ clear_node_links (&self->node_links); + wp_transition_return_error (transition, g_error_new ( + WP_DOMAIN_LIBRARY, WP_LIBRARY_ERROR_OPERATION_FAILED, + "%d of %d PipeWire links failed to activate", +@@ -251,7 +273,7 @@ create_links (WpSiStandardLink * self, WpTransition * transition, + /* Clear old links if any */ + self->n_active_links = 0; + self->n_failed_links = 0; +- g_clear_pointer (&self->node_links, g_ptr_array_unref); ++ clear_node_links (&self->node_links); + + /* tuple format: + uint32 node_id; +@@ -327,7 +349,7 @@ create_links (WpSiStandardLink * self, WpTransition * transition, + + /* activate to ensure it is created without errors */ + wp_object_activate_closure (WP_OBJECT (link), +- WP_OBJECT_FEATURES_ALL, NULL, ++ WP_OBJECT_FEATURES_ALL & ~WP_LINK_FEATURE_ESTABLISHED, NULL, + g_cclosure_new_object ( + (GCallback) on_link_activated, G_OBJECT (transition))); + } +GitLab diff --git a/media-video/wireplumber/metadata.xml b/media-video/wireplumber/metadata.xml new file mode 100644 index 0000000..ff32fcd --- /dev/null +++ b/media-video/wireplumber/metadata.xml @@ -0,0 +1,16 @@ + + + + + sam@gentoo.org + Sam James + + + https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues + https://gitlab.freedesktop.org/pipewire/wireplumber/-/releases + + + + Install systemd unit files for running as a system service. Not recommended. + + diff --git a/media-video/wireplumber/wireplumber-0.4.10-r4.ebuild b/media-video/wireplumber/wireplumber-0.4.10-r4.ebuild new file mode 100644 index 0000000..820d1ed --- /dev/null +++ b/media-video/wireplumber/wireplumber-0.4.10-r4.ebuild @@ -0,0 +1,125 @@ +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +LUA_COMPAT=( lua5-{3,4} ) + +inherit lua-single meson systemd + +if [[ ${PV} == 9999 ]]; then + EGIT_REPO_URI="https://gitlab.freedesktop.org/pipewire/${PN}.git" + EGIT_BRANCH="master" + inherit git-r3 +else + SRC_URI="https://gitlab.freedesktop.org/pipewire/${PN}/-/archive/${PV}/${P}.tar.gz" + KEYWORDS="amd64 arm arm64 ~loong ppc ppc64 ~riscv ~sparc x86" +fi + +DESCRIPTION="Replacement for pipewire-media-session" +HOMEPAGE="https://gitlab.freedesktop.org/pipewire/wireplumber" + +LICENSE="MIT" +SLOT="0/0.4" +IUSE="elogind system-service systemd test" + +REQUIRED_USE=" + ${LUA_REQUIRED_USE} + ?? ( elogind systemd ) + system-service? ( systemd ) +" + +RESTRICT="!test? ( test )" + +# introspection? ( dev-libs/gobject-introspection ) is valid but likely only used for doc building +BDEPEND=" + dev-libs/glib + dev-util/gdbus-codegen + dev-util/glib-utils + sys-devel/gettext +" + +DEPEND=" + ${LUA_DEPS} + >=dev-libs/glib-2.62 + >=media-video/pipewire-0.3.48:= + virtual/libintl + elogind? ( sys-auth/elogind ) + systemd? ( sys-apps/systemd ) +" + +# Any dev-lua/* deps get declared like this inside RDEPEND: +# $(lua_gen_cond_dep ' +# dev-lua/[${LUA_USEDEP}] +# ') +RDEPEND="${DEPEND} + system-service? ( + acct-user/pipewire + acct-group/pipewire + ) +" + +DOCS=( {NEWS,README}.rst ) + +PATCHES=( + "${FILESDIR}"/${P}-config-fix-enabled-property-to-default-to-true-when.patch + "${FILESDIR}"/${P}-m-lua-scripting-allow-converting-GValue-holding-NUL.patch + "${FILESDIR}"/${P}-alsa.lua-fix-device-name-deduplication-when-reserva.patch + "${FILESDIR}"/${P}-m-default-nodes-don-t-check-if-all-device-nodes-are.patch + "${FILESDIR}"/${P}-m-lua-scripting-fix-object-refcounting.patch +) + +src_configure() { + local emesonargs=( + -Ddoc=disabled # Ebuild not wired up yet (Sphinx, Doxygen?) + -Dintrospection=disabled # Only used for Sphinx doc generation + -Dsystem-lua=true # We always unbundle everything we can + -Dsystem-lua-version=$(ver_cut 1-2 $(lua_get_version)) + $(meson_feature elogind) + $(meson_feature systemd) + $(meson_use system-service systemd-system-service) + $(meson_use systemd systemd-user-service) + -Dsystemd-system-unit-dir=$(systemd_get_systemunitdir) + -Dsystemd-user-unit-dir=$(systemd_get_userunitdir) + $(meson_use test tests) + ) + + meson_src_configure +} + +src_install() { + meson_src_install + + # We copy the default config, so that Gentoo tools can pick up on any + # updates and /etc does not end up with stale overrides. + # If a reflinking CoW filesystem is used (e.g. Btrfs), then the files + # will not actually get stored twice until modified. + insinto /etc + doins -r "${ED}"/usr/share/wireplumber +} + +pkg_postinst() { + if systemd_is_booted ; then + ewarn "pipewire-media-session.service is no longer installed. You must switch" + ewarn "to wireplumber.service user unit before your next logout/reboot:" + ewarn "systemctl --user disable pipewire-media-session.service" + ewarn "systemctl --user --force enable wireplumber.service" + else + ewarn "Switch to WirePlumber will happen the next time gentoo-pipewire-launcher" + ewarn "is started (a replacement for directly calling pipewire binary)." + ewarn + ewarn "Please ensure that ${EROOT}/etc/pipewire/pipewire.conf either does not exist" + ewarn "or, if it does exist, that any reference to" + ewarn "${EROOT}/usr/bin/pipewire-media-session is commented out (begins with a #)." + fi + if use system-service; then + ewarn + ewarn "WARNING: you have enabled the system-service USE flag, which installs" + ewarn "the system-wide systemd units that enable WirePlumber to run as a system" + ewarn "service. This is more than likely NOT what you want. You are strongly" + ewarn "advised not to enable this mode and instead stick with systemd user" + ewarn "units. The default configuration files will likely not work out of" + ewarn "box, and you are on your own with configuration." + ewarn + fi +} diff --git a/metadata/md5-cache/media-video/pipewire-0.3.51-r2 b/metadata/md5-cache/media-video/pipewire-0.3.51-r2 new file mode 100644 index 0000000..3c0efbb --- /dev/null +++ b/metadata/md5-cache/media-video/pipewire-0.3.51-r2 @@ -0,0 +1,18 @@ +BDEPEND=>=dev-util/meson-0.59 virtual/pkgconfig || ( >=dev-lang/python-3.10.4:3.10 >=dev-lang/python-3.9.12:3.9 >=dev-lang/python-3.8.13:3.8 ) || ( ( >=dev-lang/python-3.10.4:3.10 dev-python/docutils[python_targets_python3_10(-)] ) ( >=dev-lang/python-3.9.12:3.9 dev-python/docutils[python_targets_python3_9(-)] ) ( >=dev-lang/python-3.8.13:3.8 dev-python/docutils[python_targets_python3_8(-)] ) ) doc? ( app-doc/doxygen media-gfx/graphviz ) >=dev-util/meson-0.62.2 >=dev-util/ninja-1.8.2 dev-util/meson-format-array virtual/pkgconfig virtual/pkgconfig +DEFINED_PHASES=compile configure install postinst prepare setup test +DEPEND=acct-group/audio media-libs/alsa-lib sys-apps/dbus[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?] sys-libs/readline:= sys-libs/ncurses:=[unicode(+)] virtual/libintl[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?] bluetooth? ( media-libs/fdk-aac media-libs/libldac media-libs/libfreeaptx media-libs/sbc >=net-wireless/bluez-4.101:= virtual/libusb:1 ) echo-cancel? ( media-libs/webrtc-audio-processing:0 ) extra? ( >=media-libs/libsndfile-1.0.20 ) gstreamer? ( >=dev-libs/glib-2.32.0:2 >=media-libs/gstreamer-1.10.0:1.0 media-libs/gst-plugins-base:1.0 ) jack-client? ( >=media-sound/jack2-1.9.10:2[dbus] ) jack-sdk? ( !media-sound/jack-audio-connection-kit !media-sound/jack2 ) lv2? ( media-libs/lilv ) pipewire-alsa? ( >=media-libs/alsa-lib-1.1.7[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?] ) !pipewire-alsa? ( media-plugins/alsa-plugins[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?,pulseaudio] ) ssl? ( dev-libs/openssl:= ) systemd? ( sys-apps/systemd ) system-service? ( acct-user/pipewire acct-group/pipewire ) udev? ( virtual/libudev[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?] ) v4l? ( media-libs/libv4l ) X? ( media-libs/libcanberra x11-libs/libX11 x11-libs/libXfixes ) zeroconf? ( net-dns/avahi ) +DESCRIPTION=Multimedia processing graphs +EAPI=8 +HOMEPAGE=https://pipewire.org/ +INHERIT=flag-o-matic meson-multilib optfeature prefix python-any-r1 systemd udev +IUSE=bluetooth doc echo-cancel extra gstreamer jack-client jack-sdk lv2 pipewire-alsa ssl system-service systemd test udev v4l X zeroconf abi_x86_32 abi_x86_64 abi_x86_x32 abi_mips_n32 abi_mips_n64 abi_mips_o32 abi_s390_32 abi_s390_64 +KEYWORDS=amd64 arm arm64 ~loong ppc ppc64 ~riscv ~sparc x86 +LICENSE=MIT LGPL-2.1+ GPL-2 +PDEPEND=>=media-video/wireplumber-0.4.8-r3 +RDEPEND=acct-group/audio media-libs/alsa-lib sys-apps/dbus[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?] sys-libs/readline:= sys-libs/ncurses:=[unicode(+)] virtual/libintl[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?] bluetooth? ( media-libs/fdk-aac media-libs/libldac media-libs/libfreeaptx media-libs/sbc >=net-wireless/bluez-4.101:= virtual/libusb:1 ) echo-cancel? ( media-libs/webrtc-audio-processing:0 ) extra? ( >=media-libs/libsndfile-1.0.20 ) gstreamer? ( >=dev-libs/glib-2.32.0:2 >=media-libs/gstreamer-1.10.0:1.0 media-libs/gst-plugins-base:1.0 ) jack-client? ( >=media-sound/jack2-1.9.10:2[dbus] ) jack-sdk? ( !media-sound/jack-audio-connection-kit !media-sound/jack2 ) lv2? ( media-libs/lilv ) pipewire-alsa? ( >=media-libs/alsa-lib-1.1.7[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?] ) !pipewire-alsa? ( media-plugins/alsa-plugins[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?,pulseaudio] ) ssl? ( dev-libs/openssl:= ) systemd? ( sys-apps/systemd ) system-service? ( acct-user/pipewire acct-group/pipewire ) udev? ( virtual/libudev[abi_x86_32(-)?,abi_x86_64(-)?,abi_x86_x32(-)?,abi_mips_n32(-)?,abi_mips_n64(-)?,abi_mips_o32(-)?,abi_s390_32(-)?,abi_s390_64(-)?] ) v4l? ( media-libs/libv4l ) X? ( media-libs/libcanberra x11-libs/libX11 x11-libs/libXfixes ) zeroconf? ( net-dns/avahi ) +REQUIRED_USE=jack-sdk? ( !jack-client ) system-service? ( systemd ) +RESTRICT=!test? ( test ) +SLOT=0/0.4 +SRC_URI=https://gitlab.freedesktop.org/pipewire/pipewire/-/archive/0.3.51/pipewire-0.3.51.tar.gz +_eclasses_=toolchain-funcs 441f754fd75cd4fd1fa06fbc17da6144 multilib 5ca4e49abed8e3a2f7b56920eadee157 flag-o-matic 29a755b1291d64133634d80b0328f153 multiprocessing b4e253ab22cef7b1085e9b67c7a3b730 ninja-utils 58ec4e54962bf45d065fb95030701514 python-utils-r1 b9fc5e97e886514e5132f50465185401 meson 1994a5aef5d4f5798b92f64d6f9a6003 multibuild d26d81f242cb193d899a72bca423d0bd multilib-build 87f1b83e21a473787b821ef3d0437bf3 multilib-minimal 4b0f1857965db8869a729948d5277e0b meson-multilib 84c0d4019bf29be0d9d0a2d98fb8b0d9 optfeature 1a2157392a869265b2afcb63a26c12ac prefix eab3c99d77fe00506c109c8a736186f7 python-any-r1 f2f00fb79b5e888b5011d4c51240ae97 systemd 5f4bb0758df2e483babf68cd517078ca udev eec0bbab06977f1cfc5597269c1fa152 +_md5_=8f88c3532fb43b593094483fc8d865b1 diff --git a/metadata/md5-cache/media-video/wireplumber-0.4.10-r4 b/metadata/md5-cache/media-video/wireplumber-0.4.10-r4 new file mode 100644 index 0000000..4970126 --- /dev/null +++ b/metadata/md5-cache/media-video/wireplumber-0.4.10-r4 @@ -0,0 +1,17 @@ +BDEPEND=dev-libs/glib dev-util/gdbus-codegen dev-util/glib-utils sys-devel/gettext >=dev-util/meson-0.62.2 >=dev-util/ninja-1.8.2 dev-util/meson-format-array virtual/pkgconfig +DEFINED_PHASES=compile configure install postinst setup test +DEPEND=lua_single_target_lua5-3? ( dev-lang/lua:5.3 ) lua_single_target_lua5-4? ( dev-lang/lua:5.4 ) >=dev-libs/glib-2.62 >=media-video/pipewire-0.3.48:= virtual/libintl elogind? ( sys-auth/elogind ) systemd? ( sys-apps/systemd ) +DESCRIPTION=Replacement for pipewire-media-session +EAPI=8 +HOMEPAGE=https://gitlab.freedesktop.org/pipewire/wireplumber +INHERIT=lua-single meson systemd +IUSE=elogind system-service systemd test lua_single_target_lua5-3 lua_single_target_lua5-4 +KEYWORDS=amd64 arm arm64 ~loong ppc ppc64 ~riscv ~sparc x86 +LICENSE=MIT +RDEPEND=lua_single_target_lua5-3? ( dev-lang/lua:5.3 ) lua_single_target_lua5-4? ( dev-lang/lua:5.4 ) >=dev-libs/glib-2.62 >=media-video/pipewire-0.3.48:= virtual/libintl elogind? ( sys-auth/elogind ) systemd? ( sys-apps/systemd ) system-service? ( acct-user/pipewire acct-group/pipewire ) +REQUIRED_USE=^^ ( lua_single_target_lua5-3 lua_single_target_lua5-4 ) ?? ( elogind systemd ) system-service? ( systemd ) +RESTRICT=!test? ( test ) +SLOT=0/0.4 +SRC_URI=https://gitlab.freedesktop.org/pipewire/wireplumber/-/archive/0.4.10/wireplumber-0.4.10.tar.gz +_eclasses_=toolchain-funcs 441f754fd75cd4fd1fa06fbc17da6144 multilib 5ca4e49abed8e3a2f7b56920eadee157 lua-utils e69ff116248d78546ae1a234c086fe80 lua-single aee383a0de35701b9eb0b27077a1c143 multiprocessing b4e253ab22cef7b1085e9b67c7a3b730 ninja-utils 58ec4e54962bf45d065fb95030701514 python-utils-r1 b9fc5e97e886514e5132f50465185401 meson 1994a5aef5d4f5798b92f64d6f9a6003 systemd 5f4bb0758df2e483babf68cd517078ca +_md5_=03fb8fa183b6f4a6f45aa77bc0107b0a