Added old pipewire/wireplumber packages.

This commit is contained in:
Sheldon Lee 2022-11-26 23:03:25 +00:00
parent 67e909aa35
commit ac8005ed3a
24 changed files with 1547 additions and 0 deletions

View File

@ -0,0 +1 @@
DIST pipewire-0.3.51.tar.gz 1789070 BLAKE2B 8538eb9f2178efa26365f30b324b707826e580caa1fd9c09b62c561c140c14186e0d2b04808fa78eb5642ddccf1a347def19934ecd654be06b215a693075b6fc SHA512 a762fd260b4b14ad9ef142be11ab1c22268da6726e2179559ffb254f0ce7daf7a502779e33c64313a9c6a9fc1bd15150b76be04ec81aa27c35dbb4333cecdb4a

View File

@ -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
}
]

View File

@ -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

View File

@ -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

View File

@ -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 <wtaymans@redhat.com>
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 <wtaymans@redhat.com>
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 <wtaymans@redhat.com>
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

View File

@ -0,0 +1,87 @@
https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/94a857550b566472e5ab51191e1b34098e5a9506
From 94a857550b566472e5ab51191e1b34098e5a9506 Mon Sep 17 00:00:00 2001
From: Wim Taymans <wtaymans@redhat.com>
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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="project">
<email>gnome@gentoo.org</email>
<name>Gentoo GNOME Desktop</name>
</maintainer>
<maintainer type="person">
<email>sam@gentoo.org</email>
<name>Sam James</name>
</maintainer>
<upstream>
<bugs-to>https://gitlab.freedesktop.org/pipewire/pipewire/-/issues</bugs-to>
<changelog>https://gitlab.freedesktop.org/pipewire/pipewire/-/releases</changelog>
<doc>https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home</doc>
</upstream>
<use>
<flag name="echo-cancel">Enable WebRTC-based echo canceller via <pkg>media-libs/webrtc-audio-processing</pkg></flag>
<flag name="extra">Build pw-cat/pw-play/pw-record</flag>
<flag name="flatpak">Enable Flatpak support</flag>
<flag name="jack-client">Install a plugin for running PipeWire as a JACK client</flag>
<flag name="jack-sdk">Use PipeWire as JACK replacement</flag>
<flag name="lv2">Allow loading LV2 plugins via <pkg>media-libs/lv2</pkg></flag>
<flag name="pipewire-alsa">Replace PulseAudio's ALSA plugin with PipeWire's plugin</flag>
<flag name="ssl">Enable raop-sink support (needs <pkg>dev-libs/openssl</pkg>)</flag>
<flag name="system-service">Install systemd unit files for running as a system service. Not recommended.</flag>
<flag name="X">Enable audible bell for X11</flag>
<flag name="sound-server">Provide sound server using ALSA and bluetooth devices</flag>
</use>
</pkgmetadata>

View File

@ -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 <youruser>"
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 <application> 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
}

View File

@ -0,0 +1 @@
DIST wireplumber-0.4.10.tar.gz 395588 BLAKE2B 6df1af17d1e53ab1449a2f6f9af5a0c4f7b1cd981e07556e5ea3c6b4d5d624e66b97ce4f945f7ccccebbf72b75d35d10990fac11b5228275f27e5320885ff1ec SHA512 342e8bba2cf00faab71ef39bb361b5ada66ff3a68ccf7a756ea1ca402da6e94784eece277ca02992bc7573c51cb8b1bad33aa9c593b3d1bfe0bb0286e2f4506f

View File

@ -0,0 +1,117 @@
https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/c00c5a6675b6640db13111c808eaa3251917c412
From c00c5a6675b6640db13111c808eaa3251917c412 Mon Sep 17 00:00:00 2001
From: Julian Bouzas <julian.bouzas@collabora.com>
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

View File

@ -0,0 +1,26 @@
commit 3d86f51d2c43fd76be2450a8c27836fdd8619cfa
Author: Igor V. Kovalenko <igor.v.kovalenko@gmail.com>
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

View File

@ -0,0 +1,129 @@
https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/1f045309208ab5d927883b5adc2b7d1623fae162
From 1f045309208ab5d927883b5adc2b7d1623fae162 Mon Sep 17 00:00:00 2001
From: George Kiagiadakis <george.kiagiadakis@collabora.com>
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

View File

@ -0,0 +1,187 @@
https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/392cce2136e81ac3146078eacbbae85b694c917a
From 392cce2136e81ac3146078eacbbae85b694c917a Mon Sep 17 00:00:00 2001
From: Julian Bouzas <julian.bouzas@collabora.com>
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

View File

@ -0,0 +1,36 @@
https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/c2f31bb550755acba31da2e9f5bbdf646ed5e805
From c2f31bb550755acba31da2e9f5bbdf646ed5e805 Mon Sep 17 00:00:00 2001
From: Julian Bouzas <julian.bouzas@collabora.com>
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

View File

@ -0,0 +1,32 @@
https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/7908b8d7be2a2992c57cd549054eda7ce46e4b44
From 13b85bd4a25ab374f5e5e90b7288e6987996856e Mon Sep 17 00:00:00 2001
From: Michael Olbrich <m.olbrich@pengutronix.de>
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

View File

@ -0,0 +1,33 @@
https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/c16e637c329bc9dda8544b18f5bd47a8d63ee253
From c16e637c329bc9dda8544b18f5bd47a8d63ee253 Mon Sep 17 00:00:00 2001
From: George Kiagiadakis <george.kiagiadakis@collabora.com>
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

View File

@ -0,0 +1,45 @@
https://gitlab.freedesktop.org/pipewire/wireplumber/-/commit/eb406bdb2cbbcd49c55c71285f8f2eddb624d24b
From eb406bdb2cbbcd49c55c71285f8f2eddb624d24b Mon Sep 17 00:00:00 2001
From: George Kiagiadakis <george.kiagiadakis@collabora.com>
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

View File

@ -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 <pav@iki.fi>
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 <pav@iki.fi>
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

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<maintainer type="person">
<email>sam@gentoo.org</email>
<name>Sam James</name>
</maintainer>
<upstream>
<bugs-to>https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues</bugs-to>
<changelog>https://gitlab.freedesktop.org/pipewire/wireplumber/-/releases</changelog>
<!--doc>https://gitlab.freedesktop.org/pipewire/wireplumber/-/wikis/home</doc-->
</upstream>
<use>
<flag name="system-service">Install systemd unit files for running as a system service. Not recommended.</flag>
</use>
</pkgmetadata>

View File

@ -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/<NAME>[${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
}

View File

@ -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

View File

@ -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